在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 常用 PEP8 编码规范详解
Jan 22 Python
python中print()函数的“,”与java中System.out.print()函数中的“+”功能详解
Nov 24 Python
浅谈numpy数组的几种排序方式
Dec 15 Python
python实现log日志的示例代码
Apr 28 Python
python之super的使用小结
Aug 13 Python
python3 小数位的四舍五入(用两种方法解决round 遇5不进)
Apr 11 Python
对Python的交互模式和直接运行.py文件的区别详解
Jun 29 Python
python 计算概率密度、累计分布、逆函数的例子
Feb 25 Python
opencv 阈值分割的具体使用
Jul 08 Python
python小技巧——将变量保存在本地及读取
Nov 13 Python
如何在 Matplotlib 中更改绘图背景的实现
Nov 26 Python
看看如何用Python绘制小米新版天价logo
Apr 20 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对象Object的概念 介绍
2012/06/14 PHP
PHP开发工具ZendStudio下Xdebug工具使用说明详解
2013/11/11 PHP
PHP采集类Snoopy抓取图片实例
2014/06/19 PHP
php的mssql数据库连接类实例
2014/11/28 PHP
对PHP PDO的一些认识小结
2015/01/23 PHP
php实现微信公众平台账号自定义菜单类
2015/10/11 PHP
PHP学习笔记之php文件操作
2016/06/03 PHP
php高性能日志系统 seaslog 的安装与使用方法分析
2020/02/29 PHP
jquery中获得$.ajax()事件返回的值并添加事件的方法
2010/04/15 Javascript
JQuery触发radio或checkbox的change事件
2012/12/18 Javascript
js 弹出虚拟键盘修改密码的简单实例
2016/10/10 Javascript
JS+Canvas实现的俄罗斯方块游戏完整实例
2016/12/12 Javascript
Angular在一个页面中使用两个ng-app的方法(二)
2017/02/20 Javascript
Vue.js结合bootstrap实现分页控件
2017/03/10 Javascript
如何使用bootstrap框架 bootstrap入门必看!
2017/04/13 Javascript
nodejs发送http请求时遇到404长时间未响应的解决方法
2017/12/10 NodeJs
vuex与组件联合使用的方法
2018/05/10 Javascript
Electron 如何调用本地模块的方法
2019/02/01 Javascript
微信小程序访问豆瓣电影api的实现方法
2019/03/31 Javascript
vue cli 3.x 项目部署到 github pages的方法
2019/04/17 Javascript
JavaScript中的垃圾回收与内存泄漏示例详解
2019/05/02 Javascript
javascript实现计算器功能
2020/03/30 Javascript
Python多线程扫描端口代码示例
2018/02/09 Python
Python使用cx_Oracle模块操作Oracle数据库详解
2018/05/07 Python
更新升级python和pip版本后不生效的问题解决
2020/04/17 Python
Python控制台实现交互式环境执行
2020/06/09 Python
python入门:argparse浅析 nargs='+'作用
2020/07/12 Python
Django项目创建及管理实现流程详解
2020/10/13 Python
PyChon中关于Jekins的详细安装(推荐)
2020/12/28 Python
HTML5应用之文件上传
2016/12/30 HTML / CSS
犹他州最古老的体育用品公司:Al’s
2020/12/18 全球购物
工商治理实习生的自我评价
2014/01/15 职场文书
中文专业学生自我评价范文
2014/02/06 职场文书
吸烟检讨书2000字
2014/02/13 职场文书
2015年药店店长工作总结
2015/04/29 职场文书
年中了,该如何写好个人述职报告?
2019/07/02 职场文书