通过mod_wsgi在WebFaction上运行Flask-SocketIO

时间:2016-03-23 02:02:26

标签: apache sockets flask mod-wsgi webfaction

我使用mod_wsgi在Webfaction上部署了Flask应用程序。我的应用程序非常简单,但实现了Flask-SocketIO,这给了我麻烦。我的代码在我的localhost上工作正常,但现在它在我的Webfaction服务器上运行,客户端无法连接到我的socket。我不太确定我的问题来自哪里 - 我假设我没有正确设置我的apache配置文件,但这可能不是真的。

在客户端,我收到GET&上的400(错误请求)错误。 POST调用websocket。在建立连接之前,我看到一个警告,通知我套接字已关闭。我偶尔也会在WebSocket握手过程中收到错误。

我的apache httpd.conf文件如下:

return Promise.resolve(agendaItemsJson);

我看过一些关于proxy_module& amp; proxy_http_module但我不确定我是否需要它,如果是这样,究竟如何配置它。关于这个问题的任何指导都将非常感谢!

1 个答案:

答案 0 :(得分:1)

关于proxy_moduleproxy_http_module的内容是使用Apache作为后端websockets应用程序的前端代理。它不适用于你想要做的事情。

mod_wsgi不适合提供websocket应用程序。请勿使用它 - 而是使用Deployment section of the Flask-SocketIO docs中建议的部署选项之一。

例如,要在WebFaction上使用第一个推荐选项(即嵌入式服务器),请首先安装eventlet模块。我假设你已经安装了Flask和Flask-SocketIO。

接下来,通过WebFaction控制面板安装“自定义websockets app侦听端口”应用程序。记下应用程序指定的端口,然后将应用程序分配给控制面板中的网站。您无需打开应用程序的端口。

接下来,将Flask-SocketIO应用配置为在分配给websockets应用的端口上运行。最简单的方法是将端口传递给socketio.run,例如:

if __name__ == '__main__':
    socketio.run(app, port=12345)

在您的javascript中,请按以下方式连接:

var socket = io.connect('http://' + document.domain + ':' + location.port + namespace);

最后,只需运行应用程序:

python2.7 whatever.py

此时,您的应用将在您分配给您设置的网站的任何域名上启动并运行。

当您加载网站时,JS会从document.domainlocation.port中整理出连接信息。如果您打开浏览器的开发工具(Chrome检查器或其他任何工具),您将看到与ws://yourdomain.com/建立的websockets连接。

希望有所帮助!