在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网络编程学习笔记(四):域名系统
Jun 09 Python
Python自定义线程池实现方法分析
Feb 07 Python
Request的中断和ErrorHandler实例解析
Feb 12 Python
使用pip发布Python程序的方法步骤
Oct 11 Python
详解django自定义中间件处理
Nov 21 Python
Python图像处理之图像的缩放、旋转与翻转实现方法示例
Jan 04 Python
pandas DataFrame 交集并集补集的实现
Jun 24 Python
pytorch 图像中的数据预处理和批标准化实例
Jan 15 Python
利用setuptools打包python程序的方法步骤
Jan 18 Python
Python networkx包的实现
Feb 14 Python
Python自动化测试基础必备知识点总结
Feb 07 Python
Python GUI编程之tkinter 关于 ttkbootstrap 的使用详解
Mar 03 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
PHP获取用户的浏览器与操作系统信息的代码
2012/09/04 PHP
基于GD2图形库的PHP生成图片缩略图类代码分享
2015/02/08 PHP
javascript+php实现根据用户时区显示当地时间的方法
2015/03/11 PHP
php表单文件iframe异步上传实例讲解
2017/07/26 PHP
js的event详解。
2006/09/06 Javascript
Mootools 1.2 手风琴(Accordion)教程
2009/09/15 Javascript
Jquery ajax执行顺序 返回自定义错误信息(实例讲解)
2013/11/06 Javascript
不到30行JS代码实现Excel表格的方法
2014/11/15 Javascript
node爬取微博的数据的简单封装库nodeweibo使用指南
2015/01/02 Javascript
JS在onclientclick里如何控制onclick的执行
2016/05/30 Javascript
JS中使用FormData上传文件、图片的方法
2016/08/07 Javascript
jquery实现刷新随机变化样式特效(tag标签样式)
2017/02/03 Javascript
js实现tab切换效果
2017/02/16 Javascript
Angular.Js之Scope作用域的学习教程
2017/04/27 Javascript
jQuery制作input提示内容(兼容IE8以上)
2017/07/05 jQuery
使用jQuery实现动态添加小广告
2017/07/11 jQuery
vue 过滤器filter实例详解
2018/03/14 Javascript
JS简单实现动态添加HTML标记的方法示例
2018/04/08 Javascript
JS继承定义与使用方法简单示例
2020/02/19 Javascript
[02:39]我与DAC之Newbee.Moogy:从论坛到TI
2018/03/26 DOTA
详解Python3.1版本带来的核心变化
2015/04/07 Python
基于python的Tkinter实现一个简易计算器
2015/12/31 Python
python迭代dict的key和value的方法
2018/07/06 Python
python3 flask实现文件上传功能
2020/03/20 Python
基于python plotly交互式图表大全
2019/12/07 Python
python上selenium的弹框操作实现
2020/07/13 Python
Matplotlib 折线图plot()所有用法详解
2020/07/28 Python
Python 如何实现数据库表结构同步
2020/09/29 Python
几款Python编译器比较与推荐(小结)
2020/10/15 Python
Python3+Flask安装使用教程详解
2021/02/16 Python
HTML5图片层叠的实现示例
2020/07/07 HTML / CSS
大专毕业生简历的自我评价
2013/10/20 职场文书
简单的辞职信怎么写
2015/02/28 职场文书
2015年乡镇统计工作总结
2015/04/22 职场文书
优秀志愿者感言
2015/08/01 职场文书
mysql部分操作
2021/04/05 MySQL