【问题标题】:Serving Django with SocketIOServer through uWSGI + apache通过 uWSGI + apache 使用 SocketIOServer 服务 Django
【发布时间】:2012-08-10 09:48:59
【问题描述】:

如何通过 Apache 通过 uWSGI 使用 gevent-socketio 的 SocketIOServer 为我的 Django 应用程序提供服务?

我有以下 uWSGI .ini 文件:

[uwsgi]
socket = 127.0.0.1:3031
master = true
processes = 2
env = DJANGO_SETTINGS_MODULE=demo.settings
module = app:serve

然后我有以下app.py

from gevent import monkey
from socketio.server import SocketIOServer
import django.core.handlers.wsgi
import os
import sys

monkey.patch_all()

PORT = 3031

os.environ['DJANGO_SETTINGS_MODULE'] = 'demo.settings'

def serve():
    application = django.core.handlers.wsgi.WSGIHandler()
    SocketIOServer(('', PORT), application, namespace="socket.io").serve_forever()

但它只是一直在加载,基本上我的问题是我如何告诉 uWSGI 在服务时使用 SocketIOServer?

【问题讨论】:

    标签: python django uwsgi gevent


    【解决方案1】:

    目前尚不清楚您是否希望 uWSGI 为两者提供服务,或者您希望使用 socketio 服务器的附加进程。

    通常,您不能在同一进程中将阻塞应用程序(如 django)与非阻塞应用程序(如基于 gevent)混合使用,即使您使用猴子补丁,您的数据库适配器也不会被猴子补丁(除非您使用本机 python -adapter,这在 django 中并不常见)。

    所以我想您想将 SocketIOServer 生成为不同的进程。只需将最后两行移出 serve() 以便 uwsgi 导入器将解析/运行两者

    【讨论】:

    • 啊,会试试的。我不在乎 SocketIOServer 是否在一个单独的进程中,只要它可以处理来自客户端的 websocket 请求。会尽快回复您,谢谢!
    • 什么都没有发生,只是继续加载...:/
    • 显然你不能将它绑定到同一个 uWSGI 端口,你必须确保它在生成后将控制权交还给 uWSGI。您确定从主 wsgi 文件外部生成它不是更好吗?您可以使用 uWSGI 的 attach-daemon 选项来生成外部进程
    • 谢谢,但是我们的 sysad 最终同意使用 nginx + gunicorn。 :)
    猜你喜欢
    • 2023-03-03
    • 2014-02-05
    • 2013-10-05
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    相关资源
    最近更新 更多