502 Heroku上节点+ nginx代理设置中的错误网关

时间:2013-07-07 14:18:55

标签: node.js heroku nginx

我正在使用this buildpack在Heroku上使用节点+ nginx设置提供静态文件。在正确提供静态资产的同时,尝试通过节点提供内容会产生502 Bad Gateway。节点本身工作正常,nginx也是如此。问题是当两者需要一起工作时,我猜是因为我没有正确配置nginx upstream设置。 这是我的nginx conf:

worker_processes                1;
error_log                       /app/nginx/logs/error.log;
daemon                          off;

events {
    worker_connections          1024;
}


http {
    default_type                application/octet-stream;
    sendfile                    on;
    keepalive_timeout           65;
    gzip                        on;

    upstream node_conf {
          server                127.0.0.1:<%= ENV['PORT'] %>;
          keepalive             64;
        }

    server {
        listen                  <%= ENV['PORT'] %>;
        server_name             localhost;

        location / {
            root                html;
            index               index.html index.htm;
            proxy_redirect      off;
            proxy_set_header    X-Real-IP           $remote_addr;
            proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
            proxy_set_header    Host                $http_host;
            proxy_set_header    X-NginX-Proxy       true;
            proxy_set_header    Connection          "";
            proxy_http_version  1.1;
            proxy_pass          http://node_conf;
        }

        location ~* ^.+\.(jpg|gif|png|ico|css|js|html|htm)$ {
            root                /app;
            access_log          off;
            expires             max;
        }

        location /static {
            root                /app;
            index               index.html index.htm;
        }
    }
}

我的_static.cfg

SERVER_TYPE="nginx"
BUILD_WEB_ASSETS="true"

我的节点服务器:

var app = require( 'express ')()
app.get( '/', function(req, res) { res.send( 'This is from Node.' ) })
app.listen( process.env.PORT )

我还在/static中有一个示例html文件来测试nginx是否有效:

<html>This is from nginx.</html>

使用此配置,appname.herokuapp.com应显示“This is from Node”。但我获得了502

appname.herokuapp.com/static显示“这是来自nginx”,因此nginx和静态内容没有问题。

我在nginx upstream设置中尝试了server的每个值组合,但没有一个有效。 我还可以尝试向节点发出nginx代理请求吗?

这是我的Heroku Procfile以防万一:web: bin/start_nginx

2 个答案:

答案 0 :(得分:0)

我对Heroku并不熟悉,对Nginx也不太熟悉,但我会试一试:对我而言,看起来Nginx-config说Nginx和node.js应用程序正在使用相同的端口(&lt;%= ENV ['PORT']%&gt;)。

你想要的是Nginx监听传入的连接(通常是端口80),并将它们转发到node.js应用程序。以下是Nginx配置示例:

# the IP(s) on which your node server is running. I chose port 4000.
upstream xxx.xxx.xxx.xxx { #Your IP adress as seen from the internet
server 127.0.0.1:4000; #Your local node.js process
}
# the nginx server instance
server {
listen 0.0.0.0:80; #Have Nginx listen for all incoming connections on port 80
server_name my-site;
access_log /var/log/nginx/my-site.log;

location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://xxx.xxx.xxx.xxx/; #Your IP adress as seen from the internet
proxy_redirect off;
}
}

这个配置在我在客厅里托管的网络服务器上工作。祝你好运!

答案 1 :(得分:0)

Here's a README提供信息,让nginx和Node.js从我之前创建的项目中一起工作。还包括一个示例nginx.conf。

作为概述,基本上你只是用Node创建套接字然后设置nginx来管道那些上游。当我想运行多个Node进程并让nginx站在它前面时,我经常使用它。

它还包括开箱即用的socket.io,因此您可以使用它们来查看如何配置您的Node实例。