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 错误

Django Admin 文件上传时出现“连接重置”错误

Django/React/Firebase - 上传大文件时出现 CORS 错误

打开 Chrome 开发人员工具时出现 Django CSRF 令牌错误