在 Heroku 上部署 Django\Tornado

Posted

技术标签:

【中文标题】在 Heroku 上部署 Django\\Tornado【英文标题】:Deploy Django\Tornado on Heroku在 Heroku 上部署 Django\Tornado 【发布时间】:2014-09-12 14:53:29 【问题描述】:

我想在 Heroku 上部署一些应用程序,它是带有 Tornado(Tornadio2) 服务器的 Django,用于实现带有 socket.io 协议的 WebSockets。

所以,现在它在我的 VPS 服务器上运行良好, 我使用 nginxlocation 部分来路由 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 中实现异步 socket.io 以避免路由请求的好方法?

【问题讨论】:

【参考方案1】:

让我从你的最后一个问题开始:

或者可能有在 Django 中实现异步 socket.io 以避免路由请求的好方法?

Django 本质上是一个用于将 HTTP 请求处理为适当的 HTTP 响应的库。它不提供像 uWSGI、Apache mod_wsgi、Tornado、Flask、gunicorn 等这样的执行上下文。所以你不能真正使用 django 来服务 web 套接字; django 周围总会有一个执行上下文。

当您将 django 站点部署到 Heroku 时,它通常会使用 gunicorn 作为执行环境。性能方面,这不是很酷:performance of python servers。因为gunicorn的性能差和阻塞I/O有关,所以有人在gunicorn前面安装了nginx作为非阻塞层。这导致了nginx buildpack。

我认为这不符合您的需求。 Nginx 是一个很棒的 Web 服务器,但不包含 python 执行环境。所以你最终会在你的堆栈中引入第三台服务器:

用于 HTTP 的 nginx django 的独角兽 用于 websocket 的服务器 #3

我最好的建议是离开 gunicorn 和 nginx,将所有东西放在 Tornado 中:web 服务器、django 的 WSGI 执行上下文、websockets 的异步上下文。

此链接显示如何run Tornado on Heroku。下一个链接显示如何run django in Tornado。

【讨论】:

以上是关于在 Heroku 上部署 Django\Tornado的主要内容,如果未能解决你的问题,请参考以下文章

在 Heroku 上部署 React 和 Django

在 Heroku 上部署 asgi 和 wsgi

如何在 Heroku 上部署 Flutter Web

在heroku上部署django网站时出错

在 heroku 上部署 typeorm/typescript 应用程序

如何在Heroku上部署时配置/设置命令