离开gunicorn的正确方法是什么?

时间:2012-11-30 23:33:28

标签: python nginx flask gunicorn

我想制作Flask + Nginx + Gunicorn部署。我有Nginx设置和运行,我运行gunicorn,如文档中所述:

gunicorn app:app

但是当我退出服务器时,gunicorn进程会退出吗?正确的方法是确保它能够继续运行以便Nginx连接,并在崩溃时重新启动?

9 个答案:

答案 0 :(得分:35)

在运行gunicorn时使用--daemon选项。 例如:

gunicorn grand56.wsgi:application --name grand56 --workers 3 --user=root --group=root --bind=127.0.0.1:1001 --daemon

答案 1 :(得分:18)

我会查看类似Supervisor的内容。

答案 2 :(得分:7)

需要注意的关键是,当您从命令行启动进程时,它是终端进程的子进程(即bash的子进程)。当您退出服务器时,bash进程将被终止 - 与其所有子进程一样。

你会想要使用你所拥有的任何系统来管理nginx,也可以管理gunicorn(从init.d或Upstart脚本到Monit,Supervisor,Bluepill,Foreman等专业应用程序进程监视器)。< / p>

答案 3 :(得分:7)

使用--daemon来绑定gunicorn。 例如:

gunicorn --bind 0.0.0.0:8001 your_project.wsgi --daemon

答案 4 :(得分:6)

注意肖恩。

但是你可以像这样运行它:

nohup gunicorn -c config.py </dev/null >/dev/null 2>&1它将不再依赖于终端连接。如果要保存任何输出,可以用>/dev/null替换>somelogfile

但对于生产用途,最好将其集成到用于管理流程的任何工具中。

答案 5 :(得分:3)

试试这个:

nohup gunicorn app:app &

答案 6 :(得分:0)

我尝试了systemd选项并且工作正常,下面的链接有我的完整答案并且有所有步骤,以调用你的应用程序作为gunicorn服务。

https://askubuntu.com/questions/930589/running-upstart-script-on-17-04/1010398#1010398

答案 7 :(得分:0)

像这样运行hug api。

-daemon 是将进程保留在后台。

-access-logfile 保留请求日志

-bind = :<端口> 提供IP将允许从其他系统访问(如果不需要代理)。

gunicorn <pyscirpt_name>:__hug_wsgi__ --name  caassist -w 4 --access-logfile /var/logs/gunicorn/gunicorn_access.log --daemon --bind=<ip>:<port>

答案 8 :(得分:0)

Supervisor是用于过程管理的出色的跨平台解决方案。它具有非常丰富的功能,并且(在我看来)比一些普通的Linux替代方案(新贵,sysv,systemd)需要更多的配置。您绝对应该使用类似的方法来启动,监视和(如果需要)重新启动过程。

无论您最终使用什么流程管理器,您都仍然可以很容易地使gunicorn“运行不正常”(即以root用户身份)。我认为其他答案遗漏的一些重要细节是,您可能应该让一个用户拥有gunicorn进程,该进程绑定到该用户和nginx组拥有的,并具有权限770的unix套接字。使用gunicorn时,您指定一个掩码,因此将770转换为007并使用-m标志。这样,只有gunicorn和nginx可以对套接字进行读/写/执行,并且不需要端口。您可以使用-u-g标志来指定gunicorn进程的用户和组,它将使用这些所有者创建套接字。无论最终用于进程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用户对日志文件具有写权限。然后,在nginx中,您以前拥有ip /端口(即0.0.0.0:5000),然后将路径放入套接字(即/usr/share/nginx/html/gunicorn.sock)。

您可以找到所有不同的标记here