Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 502节点中存在坏网关+;Heroku上的nginx代理设置_Node.js_Heroku_Nginx - Fatal编程技术网

Node.js 502节点中存在坏网关+;Heroku上的nginx代理设置

Node.js 502节点中存在坏网关+;Heroku上的nginx代理设置,node.js,heroku,nginx,Node.js,Heroku,Nginx,我使用node+nginx设置在Heroku上提供静态文件。虽然静态资产得到了正确的服务,但尝试通过节点提供内容会导致502坏网关。节点本身工作正常,nginx也可以。问题是,当这两个需要一起工作时,我想这是因为我没有正确配置nginx上游设置。 这是我的nginx配置: worker_processes 1; error_log /app/nginx/logs/error.log; daemon

我使用node+nginx设置在Heroku上提供静态文件。虽然静态资产得到了正确的服务,但尝试通过节点提供内容会导致
502坏网关
。节点本身工作正常,nginx也可以。问题是,当这两个需要一起工作时,我想这是因为我没有正确配置nginx
上游
设置。 这是我的nginx配置:

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;
        }
    }
}

我的节点服务器:

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>
这是来自nginx的。

在这个配置中,
appname.herokuapp.com
应该显示“这是来自节点的”。但是我得到的是
502

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

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


以下是我的Heroku
Procfile
,以备不时之需:
web:bin/start\u nginx

我对Heroku并不太熟悉,而且对nginx还很陌生,但我要试一试:在我看来,nginx配置好像是说nginx和node.js应用程序使用同一个端口()

您需要的是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;
}
}
这个配置在我的起居室中托管的Web服务器上为我工作。祝你好运

提供了让nginx和Node.js从我不久前创建的项目中协同工作的信息。还包括一个示例nginx.conf

总而言之,基本上您只是使用Node创建套接字,然后将nginx设置为向上游输送这些套接字。当我想运行多个节点进程并让nginx站在前面时,我通常会使用它


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

我已尝试将端口80用于nginx,但Heroku拒绝许可。以下是我从您的配置中得到的信息:
nginx:[emerg]bind()到0.0.0.0:80失败(13:权限被拒绝)
Ok,正如我所说,很遗憾,我没有使用Heroku的任何经验,但您似乎需要使用nginx。如果您将nginx设置为监听127.0.0.1:,并将node.js进程保持在我发布的配置中的端口4000上,这是否有效?我厌倦了处理Heroku的BS系统(我联系了他们的支持人员,他们自己也不知道),并迁移到Digital Ocean上的一个droplet。但如果我稍后再回到Heroku,我会尝试一下。
# 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;
}
}