在CentOS上配置Nginx+Gunicorn+Python+Flask环境的教程


Posted in Python onJune 07, 2016

Python基础环境搭建
CENTOS 6.X 系列默认安装的 Python 2.6 ,目前开发中主要是使用 Python 2.7 ,这两个版本之间还是有不少差异的,程序在 Python 2.6 下经常会出问题。

比如: re.sub 函数 ,2.7 支持 flags 参数,而 2.6 却不支持。

所以,打算安装 Python 2.7 来运行 Flask 应用程序,但 2.6 不能删除,因为系统对它有依赖。

1、安装 sqlite-devel
因为 Flask 应用程序可能使用能 Sqlite 数据库,所以这个得装上(之前因为没装这个,导致 Python 无法导入 sqlite3 库。
当然,也可以从源码编译安装。

yum install sqlite-devel -y

2、安装 Python 2.7

wget https://www.python.org/ftp/python/2.7.8/Python-2.7.8.tgz
tar xf Python-2.7.8.tgz
cd Python-2.7.8
./configure --prefix=/usr/local
make && make install

安装成功之后,你可以在 /usr/local/bin/python2.7 找到 Python 2.7。

3、安装 setuptools + pip
这里需要注意,一定要使用 python2.7 来执行相关命令。

# First get the setup script for Setuptools:
wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py

# Then install it for Python 2.7 :
python2.7 ez_setup.py

# Now install pip using the newly installed setuptools:
easy_install-2.7 pip

# With pip installed you can now do things like this:
pip2.7 install [packagename]
pip2.7 install --upgrade [packagename]
pip2.7 uninstall [packagename]

4、使用 virtualenv

# Install virtualenv for Python 2.7 and create a sandbox called my27project:
pip2.7 install virtualenv
virtualenv-2.7 my27project

# Check the system Python interpreter version:
python --version
# This will show Python 2.6.6

# Activate the my27project sandbox and check the version of the default Python interpreter in it:
source my27project/bin/activate
python --version
# This will show Python 2.7.X
deactivate

基本就是这些了,网上很多教程都说要做软链接,但我感觉那样做或多或少会对系统有一些未知的影响。这个方法能尽量保持系统的完整性,很多自带 Python 程序其实在头部都指定了 #!/usr/bin/python ,所以它们用的其实是 Python 2.6 ,而不是新安装的 Python 2.7 。

Nginx+Supervisor+Gunicorn部署Flask应用程序

1.安装supervisor

$ sudo pip install supervisor

创建一个Flask程序
创建虚拟环境:

$ mkdir /tmp/wwwroot/web1
$ cd /tmp/wwwroot/web1
$ virtualenv deps
$ source deps/bin/activate
$ pip install flask gunicorn

创建一个简单的Flask程序:

$ cat > myapp.py << EOF
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
  return "hello flask 01"

使用gunicorn执行Flask程序:

最简单的用法:

$ gunicorn -b 127.0.0.1:3721 myapp:app

现在访问http://127.0.0.1:3721,应该可以看到"hello flask 01"。

这里3721端口只是一个演示。

2.配置supervisor
创建配置文件:

$ cd /tmp/wwwroot
$ echo_supervisord_conf > supervisor.conf
$ cat >> supervisor.conf << EOF
[program:myapp]
;user=digwtx
command=/tmp/wwwroot/web1/deps/bin/gunicorn -b 127.0.0.1:3721 myapp:app
directory=/tmp/wwwroot/web1
process_name=%(program_name)s ; process_name expr (default %(program_name)s)
numprocs=1          ; number of processes copies to start (def 1)
stopsignal=QUIT        ; signal used to kill process (default TERM)
redirect_stderr=true     ; redirect proc stderr to stdout (default false)
stdout_logfile=/tmp/myapp.log    ; stdout log path, NONE for none; default AUTO

启动进程:

$ supervisord -c supervisor.conf

管理进程:

$ supervisorctl -c supervisor.conf

3.配置nginx:
主要是把请求转交给gunicorn进行处理。

server {
  listen 8080;
  #默认请求
  location / {
  #请求转向本机ip:3721
    proxy_pass http://127.0.0.1:3721; # 这里是gunicorn监听的地址
    proxy_redirect off;
    proxy_set_header Host $host:8080; #如果端口不是80要写上
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}

现在重启nginx,访问http://127.0.0.1:8080应该可以看到"hello flask 01"。

自动启动:
那么,如果想开机时自动启动怎么办呢?或者说,如果机器重启了,那WEB服务就断了。

其实呢,也很简单,只要在/etc/rc.d/rc.local中加入一句就可以了:

supervisord -c /tmp/wwwroot/supervisor.conf
Python 相关文章推荐
python数据结构之二叉树的建立实例
Apr 29 Python
Python UnicodeEncodeError: 'gbk' codec can't encode character 解决方法
Apr 24 Python
windows下Python实现将pdf文件转化为png格式图片的方法
Jul 21 Python
Python使用pymongo模块操作MongoDB的方法示例
Jul 20 Python
PyTorch基本数据类型(一)
May 22 Python
python 计算平均平方误差(MSE)的实例
Jun 29 Python
python将字母转化为数字实例方法
Oct 04 Python
python实现输入任意一个大写字母生成金字塔的示例
Oct 27 Python
Win10里python3创建虚拟环境的步骤
Jan 31 Python
Python基于jieba, wordcloud库生成中文词云
May 13 Python
Python如何用re模块实现简易tokenizer
May 02 Python
python神经网络学习 使用Keras进行回归运算
May 04 Python
Windows上使用virtualenv搭建Python+Flask开发环境
Jun 07 #Python
在Python的Flask中使用WTForms表单框架的基础教程
Jun 07 #Python
详解Python的Flask框架中生成SECRET_KEY密钥的方法
Jun 07 #Python
Python的Flask框架中配置多个子域名的方法讲解
Jun 07 #Python
python3批量删除豆瓣分组下的好友的实现代码
Jun 07 #Python
python实现多线程的方式及多条命令并发执行
Jun 07 #Python
python多线程方式执行多个bat代码
Jun 07 #Python
You might like
sourcesafe管理phpproj文件的补充说明(downmoon)
2009/04/11 PHP
解析PHP提交后跳转
2013/06/23 PHP
PHP面试题之文件目录操作
2015/10/15 PHP
php封装单文件上传到数据库(路径)
2017/10/15 PHP
js精准的倒计时函数分享
2016/06/29 Javascript
Nodejs进阶:核心模块net入门学习与实例讲解
2016/11/21 NodeJs
半个小时学json(json传递示例)
2016/12/25 Javascript
微信小程序 石头剪刀布实例代码
2017/01/04 Javascript
angularjs实现猜数字大小功能
2020/05/20 Javascript
基于vue2.0实现简单轮播图
2017/11/27 Javascript
vue 内置过滤器的使用总结(附加自定义过滤器)
2018/12/11 Javascript
Vue中多个元素、组件的过渡及列表过渡的方法示例
2019/02/13 Javascript
微信小程序new Date()方法失效问题解决方法
2019/07/29 Javascript
Vue组件间的通信pubsub-js实现步骤解析
2020/03/11 Javascript
javascript实现评分功能
2020/06/24 Javascript
JavaScript canvas实现雨滴特效
2021/01/10 Javascript
[03:49]显微镜下的DOTA2第十五期—VG登基之路完美团
2014/06/24 DOTA
[01:02:20]Mineski vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
决策树的python实现方法
2014/11/18 Python
Python实现方便使用的级联进度信息实例
2015/05/05 Python
python检查URL是否正常访问的小技巧
2017/02/25 Python
python中文分词教程之前向最大正向匹配算法详解
2017/11/02 Python
Django url,从一个页面调到另个页面的方法
2019/08/21 Python
python 实现任务管理清单案例
2020/04/25 Python
Python使用socketServer包搭建简易服务器过程详解
2020/06/12 Python
Python如何使用input函数获取输入
2020/08/06 Python
英国优质家居用品网上品牌:URBANARA
2018/06/01 全球购物
自我鉴定三原则
2014/01/13 职场文书
《狼和小羊》教学反思
2014/04/20 职场文书
论文指导教师评语
2014/04/28 职场文书
高中班级口号
2014/06/09 职场文书
民政局办理协议离婚(范本)
2014/10/25 职场文书
卖房协议书样本
2014/10/30 职场文书
开平碉楼导游词
2015/02/06 职场文书
MyBatis-Plus 批量插入数据的操作方法
2021/09/25 Java/Android
详细介绍Next.js脚手架完整搭建封装
2022/04/26 Javascript