在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实现对PPT文件进行截图操作的方法
Apr 28 Python
Python计算一个文件里字数的方法
Jun 15 Python
Python爬取qq music中的音乐url及批量下载
Mar 23 Python
使用python 和 lint 删除项目无用资源的方法
Dec 20 Python
详谈python3中用for循环删除列表中元素的坑
Apr 19 Python
儿童python练习实例
May 27 Python
python 读写文件,按行修改文件的方法
Jul 12 Python
python制作简单五子棋游戏
Jun 18 Python
pytorch实现对输入超过三通道的数据进行训练
Jan 15 Python
python实现堆排序的实例讲解
Feb 21 Python
python应用Axes3D绘图(批量梯度下降算法)
Mar 25 Python
Python3压缩和解压缩实现代码
Mar 01 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 远程关机操作的代码
2008/12/05 PHP
PHP邮件发送类PHPMailer用法实例详解
2014/09/22 PHP
分享PHP函数实现数字与文字分页代码
2015/07/28 PHP
PHP数字前补0的自带函数sprintf 和number_format的用法(详解)
2017/02/06 PHP
Laravel模型间关系设置分表的方法示例
2018/04/21 PHP
js利用与或运算符优先级实现if else条件判断表达式
2010/04/15 Javascript
监控 url fragment变化的js代码
2010/04/19 Javascript
JavaScript中的匀速运动和变速(缓冲)运动详细介绍
2012/11/11 Javascript
Tab切换组件(选项卡功能)实例代码
2013/11/21 Javascript
jquery中交替点击事件的实现代码
2014/02/14 Javascript
简介JavaScript中toUpperCase()方法的使用
2015/06/06 Javascript
js中unicode转码方法详解
2015/10/09 Javascript
jquery跟随屏幕滚动效果的实现代码
2016/04/13 Javascript
Vue 2.0学习笔记之Vue中的computed属性
2017/10/16 Javascript
vue使用Element组件时v-for循环里的表单项验证方法
2018/06/28 Javascript
layer.open弹层查看缩略图的原图,自适应大小的实例
2019/09/05 Javascript
Vue事件处理原理及过程详解
2020/03/11 Javascript
vue+iview分页组件的封装
2020/11/17 Vue.js
k8s node节点重新加入master集群的实现
2021/02/22 Javascript
Python采用raw_input读取输入值的方法
2014/08/18 Python
Python实现判断一个字符串是否包含子串的方法总结
2017/11/21 Python
关于python多重赋值的小问题
2019/04/17 Python
python实现输入的数据在地图上生成热力图效果
2019/12/06 Python
ITK 实现多张图像转成单个nii.gz或mha文件案例
2020/07/01 Python
html5启动原生APP总结
2020/07/03 HTML / CSS
伦敦平价潮流珠宝首饰品牌:Astrid & Miyu
2016/10/10 全球购物
Microsoft Advertising美国:微软搜索广告
2019/05/01 全球购物
LINUX下线程,GDI类的解释
2012/04/17 面试题
教师申诉制度
2014/01/29 职场文书
省优秀教师事迹材料
2014/01/30 职场文书
室内拓展活动方案
2014/02/13 职场文书
《周恩来的四个昼夜》观后思想汇报范文两篇
2014/09/10 职场文书
校园主题婚礼活动策划方案
2014/09/15 职场文书
军训新闻稿范文
2015/07/17 职场文书
《和时间赛跑》读后感3篇
2019/12/16 职场文书
JS前端使用Canvas快速实现手势解锁特效
2022/09/23 Javascript