【问题标题】:Long Script Stops Running When Deployed - Django on nginx/gunicorn长脚本在部署时停止运行 - nginx/gunicorn 上的 Django
【发布时间】:2021-05-23 00:13:52
【问题描述】:

我有一个很长的脚本,它提取 pdf,进行大量处理,然后返回结果。通过端口 8000 运行时,它可以完美运行

python manage.py runserver 0.0.0.0:8000

gunicorn --bind 0.0.0.0:8000 myproject.wsgi

但是,当我在“生产”中通过端口 80 运行它时,脚本会在某个点停止运行,没有错误,而且逻辑上似乎没有漏洞。真正引起混淆的是,它根据处理文档的长度/复杂性在不同的地方停止。短/简单的完整没有问题,但较长的会停在中间。

我尝试添加一个非常详细的日志文件来调试问题。如果我处理一个文档,它会停止在同一个循环中但在循环内的不同位置运行(看似随机),这表明这不是一个逻辑缺陷(注意我正在编写和刷新)。此外,如果我使用更长/更复杂的文档,它会在流程的早期神秘地停止。

我正在 DigitalOcean 上通过 gunicorn/nginx 使用 Django 部署它

是否存在某种内置保护措施,可在一定数量的 CPU 周期或时间后停止进程,以防止上述任何一种情况出现无限循环?这是我唯一能想到的,因为否则我没有想法。

非常感谢任何帮助!

【问题讨论】:

    标签: python django nginx gunicorn digital-ocean


    【解决方案1】:

    想通了。 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)”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-02
      • 2020-04-06
      • 1970-01-01
      • 2018-01-28
      • 2018-06-15
      • 2012-02-16
      • 2020-12-26
      • 2019-01-11
      相关资源
      最近更新 更多