如何让多个端口使用nginx proxy_pass和Node Express?

时间:2014-10-05 16:13:55

标签: node.js express nginx

我有多个节点实例在不同的端口上运行。 (8000,8001等)我也在端口80上运行nginx。我想做的是允许用户通过单个域名进入我的网站,然后通过不同的URL可以访问不同的节点服务器

目前一切工作如下

http://example.com:8000/index.html(这是运行站点的一个节点服务器) http://example.com:8001/index.hmtl(这是另一个运行不同站点的节点服务器)

我希望能够做的是允许用户键入url路径并自动将它们定向到正确的站点,而无需指定端口。例如:

http://example.com/site1/inedx.html(这是在端口8000运行站点的一个节点服务器) http://example.com/site2/index.html(这是另一个在端口8001运行不同站点的节点服务器)

我一直在尝试使用nginx proxy_pass规则来实现这一点,但我无法让它工作。基本上nginx重新路由到正确的快速服务器,但是然后我在快递应用程序中的所有路由都会中断,因为它缺少端口。

所以,当我转到http://example.com/site1/index.html时,我需要http://example.com/index.html。任何帮助将不胜感激。我已经粘贴了nginx.conf的相关部分和下面的示例快速路径。

nginx.conf

server {
            listen 80;
            server_name 11.11.11.111;
            root /home/ubuntu;

            location /site1/ {
                    proxy_pass http://11.11.11.111:8000/;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_set_header Host $proxy_host;
                    proxy_set_header X-NginX-Proxy true;
                    proxy_pass http://11.11.11.111:8000/;
                    proxy_redirect http://11.11.11.111/* http://11.11.11.111:8000/*;
            }
            location /site2/ {
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_set_header Host $proxy_host;
                    proxy_set_header X-NginX-Proxy true;
                    proxy_pass http://11.11.11.111:8001/;
                    proxy_redirect http://11.11.11.111/* http://11.11.11.111:8001/*;
            }
}

app.js

app.get('/', function(req, res){
    res.redirect('/index.html');
});

1 个答案:

答案 0 :(得分:0)

在我对 nginx proxy_pass 的不可否认的经验中,我发现当您使用 proxy_pass 即可。对服务器块中指定的确切 server_name 的确切位置块路径的任何请求都将正确传递,即:

http://11.11.11.11/site1/
http://11.11.11.11/site1/index.html

但以下请求将失败:

http://11.11.11.11/site1
http://example.com/site1
http://example.com/site1/
http://example.com/site1/index.html

因为它们与位置块路径完全匹配。此外,除非另有说明,否则该路径下的任何子目录都将由nginx提供服务。例如:

http://11.11.11.11/site1/ <-- Succeeds
http://11.11.11.11/site1/js <-- Fails

你必须明确使用nginx。您需要在服务器上指定应用程序所在的 root 路径,使用类似regex的位置路径规范,并使用重写,以便nginx知道在代理路径之后不要处理任何事情:

server {
    listen 443 ssl;

    server_name myserver;
    root /var/html/node; # The parent directory of where your apps live

    location ^~ /app1/ {
        rewrite ^/app1(.*) /real/app1/path$1;
        proxy_pass https://127.0.0.1:8000;
        proxy_redirect https://myserver/app1 /real/app1/path;
    }

    location ^~ /app2/ {
        rewrite ^/app2(.*) /real/app2/path$1;
        proxy_pass https://127.0.0.1:8001;
        proxy_redirect https://myserver/app2 /real/app2/path;
    }
}

/ real / app [x] / path 应该是 / var / html / node 下的真实目录,并且应该可以由运行nginx的用户访问。您的配置可能需要一些调整才能工作,但这应该可以帮助您完成任务。

相关问题