在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 相关文章推荐
Python3读取文件常用方法实例分析
May 22 Python
Python中unittest模块做UT(单元测试)使用实例
Jun 12 Python
pandas中Timestamp类用法详解
Dec 11 Python
解决Pandas to_json()中文乱码,转化为json数组的问题
May 10 Python
Python根据文件名批量转移图片的方法
Oct 21 Python
Python实现带参数的用户验证功能装饰器示例
Dec 14 Python
python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形)
May 30 Python
wxPython修改文本框颜色过程解析
Feb 14 Python
python 装饰器功能与用法案例详解
Mar 06 Python
python爬虫构建代理ip池抓取数据库的示例代码
Sep 22 Python
Python3读写ini配置文件的示例
Nov 06 Python
python和C/C++混合编程之使用ctypes调用 C/C++的dll
Apr 29 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
PHP4和PHP5共存于一系统
2006/11/17 PHP
PHP语言中global和$GLOBALS[]的分析 之二
2012/02/02 PHP
基于jquery的一个OutlookBar类,动态创建导航条
2010/11/19 Javascript
jQuery学习笔记 操作jQuery对象 文档处理
2012/09/19 Javascript
js中的hasOwnProperty和isPrototypeOf方法使用实例
2014/06/06 Javascript
js实现单击图片放大图片的方法
2015/02/17 Javascript
IE9+已经不对document.createElement向下兼容的解决方法
2015/09/14 Javascript
JavaScript高级程序设计(第三版)学习笔记1~5章
2016/03/11 Javascript
JS判断图片是否加载完成方法汇总(最新版)
2016/05/13 Javascript
javascript 广告移动特效的实现代码
2016/06/25 Javascript
JS实现鼠标滑过显示边框的菜单效果
2016/09/21 Javascript
用move.js库实现百叶窗特效
2017/02/08 Javascript
解决vue2.x中数据渲染以及vuex缓存的问题
2017/07/13 Javascript
快速处理vue渲染前的显示问题
2018/03/05 Javascript
Vue中的异步组件函数实现代码
2018/07/20 Javascript
AngularJS自定义表单验证功能实例详解
2018/08/24 Javascript
解决vue中使用proxy配置不同端口和ip接口问题
2019/08/14 Javascript
js 函数性能比较方法
2020/08/24 Javascript
[07:52]2014DOTA2 TI逗比武士游V社解说背后的故事
2014/07/10 DOTA
[01:11:48]Fnatic vs IG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
python 实现归并排序算法
2012/06/05 Python
python操作日期和时间的方法
2014/03/11 Python
python中私有函数调用方法解密
2016/04/29 Python
Python数据结构与算法之列表(链表,linked list)简单实现
2017/10/30 Python
Django csrf 两种方法设置form的实例
2019/02/03 Python
pycharm编写spark程序,导入pyspark包的3中实现方法
2019/08/02 Python
深度学习入门之Pytorch 数据增强的实现
2020/02/26 Python
html5设计原理(推荐收藏)
2014/05/17 HTML / CSS
ebookers英国:隶属全球最大的在线旅游公司Expedia
2017/12/28 全球购物
如何实现jdbc性能优化
2012/07/30 面试题
档案室主任岗位职责
2014/02/12 职场文书
公司中层干部的自我评价分享
2014/03/01 职场文书
2014年银行信贷员工作总结
2014/12/08 职场文书
2019年大学推荐信
2019/06/24 职场文书
Html5通过数据流方式播放视频的实现
2021/04/27 HTML / CSS
解决使用了nginx获取IP地址都是127.0.0.1 的问题
2021/09/25 Servers