我想在Heroku上部署一些应用程序,它是Django与Tornado(Tornadio2)服务器实现WebSockets与socket。io协议。
所以,现在它在我的VPS服务器上运行良好,我使用Nginx使用location
节为Django或Tornado路由请求。
Nginx配置如下:
location /socket.io {
# Tornado app
proxy_pass http://localhost:8088;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
...
}
location / {
# Django app
...
}
那么,如何在Heroku上路由Django/Tornado的请求呢?看起来有必要使用自定义Buildpack安装Nginx?
或者可能有很好的方法实现异步套接字。在Django中使用io来避免路由请求?
让我从你的最后一个问题开始:
Django本质上是一个库,用于将HTTP请求处理成适当的HTTP响应。它不像uWSGI、Apache mod_wsgi、Tornado、Flask、gunicorn等那样提供一个执行上下文。所以你不能真正使用django来服务web sockets;django周围总是有一个执行上下文。或者可能有很好的方法实现异步套接字。在Django中使用io来避免路由请求?
当你将django站点部署到Heroku时,它通常会使用gunicorn作为执行环境。性能方面,这不是很酷:python服务器的性能。由于gunicorn的性能差与阻塞I/O有关,有些人在gunicorn前面安装nginx作为非阻塞层。这导致了nginx的构建包。
我认为这个不适合你的需要。Nginx是一个很棒的web服务器,但不包含python执行环境。所以你最终会在堆栈中引入第三个服务器:- nginx for HTTP django的gunicorn
- server #3 for websockets
我最好的建议是离开gunicorn和nginx,把所有的东西都放在Tornado中:web server, django的WSGI执行上下文,websockets的async上下文。
这个链接展示了如何在Heroku上运行Tornado。下一个链接展示了如何在Tornado中运行django。