如何解决如何使用 Twisted Framework 为用 Python 编写的 Websocket 应用程序提供服务
我使用 Twisted Framework 编写了一个 websocket 服务器应用程序。我对此很陌生,正在尝试弄清楚如何将其作为应用程序提供服务,以便我可以使用 NGINX 对其进行反向代理。
应用程序的主体如下所示:
if __name__ == "__main__":
#Clear redis cache
R.flushdb()
log.startLogging(sys.stdout)
contextFactory = ssl.DefaultOpenSSLContextFactory('keys/server.key','keys/server.crt')
ServerFactory = BroadcastServerFactory
factory = BroadcastServerFactory("wss://127.0.0.1:8080")
factory.protocol = BroadcastServerProtocol
resource = WebSocketResource(factory)
root = File(".")
root.putChild(b"ws",resource)
site = Site(root)
reactor.listenSSL(8080,site,contextFactory)
reactor.run()
我的理解是我需要创建一个 WSGI 应用程序,但我对如何做到这一点感到困惑。我不确定如何将此程序更改为 WSGI。当我使用 Django 和 Flash 时,他们有一个 WSGI 文件,但这个新项目只是一个使用 Twisted 框架的 Python 文件。
抱歉,我有点难以解释这一点。
解决方法
我所做的是更改代码,使其不再包含 if 语句,如下所示:
#New imports
from twisted.application import internet,service
#Bottom of file
R.flushdb()
log.startLogging(sys.stdout)
contextFactory = ssl.DefaultOpenSSLContextFactory('keys/server.key','keys/server.crt')
ServerFactory = BroadcastServerFactory
factory = BroadcastServerFactory("wss://127.0.0.1:8080")
factory.protocol = BroadcastServerProtocol
resource = WebSocketResource(factory)
application = service.Application("picserver")
service = internet.TCPServer('8080',factory)
resource = WSGIResource(reactor,reactor.getThreadPool(),factory)
root = File(".")
root.putChild(b"ws",resource)
site = Site(root)
reactor.listenSSL(8080,site,contextFactory)
service.setServiceParent(application)
reactor.run()
我将文件重命名为“server.tap”,但我认为这没有必要。代码更改然后允许我使用以下命令将程序作为守护程序运行:
twistd -y server.py
然后我在 /etc/systemd/system 中创建了一个 .service 文件,如下所示:
[Unit]
Description=picserver startup script
After=network.target
[Service]
User=django
Group=www-data
Environment="DBNAME=mydb"
Environment="DBUSER=dbuser"
Environment="DBPASSWORD=password"
ExecStart=/home/<username>/Documents/python/environments/gameservertest/bin/python /home/<username>/Documents/python/environments/gameservertest/bin/twistd -y /home/<username>/Documents/python/picturegameserver/server.tap
WorkingDirectory=/home/<username>/Documents/python/picturegameserver/
Restart=always
[Install]
WantedBy=multi-user.target
我现在可以使用“systemctl”将其作为服务运行,并且可以连接在服务器本地运行的前端。目前,我认为我不需要配置 Nginx 来反向代理它,因为我可以让前端在同一台服务器上运行。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。