为什么Node.js作为后端Node.js应用程序的代理,而不是Nginx?

时间:2016-01-20 15:52:58

标签: linux node.js nginx

我有一个简单的nginx配置文件

server {
    listen       80 default_server;
    listen       [::]:80 default_server;
    server_name  ec2-x-x-x-x.compute-1.amazonaws.com;
    #root        /home/ec2-user/dashboard;

    # Load configuration files for the default server block.
    # include /etc/nginx/default.d/*.conf;
    location / {
     proxy_pass http://127.0.0.1:4000;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}

但是当我发送请求时,它说它无法访问服务器。

服务器在端口4000中工作正常,而sudo netstat -tulpn给了我这个

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      6512/nginx: master
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1640/sshd
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1247/master
tcp6       0      0 :::80                   :::*                    LISTEN      6512/nginx: master
tcp6       0      0 :::22                   :::*                    LISTEN      1640/sshd
tcp6       0      0 :::3000                 :::*                    LISTEN      15985/node
tcp6       0      0 ::1:25                  :::*                    LISTEN      1247/master
tcp6       0      0 :::4000                 :::*                    LISTEN      3488/node
udp        0      0 0.0.0.0:68              0.0.0.0:*                           484/dhclient
udp        0      0 127.0.0.1:323           0.0.0.0:*                           451/chronyd
udp        0      0 0.0.0.0:1510            0.0.0.0:*                           484/dhclient
udp6       0      0 ::1:323                 :::*                                451/chronyd
udp6       0      0 :::1458                 :::*                                484/dhclient

此外,当我使用node作为代理服务器时

var http = require('http'),
                    httpProxy = require('http-proxy');
httpProxy.createProxyServer({target:'http://localhost:4000'}).listen(80);

这很好用。

关于我做错了什么的任何想法?

1 个答案:

答案 0 :(得分:2)

感谢有用的netstat输出。问题似乎是你的Node.js应用程序只监听IPv6,如输出中的:::*所示。

Nginx正试图通过IPv4连接它,它没有收听。

您的Node.js代理可能有效,因为它在两端共享相同的问题。 :)

您没有分享您正在使用的Node.js版本。 Some versions had an issue where attempting to set up an IPv4 connection would result in an IPv6 connection。你遇到了这样的错误,或者你的Node.js应用实际上配置错误,无法收听IPv6。

如果端口400上的Node.js应用程序已正确配置为侦听IPv4,您将在netstat输出中看到此类条目:

tcp        0      0 127.0.0.1:4000      0.0.0.0:*       LISTEN      12345/node