supervisord管理Gunicorn进程,使用Nginx作为反向代理运行flask web项目

1. 安装 Gunicorn

bash 复制代码
在项目虚拟环境中安装 Gunicorn:

2. 基本用法

配置文件

创建一个 Gunicorn 配置文件(如 gunicorn_config.py),方便管理复杂配置。

示例 gunicorn_config.py:

bash 复制代码
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 进程在后台持续运行,并自动重启。

  1. 创建 Supervisord 配置文件
    在 /etc/supervisord.d/ 目录下新建文件(如 flask_app.ini):
bash 复制代码
[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  ; 运行用户(根据实际情况修改)
  1. 重新加载 Supervisord 配置
bash 复制代码
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):

bash 复制代码
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:

bash 复制代码
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):
bash 复制代码
pip install gevent
gunicorn app:app -k gevent --worker-connections 1000

总结

开发环境:直接运行 gunicorn app:app。

生产环境:使用配置文件 + Supervisord + Nginx,确保高可用性和安全性。

如果有其他问题,欢迎提供具体错误信息进一步排查!

相关推荐
iru8 小时前
nginx被报CVE-2025-1695漏洞,检查后反馈是误报
运维·nginx
cnskylee17 小时前
【Nginx】Nginx-1.28.1版本已恢复对CentOS 7的兼容性
运维·nginx·centos
Knight_AL1 天前
Docker 中的端口映射原理:为什么 Nginx 要 `listen 80`,而不是“随便写端口”
nginx·docker·容器
虹梦未来2 天前
【运维心得】Ubuntu2404编译nginx隐藏Server信息
运维·服务器·nginx
tgethe2 天前
Nginx笔记
运维·笔记·nginx
invicinble2 天前
对于nginx(一,认识nginx)
运维·nginx
徒手千行代码无bug2 天前
Nginx upstream 负载均衡 404,单节点转发正常的根因与解决
运维·nginx·负载均衡
irisart2 天前
第二章【NGINX 开源功能】—— 七层反向代理(下)
运维·nginx
xixiyuguang2 天前
nginx tar离线安装 ubuntu22.04
运维·nginx
丁丁丁梦涛2 天前
nginx解决域名代理到IP+端口的平台静态资源和接口地址问题
运维·tcp/ip·nginx