【问题标题】:Have you managed to make your node nginx proxy setup on Heroku work?您是否设法让 Heroku 上的节点 nginx 代理设置正常工作?
【发布时间】:2013-07-18 16:37:59
【问题描述】:

您是否设法让 Heroku 上的节点 + nginx 代理设置正常工作?

请您告诉我,在执行“git push heroku master”之前,您是如何组织目录结构和每个目录中的文件的?您使用了哪个 buildpack?

每次执行“git push heroku master”时,我都会收到消息“推送被拒绝,未检测到支持 Cedar 的应用程序”。我在“/conf”目录下放了一个“nginx.conf.erb”文件。

谢谢。

【问题讨论】:

  • 我猜是因为 Heroku 不允许您安装 nginx 代理等。Heroku 提供了一个 Web 服务器和一个缓存,您可以将其配置为附加组件。
  • 如果你只想要一个代理,你可以使用 substacks bouncy 或 nodejitsus http 代理代替 nginx

标签: node.js heroku nginx proxy buildpack


【解决方案1】:

我在 heroku 上为许多项目使用了 Node.js + NGINX 设置。 这样,您可以让 nginx 处理提供静态文件、缓存、代理到其他服务器以及代理到多个节点进程。

使用多构建包构建包 (https://github.com/ddollar/heroku-buildpack-multi)。
它允许您指定一个引用多个构建包的 .buildpacks 文件。 在我的 .buildpacks 文件中,我使用默认的 Heroku Node buildpack,以及我重建的 nginx buildpack 的一个分支,以包含 SSL 支持。

https://github.com/theoephraim/nginx-buildpack.git
https://github.com/heroku/heroku-buildpack-nodejs.git

nginx buildpack 使用一个可以引用 ENV 变量的 nginx.conf.erb 文件。您必须告诉它在名为“PORT”的环境变量中由 heroku 指定的端口进行侦听

listen <%= ENV["PORT"] %>;

然后你让你的节点服务器在你选择的任何端口上启动,比如 5001,并且在你的 nginx 配置中,你可以设置一个代理传递给你的节点应用程序:

location / {
  proxy_pass      http://127.0.0.1:5001;
}

注意 - 您的 procfile 需要使用特殊的 start-nginx 命令(nginx buildpack 的一部分),然后调用您传递的任何其他内容。就我而言,我永远使用来运行我的节点应用程序:

web: bin/start-nginx ./node_modules/.bin/forever app.js

在你的主节点文件中,你必须在它成功启动后创建一个文件,向 nginx buildpack 发出信号,它应该开始监听

fs.openSync('/tmp/app-initialized', 'w');

自述文件@https://github.com/theoephraim/nginx-buildpack中有关于如何使用nginx buildpack的完整说明

【讨论】:

  • 如何创建另一个在 5000 端口上运行的节点应用程序?根据我的经验,您只能使用一个端口,即 ENV 默认端口。如果不是这种情况,请告诉我如何做到这一点。谢谢。
  • 你可以启动几个“应用程序”在你想要的任何端口上运行。关键是 Heroku 只会在他们选择的单个端口上传递 http 流量(设置为 PORT env var)。因此,如果您想向 Web 公开多个应用程序,则需要使用正在侦听该端口的 nginx 代理将流量传递到节点应用程序。
  • 在 Heroku 上,您无法根据我的经验为我指定特定端口,以下工作:upstream node_entry { server unix:/tmp/nginx.socket fail_timeout=0; } 服务器 { 听 ; server_name 本地主机; keepalive_timeout 5; location / { [其他设置...] proxy_pass node_entry;然后就可以连接了:Server.listen('/tmp/nginx.socket');
  • 您的回答对我有所帮助,但我被困在了其他地方。如果你看一下会非常好:stackoverflow.com/questions/42787420/…
【解决方案2】:

在 Heroku 上,一旦安装了 buildpack,我就成功地在生产中使用了这个设置:

upstream node_entry {
    server unix:/tmp/nginx.socket fail_timeout=0;
}
server {
    listen  <%= ENV['PORT'] %>;
    server_name localhost;
    keepalive_timeout 5;
    location / {
        [other settings…]
        proxy_pass http://node_entry;
    }
}

然后,在您的 app.js 文件中,您可以连接:

Server.listen(‘/tmp/nginx.socket’);

【讨论】:

  • 对我不起作用。得到buildpack=nginx at=exit process=nginx 然后State changed from starting to crashed
  • @paradite 你能发布你的节点代码吗?它会工作:-)
  • @droid-zilla - 如果可能的话,您介意发布您的 git 存储库吗?我想设置一个反向代理,以便我的客户端代理调用位于不同 heroku dyno/server/url 上的 api。或者,如果您知道我可以查看的示例?谢谢
【解决方案3】:

article 包含有关将 nginx 设置为 Heroku 上的代理以及 OpenResty、Lua 和 LuaRocks 的说明。没有提到 node.js。它使用这个buildpack。自己没试过,但好像有人搞定了。

【讨论】:

    猜你喜欢
    • 2020-02-26
    • 2013-07-04
    • 1970-01-01
    • 2016-01-21
    • 1970-01-01
    • 1970-01-01
    • 2020-09-29
    • 2017-08-13
    • 1970-01-01
    相关资源
    最近更新 更多