我想做一个 Flask+Nginx+Gunicorn 部署。我已经设置并运行了 Nginx,并且按照文档中的描述运行了 gunicorn:
gunicorn app:app
但是当我注销服务器时,gunicorn 进程会退出吗?确保 Nginx 连接到它并在崩溃时重新启动的正确方法是什么?
--daemon
运行 gunicorn 时使用选项。例子:
gunicorn grand56.wsgi:application --name grand56 --workers 3 --user=root --group=root --bind=127.0.0.1:1001 --daemon
使用 --daemon 来绑定 gunicorn 的命令。前任:
gunicorn --bind 0.0.0.0:8001 your_project.wsgi --daemon
我会研究类似的东西Supervisor。
非常有用的教程可以在这里找到https://www.codingforentrepreneurs.com/blog/hello-linux-setup-gunicorn-and-supervisor/
需要注意的关键是,当您从命令行启动进程时,它是终端进程的子进程(即 的子进程bash
)。当您注销服务器时,您的bash
进程将被终止 - 它的所有子进程也是如此。
您将希望使用现有的任何系统来管理 nginx 以及管理 gunicorn(从init.d
Upstart 脚本到专门的应用程序进程监视器,如 Monit、Supervisor、Bluepill、Foreman 等)
尝试这个:
nohup gunicorn app:app &
注意肖恩。
但是,您可以像这样动态运行它:
nohup gunicorn -c config.py </dev/null >/dev/null 2>&1
它将不再依赖于终端连接。如果你想保存任何输出,你可以>/dev/null
用类似的东西替换。>somelogfile
但对于生产用途,最好将其集成到您用于管理流程的任何工具中。
Supervisor
是一个伟大的跨平台流程管理解决方案。它的功能非常丰富,并且(在我看来)比一些普通的 Linux 替代品(upstart、sysv、systemd)需要更多的配置。您绝对应该使用类似的东西来启动、监控和(如果需要)重新启动您的流程。
无论您最终使用什么进程管理器,您仍然可以很容易地让 gunicorn “运行不正常”(即作为 root 用户)。我认为其他答案遗漏的一些重要细节是,您可能应该让一个(非 root)用户拥有 gunicorn 进程,该进程绑定到该用户和 nginx 组拥有并具有权限的 unix 套接字770
。使用gunicorn
,您指定一个掩码,因此反转770
并007
使用该-m
标志。这样,只有 gunicorn 和 nginx 可以读/写/执行到套接字,不需要端口。您可以使用 and 指定 gunicorn 进程的用户和-u
组-g
标志,它将与这些所有者一起创建套接字。无论您最终使用进程 mgmt,对于 nginx/gunicorn,您可能希望在启动脚本中使用类似的内容:
exec gunicorn wsgi:app -u gunicorn -g nginx -m 007 -b gunicorn.sock >> /var/log/$<service_name>.sys.log 2>&1
确保 gunicorn 用户对日志文件具有写入权限。然后,在您以前拥有 ip/port (ie 0.0.0.0:5000
) 的 nginx 中,您将路径放置到套接字 (ie /usr/share/nginx/html/gunicorn.sock
)。请注意,我在这里没有使用--daemon
标志,但我使用exec
了 ,这假定一个进程管理器,它将作为子进程运行 gunicorn exec
。
你可以在这里找到所有不同的标志。
像这样运行拥抱api。
--daemon是将进程保持在后台。
--access-logfile保存请求日志
--bind=<ip>:<port>提供 IP 将允许从其他系统访问(如果不需要代理)。
gunicorn <pyscirpt_name>:__hug_wsgi__ --name caassist -w 4 --access-logfile /var/logs/gunicorn/gunicorn_access.log --daemon --bind=<ip>:<port>
我尝试了 systemd 选项,它运行良好,下面的链接有我的完整答案和所有步骤,可以将您的应用程序作为 gunicorn 服务调用。
https://askubuntu.com/questions/930589/running-upstart-script-on-17-04/1010398#1010398