访问gunicorn驱动的服务时的静默超时。如何调试?

时间:2015-11-04 23:42:21

标签: python linux django gunicorn

我有这个文件:

cd /opt/webapps/deployed/landing-pages
# 1. Activate the virtualenv
source /home/ec2-user/.virtualenvs/landing-pages/bin/activate
# 2. Start gunicorn process as daemon
gunicorn trescloud_landing.wsgi:application --daemon --bind=127.0.0.1:8888 --pid=/opt/webapps/pid/landing-pages.pid --access-logfile=/opt/webapps/log/landing-pages.access.log --error-logfile=/opt/webapps/log/landing-pages.error.log
# 3. Deactivate the virtualenv
deactivate

当我运行此文件时,我可以找到trescloud_landing / wsgi.py文件(即我在项目的基本目录中:manage.py之类的文件位于pwd目录中)。

我有权同时编写.access.log和.error.log文件以及.pid文件。当我运行它时,会创建两个进程:

  

ec2-user 17171 0.3 0.5 214916 11740? S 23:28 0:00 /home/ec2-user/.virtualenvs/landing-pages/bin/python2.7/home/ec2-user/.virtualenvs/landing-pages/bin/gunicorn trescloud_landing.wsgi:application - 守护进程--bind = 127.0.0.1:8888 --pid = / opt / webapps / pid / landing-pages.pid --access-logfile = / opt / webapps / log / landing-pages.access.log --error- logfile = / opt / webapps / log / landing-pages.error.log

     

ec2-user 17176 4.8 1.0 235144 20556? R 23:28 0:00 /home/ec2-user/.virtualenvs/landing-pages/bin/python2.7 /home/ec2-user/.virtualenvs/landing-pages/bin/gunicorn trescloud_landing.wsgi:application - 守护进程--bind = 127.0.0.1:8888 --pid = / opt / webapps / pid / landing-pages.pid --access-logfile = / opt / webapps / log / landing-pages.access.log --error-日志文件= /选择/ web应用/数/着陆-pages.error.log

当我咨询netstat(sudo netstat -anp | grep 8888)时,我会得到类似的结果:

  

tcp 0 0 127.0.0.1:8888 0.0.0.0:* LISTEN 17171 / python2.7

这似乎告诉我服务器已启动。

然而当我点击curl(和/或浏览器,但因为它落后于nginx,会出现其他内容,似乎没有给我任何其他信息)curl http://127.0.0.1:8888/请求处理似乎停止了(即永远不会返回。不会产生错误。不会产生部分响应 - 它变成空白和永恒)。当然,当我在中间点击nginx的url(即通过外部链接)时,我得到504响应(因为nginx处理超时,因为任何体面的代理应该)。

通过查看错误日志,我得不到任何有意义的信息(如果我通过nginx访问,则只有[CRITICAL] WORKER TIMEOUT)。这就是我看到的东西:

  

2015-11-04 23:35:07 [17171] [关键]工人超时(pid:17319)
  2015-11-04 23:35:07 [17171] [INFO] 1名工人
  2015-11-04 23:35:08 [17319] [INFO]工人退出(pid:17319)
  2015-11-04 23:35:08 [17171] [INFO] 1名工人
  2015-11-04 23:35:08 [17326] [INFO]带pid的启动工人:17326
  2015-11-04 23:35:08 [17171] [INFO] 1名工人
  2015-11-04 23:35:08 [17171] [INFO] 1名工人

问题

错误的原因是什么?我该如何调试此服务器?我在哪里检查?

pip freeze

  

dateutils == 0.6.6
  Django的== 1.8.4
  Django的CORS报头== 1.1.0
  django-xmail-ritual == 0.0.11(*)
  djangorestframework == 3.2.3(*)
  未来== 0.15.0
  gunicorn == 19.1.0
  psycopg2 == 2.6.1
  python-cantrips == 0.7.1(*)
  蟒蛇-dateutil == 2.4.2
  pytz == 2015.4
  6 == 1.9.0
  轮== 0.24.0

(*)这些包可以工作,因为我在其他生产环境中使用它们而没有超时。这个应用程序过去一直没有改变。

谢谢:D。

1 个答案:

答案 0 :(得分:0)

我找到的答案如下:

  1. 在服务器中将其作为runserver运行。如果它需要很多启动,那么你有一个有点沉重的初始化代码(可能是一个服务,模型元实例化,......由你来看你的应用程序中的代码)。通常这也会在您的本地环境中产生影响,但如果它没有(并且您拥有相同的数据库引擎),请检查服务器中是否有本地未版本控制的文件,并分析其内容。
  2. 如果runserver命令运行良好但需要花费很多时间来处理单个请求(或至少是第一个请求),则应检查您的视图或中间件(自定义中间件,如果有)是否正在执行一次初始化代码。
  3. 如果运行runserver没有问题,请检查WSGI是否运行良好。您可以通过在相同的virtualenv和current目录中运行交互式解释器来模拟这一点,并运行代码from myproject.wsgi import application。也许你会像我一样找到时间瓶颈。有时django WSGI应用程序需要一些时间来进行引导,并且他们在收到的第一个请求中执行此操作(实际上,每次gunicorn需要创建新工作人员)。
  4. 在我的情况下,我处于场景3中。我注意到在gunicorn启动配置中添加--timeout = 45(或者可能是60)我会给工作人员更多时间来处理请求。否则,创建一个worker,需要超过30秒才能加载,它会被杀死,重新启动,尝试相同的请求,需要30秒以上......以及你到达的无限循环。