在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 BeautifulSoup库抓取58手机维修信息
Nov 21 Python
python实现的解析crontab配置文件代码
Jun 30 Python
python用Pygal如何生成漂亮的SVG图像详解
Feb 10 Python
Python利用字典将两个通讯录文本合并为一个文本实例
Jan 16 Python
Python实现将照片变成卡通图片的方法【基于opencv】
Jan 17 Python
pycharm 在windows上编辑代码用linux执行配置的方法
Oct 27 Python
pandas修改DataFrame列名的实现方法
Feb 22 Python
python中如何使用分步式进程计算详解
Mar 22 Python
Django如何实现上传图片功能
Aug 16 Python
python集合删除多种方法详解
Feb 10 Python
python库skimage给灰度图像染色的方法示例
Apr 27 Python
Python 操作pdf pdfplumber读取PDF写入Exce
Aug 14 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
批量获取memcache值并按key的顺序返回的实现代码
2011/06/14 PHP
php中通过数组进行高效随机抽取指定条记录的算法
2013/09/09 PHP
php保存二进制原始数据为图片的程序代码
2014/10/14 PHP
Laravel使用Caching缓存数据减轻数据库查询压力的方法
2016/03/15 PHP
详解PHP中的外观模式facade pattern
2018/02/05 PHP
PHP有序表查找之二分查找(折半查找)算法示例
2018/02/09 PHP
PHP实现递归的三种方法
2020/07/04 PHP
Using the TextRange Object
2006/10/14 Javascript
onclick与listeners的执行先后问题详细解剖
2013/01/07 Javascript
ajax请求get与post的区别总结
2013/11/04 Javascript
jQuery+ajax实现鼠标单击修改内容的方法
2014/06/27 Javascript
javascript记录文本框内文字个数检测文字个数变化
2014/10/14 Javascript
javascript将url中的参数加密解密代码
2014/11/17 Javascript
jQuery中animate()方法用法实例
2014/12/24 Javascript
jQuery中triggerHandler()方法用法实例
2015/01/19 Javascript
jQuery层级选择器用法分析
2015/02/10 Javascript
一道常被人轻视的web前端常见面试题(JS)
2016/02/15 Javascript
jQuery添加options点击事件并传值实例代码
2016/05/18 Javascript
利用Node.js制作爬取大众点评的爬虫
2016/09/22 Javascript
如何判断出一个js对象是否一个dom对象
2016/11/24 Javascript
angular.JS实现网页禁用调试、复制和剪切
2017/03/31 Javascript
jQuery Position方法使用和兼容性
2017/08/23 jQuery
JavaScript复制内容到剪贴板的两种常用方法
2018/02/27 Javascript
浅谈JavaScript中的“!!”作用
2020/08/03 Javascript
使用Django和Python创建Json response的方法
2018/03/26 Python
Django中使用CORS实现跨域请求过程解析
2019/08/05 Python
numpy ndarray 取出满足特定条件的某些行实例
2019/12/05 Python
浅谈keras使用预训练模型vgg16分类,损失和准确度不变
2020/07/02 Python
CSS3实现文字描边的2种方法(小结)
2020/02/14 HTML / CSS
波兰在线香水店:Perfumy.pl
2019/08/12 全球购物
Lookfantastic澳大利亚官网:英国知名美妆购物网站
2021/01/07 全球购物
优秀部门获奖感言
2014/02/14 职场文书
物业管理毕业生的自我评价
2014/02/17 职场文书
Java中的随机数Random
2022/03/17 Java/Android
Javascript的promise,async和await的区别详解
2022/03/24 Javascript
Vue深入理解插槽slot的使用
2022/08/05 Vue.js