websocket 在Apache中运行Tornado

zpgglvta  于 2022-11-11  发布在  Apache
关注(0)|答案(4)|浏览(189)

我的最终目标是使用python实现一个WebSocket服务器。
我通过在python脚本中导入tornado来实现这一点。我还在apache中安装了mod_wsgi,并且their script输出Hello World!,所以WSGI看起来工作得很好。据我所知,Tornado也工作得很好。
当我使用tornado's wsgi "Hello, world" script时出现此问题:

import tornado.web
import tornado.wsgi
import wsgiref.simple_server

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")

if __name__ == "__main__":
    application = tornado.wsgi.WSGIApplication([
        (r"/", MainHandler),
    ])
    server = wsgiref.simple_server.make_server('', 8888, application)
    server.serve_forever()

首先,我得到一个500错误,日志告诉我WSGI找不到“应用程序”。
因此,我删除了if __name__ == "__main__",页面将无限加载。
我假设这是因为server.serve_forever(),所以我删除了它,试图看到Hello,world
但是现在我只得到了404: Not Found,这不是我的apache 404页面,而且我知道服务器可以找到我的主.wsgi文件...

s8vozzvw

s8vozzvw1#

你不能在Tornado的WSGIApplication中使用websocket。要使用Tornado的websocket支持,你必须使用Tornado的HTTPServer,而不是apache。

vu8f3i0k

vu8f3i0k2#

WSGIApplication处理程序相对于Web服务器根目录。如果您的应用程序URL是/myapp,则您的“application”必须如下所示:

application = tornado.wsgi.WSGIApplication([
    (r"/myapp", MainHandler),
    (r"/myapp/login/etc", LoginEtcHandler),
])

哦,看起来文档很糟糕(和往常一样),__name__在apache下运行时看起来像这样:_mod_wsgi_8a447ce1677c71c08069303864e1283e .
因此,正确的“Hello World”python脚本将如下所示:
/var/www/wsgi-scripts/myapp.wsgi

import tornado.web
import tornado.wsgi
import wsgiref.simple_server

class MainHandler(tornado.web.RequestHandler):
    def get(self):
         self.write('Hello World')

application = tornado.wsgi.WSGIApplication([
    (r"/myapp", MainHandler),
])

在apache配置中(不是.htaccess):
WSGIScriptAlias /myapp /var/www/wsgi-scripts/myapp.wsgi

ee7vknir

ee7vknir3#

要在apache中使用tornado,请在apache中添加mod-wsgi插件。

apt-get install libapache2-mod-wsgi

使用.wsgi编写tornado wsgi服务器注意:不要使用__name__
配置apache.conf以运行您的服务器。要进行配置,请使用thismod-wsgi指南

uqxowvwt

uqxowvwt4#

如果您仍然想将它们结合起来,您可以使用Apache作为代理,它将只是用户前面的第一个点-但实际上将流量重新路由到您的本地Tornado服务器(In / Out)
以我的例子为例,我的Apache监听端口443(一些默认配置),然后我在端口8080运行我的tornado,并给出一个路径-将重定向


# File: conf.d/myapp.conf

<VirtualHost *:80>
    ErrorLog  "logs/myapp_error_log"

    ProxyPreserveHost On
    ProxyRequests off
    ProxyPreserveHost On

    <Proxy *>
        Require all granted
    </Proxy>

    RewriteEngine on
    RewriteCond %{REQUEST_METHOD} ^TRACE
    RewriteRule .* - [F]

    ProxyPassMatch    "/myapp/(.*)" "http://localhost:8080/myapp/$1"
    ProxyPassReverse  "/myapp/"     "http://localhost:8080/myapp/"

</VirtualHost>

如果您使用的是RedHat“系列”操作系统,还应启用转发网络连接的功能:

setsebool -P httpd_can_network_connect 1

相关问题