Python WEB部署:flask+gunicorn+supervisor+nginx

在配置好python环境以及flask后,在venv中先创建一个简单的flask项目,便于测试。
项目目录:/srv/myproject/


#!/usr/bin/python
# -*- coding:utf-8 -*-

from flask import Flask

app = Flask(__name__)
@app.route('/')
def index():
return 'hello fixcode!'
if __name__ == '__main__':
app.debug = True
app.run()


保存文件为myapp.py

安装gunicorn

pip install gunicorn
有了gunicorn就可以使用它来调用flask项目。
gunicorn -w4 -b0.0.0.0:8000 myapp:app
-w表示开启的worker数,-b表示gunicorn访问的地址,8000为访问的端口号。
这个时候我们需要使用supervisor来管理gunicorn进程。

安装supervisor

pip install supervisor
生成supervisor配置文件
echo_supervisor_conf > supervisor.conf
向supervisor配置文件添加gunicorn进程
vim supervisor.conf
添加配置信息:


program:fixcode]
command=/srv/myproject/venv/bin/gunicorn -w4 -b0.0.0.0:2170 fixcode:app ; supervisor启动命令
directory=/srv/myproject/ ; 项目文件夹路径
startsecs=0 ; 启动时间
stopwaitsecs=0 ; 终止等待时间
autostart=true ; 是否自动启动
autorestart=false ; 是否自动重启
stdout_logfile=/srv/myproject/log/gunicorn.log ; log日志
stderr_logfile=/srv/myproject/log/gunicorn.err ; 错误日志

配置nginx

在/etc/nginx/conf.d中创建项目配置文件,如myproject.conf,并在/etc/nginx/nginx.conf中引入配置文件。
include /etc/nginx/conf.d/*.conf;
myproject.conf配置信息如下:


server {
listen 80;
server_name domain.com;

root /srv/myproject;
access_log /srv/myproject/log/fixcode.access.log;
error_log /srv/myproject/log/fixcode.error.log;

location / {
proxy_pass http://127.0.0.1:2170;
proxy_redirect off;
proxy_set_header Host $host:8080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}


向supervisor配置文件添加nginx进程

[program:nginx]
command=/usr/sbin/nginx
startsecs=0
stopwaitsecs=0
autostart=false
autorestart=false
stdout_logfile=/srv/myproject/log/nginx.log
stderr_logfile=/srv/myproject/log/nginx.err

使用supervisor启动gunicorn和nginx。
supervisord -c supervisor.conf
更多supervisor命令

supervisord -c supervisor.conf 通过配置文件启动supervisor
supervisorctl -c supervisor.conf status 察看supervisor的状态
supervisorctl -c supervisor.conf reload 重新载入 配置文件
supervisorctl -c supervisor.conf start [all]|[appname] 启动指定/所有 supervisor管理的程序进程
supervisorctl -c supervisor.conf stop [all]|[appname] 关闭指定/所有 supervisor管理的程序进程

发表评论