在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下读取公私钥做加解密实例详解
Mar 29 Python
python实现各进制转换的总结大全
Jun 18 Python
Python编程产生非均匀随机数的几种方法代码分享
Dec 13 Python
Python机器学习库scikit-learn安装与基本使用教程
Jun 25 Python
在Python中分别打印列表中的每一个元素方法
Nov 07 Python
Python面向对象之类和实例用法分析
Jun 08 Python
python的re模块使用方法详解
Jul 26 Python
nginx黑名单和django限速,最简单的防恶意请求方法分享
Aug 09 Python
python 字段拆分详解
Dec 17 Python
Python环境配置实现pip加速过程解析
Nov 27 Python
Python命令行参数argv和argparse该如何使用
Feb 08 Python
分享几种python 变量合并方法
Mar 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 图像尺寸调整代码
2010/05/26 PHP
解析dedeCMS验证码的实现代码
2013/06/07 PHP
php fsockopen解决办法 php实现多线程
2014/01/20 PHP
PHP获取中英混合字符串长度的方法
2014/06/07 PHP
PHP5.3新特性小结
2016/02/14 PHP
深入理解php printf() 输出格式化的字符串
2016/05/23 PHP
phpmyadmin下载、安装、配置教程
2017/05/16 PHP
脚本吧 - 幻宇工作室用到js,超强推荐base.js
2006/12/23 Javascript
js如何获取兄弟、父类等节点
2014/01/06 Javascript
jq实现酷炫的鼠标经过图片翻滚效果
2014/03/12 Javascript
jQuery 插件开发指南
2014/11/14 Javascript
AngularJS HTML编译器介绍
2014/12/06 Javascript
jQuery实现的超链接提示效果示例【附demo源码下载】
2016/09/09 Javascript
Jquery中.bind()、.live()、.delegate()和.on()之间的区别详解
2017/08/01 jQuery
浅谈vue中改elementUI默认样式引发的static与assets的区别
2018/02/03 Javascript
浅谈vue中.vue文件解析流程
2018/04/24 Javascript
Node.js 多进程处理CPU密集任务的实现
2019/05/26 Javascript
JS判断数组是否包含某元素实现方法汇总
2020/06/24 Javascript
Python设计模式之抽象工厂模式
2016/08/25 Python
python简单商城购物车实例代码
2018/03/15 Python
解决tensorflow测试模型时NotFoundError错误的问题
2018/07/27 Python
Python3爬虫使用Fidder实现APP爬取示例
2018/11/27 Python
对python修改xml文件的节点值方法详解
2018/12/24 Python
django中上传图片分页三级联动效果的实现代码
2019/08/30 Python
Django集成celery发送异步邮件实例
2019/12/17 Python
Django如何使用jwt获取用户信息
2020/04/21 Python
Python paramiko使用方法代码汇总
2020/11/20 Python
Python Socket多线程并发原理及实现
2020/12/11 Python
函授毕业生自我鉴定
2013/11/06 职场文书
写演讲稿要注意的六件事
2014/01/14 职场文书
市场营销管理毕业生自荐信
2014/03/03 职场文书
党建示范点实施方案
2014/03/12 职场文书
党风廉设责任书
2014/04/16 职场文书
高中校园广播稿3篇
2014/09/29 职场文书
小学感恩节活动策划方案
2014/10/06 职场文书
Win11怎么添加用户?Win11添加用户账户的方法
2022/07/15 数码科技