在使用 Gunicorn 开发时,自动重启是一个很常见的需求,尤其在调试和开发过程中。Gunicorn 本身并没有直接支持文件监控和自动重启的功能,但可以通过以下几种方法实现:
方法 1:使用 --reload
选项
Gunicorn 提供一个内置的 --reload
参数,可以在开发环境中使用。它会监控应用程序的 Python 源代码文件,如果文件发生变化,则自动重启服务。
启动命令示例:
gunicorn --reload -w 2 -b 127.0.0.1:8000 myapp:app
--reload
: 开启自动重载功能。-w 2
: 指定 2 个 worker 进程。-b 127.0.0.1:8000
: 绑定到本地的 8000 端口。myapp:app
: 指定模块名和 WSGI 应用实例。
注意:
- 仅适用于开发环境,不推荐在生产环境中使用。
- 监控文件的变更可能增加系统开销。
方法 2:结合 watchdog
实现更高级的文件监控
如果需要监控更复杂的文件变化(例如配置文件、静态文件等),可以使用 Python 的 watchdog
模块监控文件,并在文件变化时重启 Gunicorn。
安装 watchdog
:
pip install watchdog
示例代码:
创建一个脚本,例如 auto_reload.py
:
python">from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
import os
import signal
import time
import subprocessclass ReloadHandler(FileSystemEventHandler):def __init__(self, gunicorn_pid):self.gunicorn_pid = gunicorn_piddef on_modified(self, event):print(f"File changed: {event.src_path}. Restarting Gunicorn...")os.kill(self.gunicorn_pid, signal.SIGHUP)if __name__ == "__main__":# 启动 Gunicorngunicorn_process = subprocess.Popen(["gunicorn", "-w", "2", "-b", "127.0.0.1:8000", "myapp:app"])gunicorn_pid = gunicorn_process.pid# 监控当前目录文件的变化event_handler = ReloadHandler(gunicorn_pid)observer = Observer()observer.schedule(event_handler, path=".", recursive=True)try:observer.start()while True:time.sleep(1)except KeyboardInterrupt:observer.stop()observer.join()# 停止 Gunicorngunicorn_process.terminate()
运行脚本:
python auto_reload.py
特点:
- 可监控任意文件夹和文件类型。
- 可自定义触发重启的条件。
- 增加了灵活性,但稍微复杂一些。
方法 3:使用 supervisor
或 systemd
配合文件监控
你可以使用 supervisor
或 systemd
来管理 Gunicorn 的进程,同时配合 inotify
等文件监控工具触发进程重启。
使用 inotify-tools
示例:
-
安装
inotify-tools
:sudo apt install inotify-tools
-
创建一个文件监控脚本:
#!/bin/bash while inotifywait -e modify,create,delete -r /path/to/your/project; doecho "File changes detected. Restarting Gunicorn..."pkill gunicorngunicorn -w 2 -b 127.0.0.1:8000 myapp:app & done
-
运行脚本:
bash watch_and_reload.sh
方法 4:使用 honcho
或 foreman
可以使用工具如 honcho
或 foreman
来同时运行 Gunicorn 和文件监控脚本。你可以在 Procfile
中定义任务:
示例 Procfile
:
web: gunicorn --reload -w 2 -b 127.0.0.1:8000 myapp:app
watch: python watch_files.py
然后用 honcho
运行:
honcho start
总结
- 简单场景:直接使用 Gunicorn 的
--reload
参数。 - 复杂场景:结合
watchdog
或inotify-tools
实现精细化文件监控。 - 生产环境:自动重启通常不适用,应使用工具如
supervisor
或systemd
配合手动触发的方式。