在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循环语句
Nov 20 Python
浅谈flask截获所有访问及before/after_request修饰器
Jan 18 Python
python3基于OpenCV实现证件照背景替换
Jul 18 Python
python 统计一个列表当中的每一个元素出现了多少次的方法
Nov 14 Python
Python中的相关分析correlation analysis的实现
Aug 29 Python
win10安装tensorflow-gpu1.8.0详细完整步骤
Jan 20 Python
python GUI库图形界面开发之PyQt5窗口背景与不规则窗口实例
Feb 25 Python
使用keras实现Precise, Recall, F1-socre方式
Jun 15 Python
Python基于staticmethod装饰器标示静态方法
Oct 17 Python
解决tensorflow模型压缩的问题_踩坑无数,总算搞定
Mar 02 Python
利用Matlab绘制各类特殊图形的实例代码
Jul 16 Python
python playwright之元素定位示例详解
Jul 23 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
模仿OSO的论坛(三)
2006/10/09 PHP
让PHP开发者事半功倍的十大技巧小结
2010/04/20 PHP
php获取$_POST同名参数数组的实现介绍
2013/06/30 PHP
php脚本运行时的超时机制详解
2016/02/17 PHP
php基于jquery的ajax技术传递json数据简单实例
2016/04/15 PHP
php封装的smarty类完整实例
2016/10/19 PHP
javascript整除实现代码
2010/11/23 Javascript
简单的Jquery遮罩层代码实例
2013/11/14 Javascript
JavaScript中的console.group()函数详细介绍
2014/12/29 Javascript
jQuery检测某个元素是否存在代码分享
2015/07/09 Javascript
JavaScript中常见的八个陷阱总结
2017/06/28 Javascript
vuejs手把手教你写一个完整的购物车实例代码
2017/07/06 Javascript
Webpack性能优化 DLL 用法详解
2017/08/10 Javascript
小程序红包雨的实现示例
2019/02/19 Javascript
layui导出所有数据的例子
2019/09/10 Javascript
vue 动态添加class,三个以上的条件做判断方式
2020/11/02 Javascript
python实现登陆知乎获得个人收藏并保存为word文件
2015/03/16 Python
举例讲解Python面向对象编程中类的继承
2016/06/17 Python
python解决网站的反爬虫策略总结
2016/10/26 Python
Python开发的HTTP库requests详解
2017/08/29 Python
Python爬虫框架scrapy实现downloader_middleware设置proxy代理功能示例
2018/08/04 Python
Python从ZabbixAPI获取信息及实现Zabbix-API 监控的方法
2018/09/17 Python
python+opencv实现高斯平滑滤波
2020/07/21 Python
浅谈keras2 predict和fit_generator的坑
2020/06/17 Python
python从PDF中提取数据的示例
2020/10/30 Python
二年级体育教学反思
2014/01/15 职场文书
开工仪式主持词
2014/03/20 职场文书
环卫工人先进事迹材料
2014/06/02 职场文书
仲裁协议书
2014/09/26 职场文书
2014年质检工作总结
2014/11/26 职场文书
道歉信范文
2015/05/12 职场文书
2016元旦主持人经典开场白台词
2015/12/03 职场文书
《正比例》教学反思
2016/02/23 职场文书
Python实现socket库网络通信套接字
2021/06/04 Python
Java字符缓冲流BufferedWriter
2022/04/09 Java/Android
Python Matplotlib绘制等高线图与渐变色扇形图
2022/04/14 Python