如何使多个端口与 nginx proxy_pass 和 Node Express 协同工作?

如何使多个端口与 nginx proxy_pass 和 Node Express 协同工作?

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

目前一切工作如下

http://example.com:8000/index.html (This is one node server running a site)
http://example.com:8001/index.hmtl (this is another node server running a different site)

我希望能够让用户输入 URL 路径并自动将他们引导到正确的网站,而无需他们指定端口。例如:

http://example.com/site1/inedx.html (This is one node server running a site at port 8000)
http://example.com/site2/index.html (this is another node server running a different site at port 8001)

我一直试图使用 nginx proxy_pass 规则来实现这一点,但无法正常工作。本质上,nginx 重新路由到正确的 express 服务器,但 express 应用中的所有路由都中断了,因为它缺少端口。

所以当我去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/*;
            }
}

应用程序.js

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

答案1

site/当您通过 nginx 为和设置代理时site2/,nginx 将透明地删除路径,除非您在指令中明确设置它proxy_pass

例如:

location /site1/ {
    proxy_pass http://11.11.11.11:8000;
}

当您访问 时example.com/site1,nginx 将根据上面指定的位置块捕获该请求,并将其传递给 express。Express 会将该请求视为//site1已被删除。

因此,如果您想维护/site1,可以:

  • 在您的配置中指定“相对路径” /site1,并将其贯穿到您的整个代码中。
  • 或者,将 nginx 更改为proxy_pass http://11.11.11.11:8000/site1

相关内容