部署时长脚本停止 运行 - nginx/gunicorn 上的 Django
Long Script Stops Running When Deployed - Django on nginx/gunicorn
我有一个很长的脚本,它提取 pdf,进行大量处理,然后 returns 结果。它 运行 当 运行 通过端口 8000 通过任一
连接时,它是完美的
python manage.py runserver 0.0.0.0:8000
或
gunicorn --bind 0.0.0.0:8000 myproject.wsgi
然而,当我 运行 它通过“生产”中的端口 80 运行时,脚本会在某个点停止 运行ning,没有错误,逻辑上似乎也没有漏洞。真正造成混淆的是它根据处理文档的 length/complexity 停在不同的地方。 Short/simple 完成的没有问题,但更长的会停在中间。
我尝试添加一个非常详细的日志文件来调试问题。如果我处理一个文档,它会在同一个循环中停止 运行ning 但在循环中的不同位置(看似随机),表明这不是逻辑缺陷(注意我正在写和刷新)。此外,如果我使用 longer/more 复杂的文档,它会在该过程的早期神秘地停止。
我正在通过 gunicorn/nginx 在 DigitalOcean
上使用 Django 进行部署
是否有某种内置保护可以在一定数量的 CPU 周期或时间后停止进程,以防止上述任何情况中的无限循环?这是我唯一能想到的,因为我没有其他想法。
非常感谢任何帮助!
想通了。 Gunicorn 有一个内置计时器,可以在设定的时间后杀死工人。默认值(每个 gunicorn 的文档 30 秒)对于我的过程来说太短了。解决方法是在gunicorn配置文件的“ExecStart”中添加“timeout”变量; Ubuntu 20.4:
上的标准设置
sudo nano /etc/systemd/system/gunicorn.service
然后将超时变量添加到 ExecStart(我在这个例子中使用了 120 秒):
ExecStart=/home/sammy/myprojectdir/myprojectenv/bin/gunicorn \
--access-logfile - \
--workers 3 \
--timeout 120 \
--bind unix:/run/gunicorn.sock \
myproject.wsgi:application
我通过查看记录标准输出的“journalctl”确定了这一点。要查看最近的 50 行流,请在您的终端中输入以下内容:
journaltctl | tail -50
就我而言,我注意到一个条目包含“[CRITICAL] WORKER TIMEOUT (pid:xxxxxx)”
我有一个很长的脚本,它提取 pdf,进行大量处理,然后 returns 结果。它 运行 当 运行 通过端口 8000 通过任一
连接时,它是完美的python manage.py runserver 0.0.0.0:8000
或
gunicorn --bind 0.0.0.0:8000 myproject.wsgi
然而,当我 运行 它通过“生产”中的端口 80 运行时,脚本会在某个点停止 运行ning,没有错误,逻辑上似乎也没有漏洞。真正造成混淆的是它根据处理文档的 length/complexity 停在不同的地方。 Short/simple 完成的没有问题,但更长的会停在中间。
我尝试添加一个非常详细的日志文件来调试问题。如果我处理一个文档,它会在同一个循环中停止 运行ning 但在循环中的不同位置(看似随机),表明这不是逻辑缺陷(注意我正在写和刷新)。此外,如果我使用 longer/more 复杂的文档,它会在该过程的早期神秘地停止。
我正在通过 gunicorn/nginx 在 DigitalOcean
上使用 Django 进行部署是否有某种内置保护可以在一定数量的 CPU 周期或时间后停止进程,以防止上述任何情况中的无限循环?这是我唯一能想到的,因为我没有其他想法。
非常感谢任何帮助!
想通了。 Gunicorn 有一个内置计时器,可以在设定的时间后杀死工人。默认值(每个 gunicorn 的文档 30 秒)对于我的过程来说太短了。解决方法是在gunicorn配置文件的“ExecStart”中添加“timeout”变量; Ubuntu 20.4:
上的标准设置sudo nano /etc/systemd/system/gunicorn.service
然后将超时变量添加到 ExecStart(我在这个例子中使用了 120 秒):
ExecStart=/home/sammy/myprojectdir/myprojectenv/bin/gunicorn \
--access-logfile - \
--workers 3 \
--timeout 120 \
--bind unix:/run/gunicorn.sock \
myproject.wsgi:application
我通过查看记录标准输出的“journalctl”确定了这一点。要查看最近的 50 行流,请在您的终端中输入以下内容:
journaltctl | tail -50
就我而言,我注意到一个条目包含“[CRITICAL] WORKER TIMEOUT (pid:xxxxxx)”