【问题标题】:error: [Errno 32] Broken pipe when running flask with nginx at localhost错误:[Errno 32] 在本地主机上使用 nginx 运行烧瓶时管道损坏
【发布时间】:2015-10-12 23:25:44
【问题描述】:

我有一个 Flask 应用程序,它使用单独的 socket.io 服务器进行实时应用程序。我在单独的端口上运行它们并使用 nginx 在同一个端口上测试它们。

upstream httpapp {
    ip_hash;
    server 127.0.0.1:7777;
}
upstream socketioapp {
    ip_hash;
    server 127.0.0.1:5555;
}
server {
    listen       5000;
    server_name  localhost;
        location / {
                proxy_pass http://httpapp;
                proxy_http_version 1.1;
                proxy_set_header Host $host;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
        }
        location /socket.io {
                proxy_pass http://socketioapp;
                proxy_http_version 1.1;
                proxy_set_header Host $host;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
        }
}

这个设置在过去半年的开发中一直很好,直到有一天,我一直无缘无故地出现这个错误。这是我访问 localhost:5000 时遇到的错误。

127.0.0.1 - - [13/Oct/2015 07:58:08] "GET /static/js/main.js HTTP/1.1" 200 -
----------------------------------------
Exception happened during processing of request from ('127.0.0.1', 53388)
Traceback (most recent call last):
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 295, in _handle_request_noblock
    self.process_request(request, client_address)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 321, in process_request
    self.finish_request(request, client_address)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 334, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 657, in __init__
    self.finish()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 716, in finish
    self.wfile.close()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py", line 283, in close
    self.flush()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py", line 307, in flush
    self._sock.sendall(view[write_offset:write_offset+buffer_size])
error: [Errno 32] Broken pipe
----------------------------------------

错误仅发生在 2.4MB 静态 javascript 文件上,这是开发环境中未压缩的大小。我知道静态文件很大,但之前一直运行良好。

最重要的观察 - 访问 localhost:7777 是完全正常的。 但是,它不适合测试应用程序,因为它需要实时功能。这个想法是将烧瓶应用程序和实时应用程序放在同一个端口上,并使用默认的 socket.io init。 我没有尝试过的一件事是将 socket.io 设置更改为 localhost:5555。

我正在使用带有flask_script 样式配置的python manage.py runserver 运行flask,因为它将所有目的都用作开发环境。 (我没有接触过 EC2 的生产环境,因为它运行良好,我不想搞砸业务。)我记得唯一导致此问题的操作是将端口号从 5000 -> 80 更改并运行nginx 使用 sudo。这听起来无关紧要,但确实让我感到惊讶。

在互联网上进行的数小时研究仅解释了错误的定义,而不是解决方案。为了接近解决这个问题,我采取了哪些措施?

【问题讨论】:

  • 我猜这里有一些时间。很可能是 Nginx -> Flask。如果您使用的是开发服务器,这也可能导致问题。 Nginx 日志在说什么?请记住,开发服务器不是多线程的,因此可能会导致文件如此大的问题。

标签: python nginx flask


【解决方案1】:

我有一个 Django 应用程序并在过去 2 个月内遇到了同样的问题,但一直无法解决。

我刚刚更新了我的 nginx.conf 文件:

proxy_read_timeout 400s;

根据http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_read_timeout,默认超时时间为60s。我把我的更新到400s。到目前为止,它工作得很好!

【讨论】:

    猜你喜欢
    • 2014-04-28
    • 1970-01-01
    • 1970-01-01
    • 2019-10-30
    • 1970-01-01
    • 2021-01-04
    • 2017-04-22
    • 2014-09-28
    • 2013-04-16
    相关资源
    最近更新 更多