Contents
  1. 1. Introduction
  2. 2. 关于WSGI的一些概念
  3. 3. WHY Gunicorn
  4. 4. 安装依赖包
  5. 5. 创建python虚拟环境
  6. 6. 创建Flask应用
    1. 6.1. 安装Flask
    2. 6.2. 创建应用
  7. 7. 创建wsgi入口
  8. 8. 测试Gunicorn
  9. 9. 创建自启动脚本
  10. 10. 配置nginx请求代理规则

Introduction

本文介绍如何使用Flask微框架在Ubuntu 15.10上搭建一个WEB应用,并使用guniconr Server来启动应用和设置Nginx作为前端反向代理。

关于WSGI的一些概念

gunicorn是一个运行于unix环境的遵循python WSGI规范的WEB Server。WSGI(web server gateway interfaces)是一种python中定义WEB应用/框架 与 WEB服务器/应用服务器之间通信规范的接口标准,旨在简化和规范上述部件间的通信,并使各部分易于替换。它定义了一组可用于其它协议之上的接口。

因此作为一种WSGI实现的gunicorn可以将HTTP请求转换为WSGI定义的python标准请求,可被同样遵循了WSGI规范的应用如django,flask接收处理,处理后的响应也同样可被逆向转换为http response并回到客户端。

nginx在此场景中则作为一个http request代理,将不uri或类型的请求发送至不同的web server处理,比如静态图片可由自己处理,而动态的数据库查询可交给flask应用来完成。

WHY Gunicorn

如果Flask也可以直接处理http请求,为何要使用WSGI的Gunicorn或者其它如uWSGI这样的管理服务呢?除了前面所提到的松耦合原因外,还因为其具有强大的worker进程管理能力,Gunicorn可以同时运行多个flask进程并为其分配来自客户端的请求,也可以自动重启中断的进程,从而提高了伸缩性和可用性。

安装依赖包

如果已经安装可以忽略

1
2
sudo apt-get update
sudo apt-get install python-pip python-dev nginx

创建python虚拟环境

virtualevn可以为每个python应用创建虚拟环境,因此我们可以用来使flask应用与其它python文件隔离。

1
sudo pip install virtualenv

现在创建工程目录并进入,然后创建项目的虚拟python环境目录并激活

1
2
3
4
5
mkdir ~/myproject
cd ~/myproject
virtualenv myprojectenv
source myprojectenv/bin/activate

激活之后,提示符最前面会出现相应的(myprojectenv) 提示(myprojectenv)user@host:~/myproject$

创建Flask应用

安装Flask

继续在虚拟环境中执行

1
pip install gunicorn flask

创建应用

使用文本编辑器创建一个内容如下的文件vi ~/myproject/myproject.py:

1
2
3
4
5
6
7
8
9
from flask import Flask
application = Flask(__name__)
@application.route("/")
def hello():
return "<h1 style='color:blue'>Hello There!</h1>"
if __name__ == "__main__":
application.run(host='0.0.0.0')

运行python myproject.py,在浏览器中访问http://127.0.0.1:5000可以见到"Hello There”字样。

测试成功后,可以ctrl+c关闭进程,进入下一步。

创建wsgi入口

接下来我们要创建一个应用的入口文件,通过它Gunicorn知道如何与应用交互。这里它也是一个简单的文本文件vi ~/myproject/wsgi.py

1
2
3
4
from myproject import application
if __name__ == "__main__":
application.run()

测试Gunicorn

可以只指定入口参数,这里我们还指定了服务地址:

1
2
cd ~/myproject
gunicorn --bind 0.0.0.0:8000 wsgi

此时使用浏览器同样应该能在本机的8000端口上看到同样的”Hello There”字样。测试成功之后,可以输入deactivate退出virtualevn虚拟环境。

创建自启动脚本

本人Linux发行版为ubuntu 15.10,使用了systemd来管理自启动,使用脚本编写请按照自己的发行版格式,比如upstart等。
先给出完整的脚本内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Unit]
Description=run gunicorn
[Service]
User=chen
Group=www-data
Restart=on-failure
Environment=PATH=/data/myproject/myprojectenv/bin
WorkingDirectory=/data/myproject
ExecStart=/data/myproject/myprojectenv/bin/python /data/myproject/myprojectenv/bin/gunicorn --workers 3 --bind unix:/tmp/myproject.sock -m 007 wsgi
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target

Restart=on-failure保证进程中断会被自动重启
Environment=PATH=/data/myproject/myprojectenv/bin这里可以设置一些额外的环境变量
WorkingDirectory相当于chdir
ExecStart最重要部分,需要在开机时运行的命令。这次我们使用了socket文件而不是网络端口来与nginx通信,这样可以避免每个进程占用一个端口。
最后[Install]字段中的WantedBy=multi-user.target类似upstart脚本中指定runlevel=[2345]的作用,保证脚本在开机时自动执行。

配置nginx请求代理规则

配置Nginx将特定的http请求转发到gunicorn创建的socket上,只需要在nginx的规则上增加一小部分即可。

1
vi /etc/nginx/sites-available/myproject

其内容为

1
2
3
4
5
6
7
8
9
server {
listen 80;
server_name server_domain_or_IP;
location / {
include proxy_params;
proxy_pass http://unix:/home/user/myproject/myproject.sock;
}
}

这里需要注意的是请确定nginx有权限访问socket文件,一般将其放置在/tmp目录即可。
将规则启用

1
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled

启动之前,还可以测试配置文件是否正确

1
sudo nginx -t

如果一切正常,就可以重启nginx了

1
sudo systemctl restart nginx

Contents
  1. 1. Introduction
  2. 2. 关于WSGI的一些概念
  3. 3. WHY Gunicorn
  4. 4. 安装依赖包
  5. 5. 创建python虚拟环境
  6. 6. 创建Flask应用
    1. 6.1. 安装Flask
    2. 6.2. 创建应用
  7. 7. 创建wsgi入口
  8. 8. 测试Gunicorn
  9. 9. 创建自启动脚本
  10. 10. 配置nginx请求代理规则