在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通过线程实现定时器timer的方法
Mar 16 Python
python UNIX_TIMESTAMP时间处理方法分析
Apr 18 Python
python3中dict(字典)的使用方法示例
Mar 22 Python
Python基于Matplotlib库简单绘制折线图的方法示例
Aug 14 Python
Python矩阵常见运算操作实例总结
Sep 29 Python
python3+PyQt5自定义视图详解
Apr 24 Python
Python3 利用requests 库进行post携带账号密码请求数据的方法
Oct 26 Python
Python项目 基于Scapy实现SYN泛洪攻击的方法
Jul 23 Python
Python环境配置实现pip加速过程解析
Nov 27 Python
python爬不同图片分别保存在不同文件夹中的实现
Apr 02 Python
python实现自定义日志的具体方法
May 28 Python
Python 中random 库的详细使用
Jun 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
浅析Mysql 数据回滚错误的解决方法
2013/08/05 PHP
php实现递归的三种基本方式
2020/07/04 PHP
php 无限分类 树形数据格式化代码
2016/10/11 PHP
详解Laravel5.6 Passport实现Api接口认证
2018/07/27 PHP
PHP7创建COOKIE和销毁COOKIE的实例方法
2020/02/03 PHP
JavaScript 10件让人费解的事情
2010/02/15 Javascript
Javascript 面向对象之重载
2010/05/04 Javascript
仿百度的关键词匹配搜索示例
2013/09/25 Javascript
禁止页面刷新让F5快捷键及右键都无效
2014/01/22 Javascript
JQuery动画animate的stop方法使用详解
2014/05/09 Javascript
javascript自定义右键弹出菜单实现方法
2015/05/25 Javascript
javascript中html字符串转化为jquery dom对象的方法
2015/08/27 Javascript
JS实现漂亮的淡蓝色滑动门效果代码
2015/09/23 Javascript
jQuery插件实现无缝滚动特效
2015/11/24 Javascript
JSONP原理及简单实现
2016/06/08 Javascript
JS判断是否手机或pad访问实现方法
2016/12/09 Javascript
集成vue到jquery/bootstrap项目的方法
2018/02/10 jQuery
学习Vue组件实例
2018/04/28 Javascript
vue实现登录页面的验证码以及验证过程解析(面向新手)
2019/08/02 Javascript
Python入门篇之文件
2014/10/20 Python
Python爬虫设置代理IP的方法(爬虫技巧)
2018/03/04 Python
python批量替换多文件字符串问题详解
2018/04/22 Python
异步任务队列Celery在Django中的使用方法
2018/06/07 Python
使用Python编写Prometheus监控的方法
2018/10/15 Python
python在TXT文件中按照某一字符串取出该字符串所在的行方法
2018/12/10 Python
Python基于execjs运行js过程解析
2020/11/27 Python
德国汉莎航空中国官网: Lufthansa中国
2017/03/30 全球购物
会计电算化专业毕业生推荐信
2013/12/24 职场文书
年终奖发放方案
2014/06/02 职场文书
车辆工程专业求职信
2014/06/14 职场文书
报表员工作失误检讨书范文
2014/09/19 职场文书
物业管理委托协议(2篇)
2014/09/23 职场文书
呼兰河传读书笔记
2015/06/30 职场文书
《去年的树》教学反思
2016/02/18 职场文书
2019年浪漫婚礼证婚词
2019/06/27 职场文书
SQL Server查询某个字段在哪些表中存在
2022/03/03 SQL Server