Nginx, Gunicorn, supervisor在Ubuntu上部署Web应用

WSGI

Web Server Gateway Interface, Python web服务器网关接口, 即Python的Web应用程序和Web服务器之间的一种通信协议。如果让web应用在任何服务器上运行, 就必须遵循这个协议。

Gunicorn

配置Gunicorn

在虚拟环境下安装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

Nginx作为一个高性能Web服务器, 具有负载均衡, 拦截静态请求, 高并发。

通常让Nginx监听80端口, 通过多域名或者多个location分发到不同的后端应用。其次是拦截静态要求, Nginx会拦截到静态请求(静态文件, 如图片), 并交给自己处理。 而动态请求通过WSGI容器交给Web应用处理;

配置Nginx

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

Supervisor

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

你可能感兴趣的:(Python)