Web Server Gateway Interface, Python web服务器网关接口, 即Python的Web应用程序和Web服务器之间的一种通信协议。如果让web应用在任何服务器上运行, 就必须遵循这个协议。
在虚拟环境下安装Gunicorn:
(venv) $ pip3 install gunicorn
创建以.py结尾的配置文件
from gevent import monkey
monkey.patch_all()
import multiprocessing
debug = True
loglevel = 'debug'
bind = '127.0.0.1:5000' //绑定与Nginx通信的端口
pidfile = 'log/gunicorn.pid'
logfile = 'log/debug.log'
workers = multiprocessing.cpu_count() * 2 + 1
worker_class = 'gevent' //默认为阻塞模式,最好选择gevent模式
需要注意的是要在配置文件的同层目录下创建log文件, 否则运行gunicorn将报错。添加完配置内容并保存为gconfig.py文件, 可以通过gunicorn来运行Flask应用
(venv)$ gunicorn -c /www/demo/gconfig.py run:app
优雅的退出/关闭/重启gunicorn进程
通过执行如下命令,可以获取Gunicorn进程树:
pstree -ap|grep gunicorn
退出Gunicorn任务
kill -9 28097
Nginx作为一个高性能Web服务器, 具有负载均衡, 拦截静态请求, 高并发。
通常让Nginx监听80端口, 通过多域名或者多个location分发到不同的后端应用。其次是拦截静态要求, Nginx会拦截到静态请求(静态文件, 如图片), 并交给自己处理。 而动态请求通过WSGI容器交给Web应用处理;
server {
listen 80;
root /www/demo;
server_name xxx.xx.xxx.xxx;
location / {
proxy_set_header x-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_pass http://localhost:5000/; # gunicorn绑定的端口号
}
# 配置static的静态文件:
location ~ ^\/static\/.*$ {
root /www/demo;
}
}
通过Gunicorn的Nginx配置中, 只需要通过proxy_pass参数反向代理给运行在http://localhost:5000上的Gunicorn
nohup运行的后台程序并不能够可靠的在后台运行, 可以使用一个使用Python开发的进程管理程序supervisor.
通过apt来安装supervisor:
$ sudo apt-get install supervisor
安装完成后, 在/etc/supervisor/conf.d/目录下创建控制进程的配置文件, 并以.conf结尾, 这样将会自动应用到主配置文件中
[program:demo]
command=/www/demo/venv/bin/gunicorn -c /pushy/blog/gconfig.py run:app
directory=/www/demo //项目目录
user=root
autorestart=true //设置自动重启
startretires=3 //重启失败3次
保存配置文件之后, 需要通过命令来更新配置文件:
$ supervisorctl update
命令行将显示: demo: added process group, 然后来启动这个demo进程:
$ supervisorctl start demo
在命令行输入supervisorctl进入supevisor的客户端, 查看当前的进程状态:
demo RUNNING pid 17278, uptime 0:08:51
通过stop命令便可以方便的停止该进程:
supervisor> stop demo