Python 烧瓶插座的正确配置
我一直在遵循本教程,尝试使用Python 烧瓶插座的正确配置,python,nginx,gunicorn,flask-socketio,Python,Nginx,Gunicorn,Flask Socketio,我一直在遵循本教程,尝试使用nginx和gunicorn运行Flask SocketIO nginx server { location / { proxy_pass http://127.0.0.1:8000; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_se
nginx
和gunicorn
运行Flask SocketIO
nginx
server {
location / {
proxy_pass http://127.0.0.1:8000;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /socket.io {
proxy_pass http://localhost:8000/socket.io;
proxy_redirect off;
proxy_buffering off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
}
gunicorn\u config.py
bind = '127.0.0.1:8000'
workers = 2
worker_class = 'socketio.sgunicorn.GeventSocketIOWorker'
在Supervisor
中,我通过以下方式调用我的应用程序:
[program:gunicorn-couponmonk]
directory = ~/couponmonk_project
command =~/venv/py2.7/bin/python ~/venv/py2.7/bin/gunicorn -c ~/venv/py2.7/lib/python2.7/site-packages/gunicorn/gunicorn_config.py __init__.py
stdout_logfile = /var/log/gunicorn/couponmonk-std.log
stderr_logfile = /var/log/gunicorn/couponmonk-err.log
user = mint
使用此配置,我的应用程序(不使用Flask SocketIO)工作正常
我只是不知道如何使用socketIO
。如果我转到该地址,我会得到响应内部服务器错误
示例HTML/Javascript
()包含以下行:
var socket = io.connect('http://' + document.domain + ':' + location.port + namespace);
我有两个问题:
1)此变量应该指向什么地址?
2)我的配置(nginx
,gunicorn
)正确吗?
对不起,如果这个问题很傻的话。我只是不知道这一切该怎么办
谢谢你的帮助
**更新**
这是我尝试访问时nginx
error.log
文件的输出
不知道这有多大帮助,但我不知道还有什么地方可以找到额外的信息
我也很好奇为什么我可以访问这个:
并且仍然得到一个内部服务器错误
,而不是未找到
错误
我还根据米格尔下面的回答更新了我的supervisord.conf
文件:
supervisord.conf
[program:gunicorn-couponmonk]
directory = /home/giri/couponmonk_project
command = /home/giri/venv/py2.7/bin/python /home/giri/venv/py2.7/bin/gunicorn --worker-class socketio.sgunicorn.GeventSocketIOWorker __init__:app
stdout_logfile = /var/log/gunicorn/couponmonk-std.log
stderr_logfile = /var/log/gunicorn/couponmonk-err.log
user = mint
/var/log/gunicorn/couponmonk err.log
2015-06-20 14:30:11 [3821] [ERROR] Connection in use: ('127.0.0.1', 8000)
2015-06-20 14:30:11 [3821] [ERROR] Retrying in 1 second.
2015-06-20 14:30:12 [3821] [ERROR] Connection in use: ('127.0.0.1', 8000)
2015-06-20 14:30:12 [3821] [ERROR] Retrying in 1 second.
2015-06-20 14:30:13 [3821] [ERROR] Connection in use: ('127.0.0.1', 8000)
2015-06-20 14:30:13 [3821] [ERROR] Retrying in 1 second.
这个列表将持续一段时间 首先,我要提到的是,我根本不建议使用SocketIO。它在WebSocket上增加了一点有用的功能,但它不可能实现多个Worker的真正负载平衡(水平扩展),除非您将客户端与单个Worker绑定,或者使用Redis之类的工具在它们之间共享状态信息。我建议看一下: 原生WebSocket更简单、更容易,可以跨多个前端工作者进行扩展,以实现真正的负载平衡。实现聊天室逻辑所需的代码非常少 话虽如此,以下是你问题的答案: 1) 这个变量应该指向什么地址 您的命名空间将是“”。(根据Flask SocketIO的作者Miguel的说法,Javascript客户端会自动插入“socket.io”部分。) 因此,您的
io.connect
url应该是“”
2) 我的配置(nginx、gunicorn)正确吗
Ngnix配置似乎是正确的(尽管请参阅下一节)。如果您决定使用WebSoCube,您可以考虑添加<代码> PROXYRADIOTIMOUT 3600;代码>。否则,除非您有聊天协议,否则Nginx将每分钟删除一次WebSocket(默认值)。(米格尔还说,SocketIO有心跳来处理这个问题。)
Gunicorn配置不正确。使用SocketIO,您有两种选择:
workers=1
,以便每个SocketIO客户端与同一个worker进程对话ip hash
命令,该命令将根据客户端ip地址将客户端分配给工作进程内部服务器错误
,则可能在某个地方记录了异常。试着找出它,并把它添加到你的问题中
请注意,您无法通过在浏览器的地址栏中点击该URL来测试这一点–默认情况下,浏览器不会使用正确的WebSocket协议,对您没有任何帮助。必须使用Javascript API设置WebSocket连接
此外,尝试使用端口号点击该URL会绕过nginx——这可能不是您想要做的。Nginx通常侦听80/443并将请求转发到localhost:8000(这称为“反向代理”设置)。我建议您在没有Nginx和gunicorn的情况下让Flask SocketIO工作。一旦您可以通过本机gevent服务器使其工作,您就可以进入真正的设置 关于你的问题: 1) 这个变量应该指向什么地址 您的连接声明是正确的。Socket.IO将获取主机、端口和命名空间,并自行构建连接URL,包括
/Socket.IO
组件。您不需要在连接中指定该选项
2) 我的配置(nginx、gunicorn)正确吗
我认为nginx配置是正确的。您似乎直接从我的文档中复制了它,我已经验证了它是否有效
gunicorn配置我不确定,您没有显示足够的项目信息。我使用的命令(您应该在supervisor配置中使用)是:
gunicorn --worker-class socketio.sgunicorn.GeventSocketIOWorker module:app
其中,
module
是应用程序的主模块,app
是Flask应用程序实例的名称。你绝对应该使用一个worker,在使用SocketIO时不要使用两个worker。对于阅读这篇老文章的任何人来说,gunicorn——worker class SocketIO.sgunicorn.GeventSocketIOWorker模块:app
命令已经过时,正如Miguel在其中一篇文章中提到的那样。你的回答有很多不准确之处。它在WebSockets Socket上添加了一些有用的功能。IO可以在常规HTTP和WebSocket上工作,它为每个客户端选择最佳的传输。它还跟踪连接的用户,并允许服务器向所有用户或进入房间的用户组广播。有了WebSocket,就没有了
gunicorn --worker-class socketio.sgunicorn.GeventSocketIOWorker module:app