supervisord管理Gunicorn进程,使用Nginx作为反向代理运行flask web项目
1. 安装 Gunicorn
在项目虚拟环境中安装 Gunicorn:
2. 基本用法
配置文件
创建一个 Gunicorn 配置文件(如 gunicorn_config.py),方便管理复杂配置。
示例 gunicorn_config.py:
bind = "0.0.0.0:8000" # 绑定地址和端口
workers = 4 # 工作进程数
threads = 2 # 每个工作进程的线程数
daemon = False # 是否以守护进程运行(建议用 supervisord 管理)
accesslog = "-" # 访问日志输出到标准输出
errorlog = "-" # 错误日志输出到标准错误
timeout = 30 # 请求超时时间(秒)
keepalive = 5 # 保持连接的时间(秒)
启动命令:
gunicorn app:app -c gunicorn_config.py
3. 配合 Supervisord 管理进程
使用 supervisord 可以确保 Gunicorn 进程在后台持续运行,并自动重启。
- 创建 Supervisord 配置文件
在 /etc/supervisord.d/ 目录下新建文件(如 flask_app.ini):
[program:flask_app]
command=/path/to/venv/bin/gunicorn -c /path/to/gunicorn_config.py app:app
directory=/path/to/your/flask/project ; 项目根目录
autostart=true
autorestart=true
stderr_logfile=/var/log/flask_app.err.log
stdout_logfile=/var/log/flask_app.out.log
user=www-data ; 运行用户(根据实际情况修改)
- 重新加载 Supervisord 配置
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start flask_app
supervisorctl restart flask_app #重启项目
3. 配合 Nginx 反向代理
在 Gunicorn 前使用 Nginx 作为反向代理,处理静态文件、SSL 和负载均衡。
示例 Nginx 配置(/etc/nginx/conf.d/flask_app.conf):
server {
listen 80;
server_name your_domain.com; #域名或者服务器IP
# 静态文件处理
location /static {
alias /path/to/your/flask/project/static;
}
# 反向代理到 Gunicorn
location / {
proxy_pass http://127.0.0.1:8000; # 项目启动的端口号
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
重启 Nginx:
nginx -t 检查配置文件是否错去
nginx -s reload 重启
sudo systemctl restart nginx 重启
4. 常见问题解决
Gunicorn 无法启动
- 错误日志:查看 --error-logfile 指定的日志文件。
- 端口占用:检查端口是否被其他进程占用:
netstat -tuln | grep 8000
静态文件无法加载
- 确保 Nginx 配置中 location /static 的路径正确。
- 在 Flask 中设置 STATIC_FOLDER。
性能优化
- 调整 workers 和 threads 参数。
- 使用异步工作模式(需安装 gevent 或 eventlet):
pip install gevent
gunicorn app:app -k gevent --worker-connections 1000
总结
开发环境:直接运行 gunicorn app:app。
生产环境:使用配置文件 + Supervisord + Nginx,确保高可用性和安全性。
如果有其他问题,欢迎提供具体错误信息进一步排查!