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