Nginx 调试 Django 时出现“断管”?
Posted
技术标签:
【中文标题】Nginx 调试 Django 时出现“断管”?【英文标题】:Nginx "Broken pipe" When Debugging Django? 【发布时间】:2016-11-07 17:55:03 【问题描述】:我有一个使用 Gunicorn 和 nginx 的 Django 站点。有时,我会遇到需要调试的问题。过去我会关闭 Gunicorn 和 Nginx,进入我的 Django 项目目录并启动 Django 开发服务器(“python ./manage.py runserver 0:8000”),然后重新启动 Nginx。然后我可以插入 set_trace() 命令并进行调试。当我解决问题时,我会关闭 Nginx,然后重新启动 Gunicorn 和 Nginx。我很确定这是有效的。
不过,最近我开始遇到问题。现在发生的情况是,当我在断点处停止时,几分钟后,我停止的网页将更改并显示“404 Not Found”,如果我在调试器中再采取一步,我会看到这个错误:
- Broken pipe from ('127.0.0.1', 43742)
这发生在我通过域名访问的开发、登台和生产服务器上,例如“web01.example.com”(不是真正的示例)。
在远程服务器上调试 Django 应用程序的正确方法是什么?
谢谢。
【问题讨论】:
【参考方案1】:我发现了问题所在。首先,我观察到当我停在断点处时,页面总是在一分钟后超时,这表明如果 Web 服务器的响应时间超过 60 秒,Nginx 与 Web 服务器的连接就会超时。然后我找到了一个 Nginx proxy_read_timeout directive,它定义了这个超时。然后只需在我的 Nginx 配置文件中更改超时长度即可:
# /etc/nginx/sites-enabled/example.conf
http
server
...
location @django
...
# Set timeout to 1 hour
proxy_read_timeout 3600s;
...
...
完成此更改后,您需要重新加载 Nginx,而不是重新启动它,以使此更改生效。然后按照我上面的说明启动 Django,现在可以调试 Django 应用程序而不会超时。请务必在完成调试后删除超时设置,再次重新加载 Nginx,然后重新启动 Gunicorn。
【讨论】:
请问,这个值设置得太高有什么坏处?以上是关于Nginx 调试 Django 时出现“断管”?的主要内容,如果未能解决你的问题,请参考以下文章
更改代码时出现 Django、Nginx、FastCGI 缓存问题
使用 Apache/NginX 部署时出现 Django Bad Request(400) 错误
使用 AWS Elastic Beanstalk 部署 Django 应用程序时出现 502 Bad Gateway nginx/1.20.0 错误