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,您有两种选择:

  • 在gunicorn中设置
    workers=1
    ,以便每个SocketIO客户端与同一个worker进程对话
  • 将nginx配置更改为使用
    ip hash
    命令,该命令将根据客户端ip地址将客户端分配给工作进程
  • 使用Redis或其他一些数据库允许每个工作人员共享状态信息(尽管目前还不清楚是否有人在为Gevent SocketIO工作)
  • 这些选择是强制的,因为SocketIO使用有状态的设置机制,当您尝试水平扩展时,该机制会中断。有关更多信息,请参阅本期:

    这里有一个链接,指向SocketIO关于它的文档:

    如果出现
    内部服务器错误
    ,则可能在某个地方记录了异常。试着找出它,并把它添加到你的问题中

    请注意,您无法通过在浏览器的地址栏中点击该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