如何在Heroku上设置Nginx来服务从端口80到端口5000的流量?

时间:2018-12-23 05:49:32

标签: nginx heroku buildpack

更新:显然,端口没有问题。我能够重新绑定端口并在端口80上为我的应用程序提供服务,但是我没有解决问题。问题是我的应用程序实际上没有在Heroku上正确部署。这是通过Heroku构建日志显示的内容:

enter image description here

原始问题:我在尝试在Heroku上设置Flask应用程序时遇到问题。我想让Flask服务器在端口5000上运行,并建立一个Nginx代理以从80端口向5000端口提供流量,以便我仍然可以从Heroku访问该网页(默认情况下,该端口在80端口提供流量)。

当前,我已经在我的Heroku配置中添加了heroku-buildpack-runit和heroku-buildpack-nginx,但是我不确定如何正确启动Nginx来完成我想要的事情。我的Procfile看起来像:

    web: bin/start-nginx gunicorn app:app

这没有按照我的意愿去做。实际上,我不确定它是否真的在做任何事情。

注意,gunicorn是我用来启动Flask应用程序的东西。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

在Heroku上,您无需选择要使用的端口。您必须使用Heroku通过PORT环境变量分配给您的端口。您也不需要Nginx来运行Flask。只需使用gunicorn或其他WSGI Web服务器。

来自the documentation(添加了重点):

  

Web服务器

     

在Heroku之外,有时会在Web服务器容器内执行Web应用程序。例如,PHP应用程序可以作为模块在Apache HTTPD中运行,或者Java应用程序可以在Tomcat中运行。

     

在Heroku上,应用程序是完全独立的,并且不依赖于将运行时的Web服务器注入执行环境来创建面向Web的服务。 每个Web进程仅绑定到一个端口,并侦听该端口上的请求。 Heroku将port to bind to分配为PORT环境变量。

     

这通常是通过使用依赖项声明将Web服务器库添加到应用程序来实现的,例如Tornado for Python ,Unicorn for Ruby或Jetty for Java和其他基于JVM的语言。这完全发生在用户空间内,即在应用程序代码内。与Heroku签订的合同是将进程绑定到端口以处理请求。 Heroku’s routers然后负责将HTTP请求定向到正确端口上的进程。

使用环境变量(如果存在)的一种简单方法是执行以下操作:

import os

# Set up your Flask app here

port = os.getenv('PORT', default='5000')
app.run('0.0.0.0', port=port)

您似乎已经using gunicorn,这很好。您的Procfile应该包含以下内容:

web: gunicorn my_project.wsgi

其中my_project.wsgi是您的WSGI文件的名称。