【问题标题】:Running Flask-SocketIO on WebFaction through mod_wsgi通过 mod_wsgi 在 WebFaction 上运行 Flask-SocketIO
【发布时间】:2016-03-23 02:02:26
【问题描述】:

我已经使用 mod_wsgi 在 Webfaction 上部署了一个 Flask 应用程序。我的应用程序非常简单,但确实实现了 Flask-SocketIO,这给我带来了麻烦。我的代码在我的本地主机上运行良好,但现在它在我的 Webfaction 服务器上运行,客户端无法连接到我的套接字。我不太确定我的问题来自哪里——我假设我没有正确设置我的 apache 配置文件,但这可能不是真的。

在客户端,我在对 websocket 的 GET 和 POST 调用中都收到 400(错误请求)错误。我间歇性地看到一条警告,通知我在建立连接之前套接字已关闭。我偶尔也会收到一条错误消息,指出 WebSocket 握手期间出现错误。

我的apache httpd.conf文件如下:

ServerRoot "/home/< user >/webapps/< my_app >/apache2"

LoadModule authz_core_module modules/mod_authz_core.so
LoadModule dir_module        modules/mod_dir.so
LoadModule env_module        modules/mod_env.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule mime_module       modules/mod_mime.so
LoadModule rewrite_module    modules/mod_rewrite.so
LoadModule setenvif_module   modules/mod_setenvif.so
LoadModule wsgi_module       modules/mod_wsgi.so
LoadModule unixd_module      modules/mod_unixd.so

Listen 18161
KeepAlive On
SetEnvIf X-Forwarded-SSL on HTTPS=1
ServerLimit 1
StartServers 1
MaxRequestWorkers 5
MinSpareThreads 1
MaxSpareThreads 3
ThreadsPerChild 5

WSGIDaemonProcess < my_app > processes=2 threads=12 python-path=/home/< user >/webapps/< my_app >:/home/< user >/webapps/< my_app >/lib/python2.7
WSGIProcessGroup < my_app >
WSGIRestrictEmbedded On
WSGILazyInitialization On

WSGIScriptAlias / /home/< user >/webapps/< my_app >/wsgi.py

我看过一些关于 proxy_module 和 proxy_http_module 的帖子,但我不太确定我是否需要它,如果需要,如何准确配置它。对此问题的任何指导将不胜感激!

【问题讨论】:

    标签: apache sockets flask mod-wsgi webfaction


    【解决方案1】:

    关于proxy_moduleproxy_http_module 的内容用于将Apache 用作后端websockets 应用程序的前端代理。它不适用于您正在尝试做的事情。

    mod_wsgi 并不真正适合为 websocket 应用程序提供服务。不要使用它 - 而是使用Deployment section of the Flask-SocketIO docs 中推荐的部署选项之一。

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

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

    接下来,配置您的 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 连接。

    希望有帮助!

    【讨论】:

    • 对于我的 Flask-SocketIO 应用,我需要从控制面板创建另一个应用吗?
    猜你喜欢
    • 1970-01-01
    • 2020-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-05
    • 2023-03-10
    • 2020-04-05
    相关资源
    最近更新 更多