插件窝 干货文章 Flask和Gunicorn应用崩溃后如何自动重启?

Flask和Gunicorn应用崩溃后如何自动重启?

Gunicorn 重启 Supervisor 进程 661    来源:    2025-03-11

在部署Flask应用时,通常会使用Gunicorn作为WSGI服务器。为了确保应用在崩溃后能够自动重启,可以采取以下几种方法:

1. 使用Gunicorn的--max-requests--max-requests-jitter参数

Gunicorn本身提供了一些参数来帮助管理工作进程的生命周期。通过设置--max-requests--max-requests-jitter参数,可以让Gunicorn在达到一定数量的请求后自动重启工作进程,从而避免内存泄漏等问题。

gunicorn -w 4 -b 127.0.0.1:8000 --max-requests 1000 --max-requests-jitter 50 myapp:app
  • --max-requests 1000:每个工作进程在处理1000个请求后自动重启。
  • --max-requests-jitter 50:在--max-requests的基础上增加一个随机的抖动值,避免所有工作进程同时重启。

2. 使用Supervisor管理Gunicorn进程

Supervisor是一个进程管理工具,可以用来监控和管理Gunicorn进程。如果Gunicorn进程崩溃,Supervisor会自动重启它。

安装Supervisor

sudo apt-get install supervisor

配置Supervisor

创建一个新的Supervisor配置文件,例如/etc/supervisor/conf.d/myapp.conf

[program:myapp]
command=/path/to/your/virtualenv/bin/gunicorn -w 4 -b 127.0.0.1:8000 myapp:app
directory=/path/to/your/app
user=youruser
autostart=true
autorestart=true
stderr_logfile=/var/log/myapp.err.log
stdout_logfile=/var/log/myapp.out.log
  • command:启动Gunicorn的命令。
  • directory:应用的根目录。
  • user:运行应用的用户。
  • autostart:是否在Supervisor启动时自动启动应用。
  • autorestart:是否在应用崩溃后自动重启。
  • stderr_logfilestdout_logfile:标准错误和标准输出的日志文件。

启动Supervisor

sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start myapp

3. 使用Systemd管理Gunicorn进程

Systemd是Linux系统的初始化系统和服务管理器,可以用来管理Gunicorn进程。

创建Systemd服务文件

创建一个新的Systemd服务文件,例如/etc/systemd/system/myapp.service

[Unit]
Description=Gunicorn instance to serve myapp
After=network.target

[Service]
User=youruser
Group=www-data
WorkingDirectory=/path/to/your/app
ExecStart=/path/to/your/virtualenv/bin/gunicorn -w 4 -b 127.0.0.1:8000 myapp:app
Restart=always

[Install]
WantedBy=multi-user.target
  • User:运行应用的用户。
  • Group:运行应用的组。
  • WorkingDirectory:应用的根目录。
  • ExecStart:启动Gunicorn的命令。
  • Restart=always:确保应用在崩溃后自动重启。

启动Systemd服务

sudo systemctl daemon-reload
sudo systemctl start myapp
sudo systemctl enable myapp

4. 使用Docker容器

如果你使用Docker来部署应用,可以通过Docker的--restart选项来确保容器在崩溃后自动重启。

docker run -d --restart always -p 8000:8000 myapp
  • --restart always:确保容器在崩溃后自动重启。

总结

以上几种方法都可以实现Flask和Gunicorn应用在崩溃后自动重启。选择哪种方法取决于你的具体需求和部署环境。如果你已经在使用Supervisor或Systemd,那么直接使用它们来管理Gunicorn进程是最方便的。如果你使用Docker,那么Docker的--restart选项是最简单的解决方案。