我有一个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运行烧瓶,因为它将所有目的作为开发环境服务。 (我没有触及EC2的生产环境,因为它运行正常,我不想搞乱业务。)我唯一记得的导致这一点的行动是将端口号从5000改为 - > 80并使用sudo运行nginx。这听起来无关紧要,但它确实让我感到惊讶。
互联网上的研究时间只解释了错误的定义,而不是解决方案。我采取了哪些行动来接近解决这个问题?
答案 0 :(得分:-1)
我有一个Django应用程序并且在过去的两个月内遇到了同样的问题,但一直未能弄明白。
我刚刚更新了我的nginx.conf文件:
O(n)
根据http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_read_timeout,默认超时为60秒。我将我的更新为400s。到目前为止它工作得很好!