Nginx多个Node JS Express应用的多个位置

时间:2018-08-25 15:10:01

标签: node.js nginx proxy nginx-location

我有以下配置:

location / {
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header X-NginX-Proxy true;
  proxy_pass http://localhost:3000; # this is where our node js app runs at
  proxy_set_header Host $http_host;
  proxy_cache_bypass $http_upgrade;
  proxy_redirect off;
}

[SERVER_IP]/localhost:3000的代理,以便基本上将所有内容路由到node js应用。

然后我继续编写了另一个nodejs应用,该应用运行在端口5000而不是3000上:

location / {
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-NginX-Proxy true;
      proxy_pass http://localhost:3000; # this is where our node js app runs at
      proxy_set_header Host $http_host;
      proxy_cache_bypass $http_upgrade;
      proxy_redirect off;
    }

location /testing {
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-NginX-Proxy true;
      proxy_pass http://localhost:5000; # this is where our node js app runs at
      proxy_set_header Host $http_host;
      proxy_cache_bypass $http_upgrade;
      proxy_redirect off;
    }

但是,如果我转到[SERVER_IP]/testing,它将以/ testing的方式路由到我的第一个应用程序,然后生成Express JS消息:“无法获取/ testing”。

我更改了顺序,没有问题地重启了nginx。知道为什么它行不通吗?我假设nginx是路由到Node JS之前的第一个实例。 如果我更改location / { ... }的端口,则可以获取第二个应用程序,但是我希望它们彼此并行运行。

谢谢

3 个答案:

答案 0 :(得分:0)

由于server_ip/testing/位置块匹配,因此您将始终进入该位置块。此时,NGINX不会转到下一个块,因为它已经找到了与请求匹配的块。

您应将第二个位置块移到顶部,并使用=,就像这样

location = /testing { }

将请求转发到nodeApp2:5000

阅读NGINX文档here,以了解NGINX定位块如何与正则表达式规则一起工作。

答案 1 :(得分:0)

在您的默认文件中,仅更改 proxy_pass 中的端口号,并将位置保留为 /

默认外观的示例:

server {
  listen 80 default_server;
  listen  [::]:80  default_server;
  root /root/port-two/build;
  server_name www.myfirstsite.com myfirstsite.com;
  location / {
    proxy_pass http://127.0.0.1:8001;
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_max_temp_file_size 0;
    client_max_body_size 10m;
    client_body_buffer_size 128k;
    proxy_connect_timeout 90;
    proxy_send_timeout 90;
    proxy_read_timeout 90;
    proxy_buffer_size 4k;
    proxy_buffers 4 32k;
    proxy_busy_buffers_size 64k;
    proxy_temp_file_write_size 64k;
  }
}
server {
  listen 80;
  listen [::]:80;
  server_name www.mysecondsite.com mysecondsite.com;
  location / {
    proxy_pass http://127.0.0.1:8002;
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_max_temp_file_size 0;
    client_max_body_size 10m;
    client_body_buffer_size 128k;
    proxy_connect_timeout 90;
    proxy_send_timeout 90;
    proxy_read_timeout 90;
    proxy_buffer_size 4k;
    proxy_buffers 4 32k;
    proxy_busy_buffers_size 64k;
    proxy_temp_file_write_size 64k;
  }
}

并确保每个应用程序的.env文件都有一个PORT变量,该变量与您在默认文件中为其赋予的编号相对应。

.env for myfirstsite.com

PORT=8001

.env for mysecondsite.com

PORT=8002

答案 2 :(得分:0)

您可能会发现它实际上是第二个生成Express JS消息的应用程序:“无法获取/测试”。

Nginx proxy_pass指令的行为会有所不同,具体取决于您定义它们的方式上的细微差别。如果您指定位置块并将proxy_pass传递到未定义路径的服务器,则整个客户端请求uri将传递到上游服务器。

http://localhost/testing将代理到http://localhost:5000/testing

但是,如果您指定附加任何内容的proxy_pass指令,则Nginx会将客户端请求中与位置块匹配的部分替换为您附加到proxy_pass指令的路径。

因此,最后只加了一个斜杠:

position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);

现在Nginx会这样做:

http://localhost/testing-> http://localhost:5000/

这:

location /testing/ {
    proxy_pass http://localhost:5000/;

会这样做:

http://localhost/testing/bar/-> http://localhost:5000/foo/bar/

总而言之,将proxy_pass传递到裸服务器:ip传递整个客户端请求uri,添加单个斜杠以删除uri的一部分,或添加其他内容代替。

另一个答案表明这是由您的位置信息块顺序引起的,这是不正确的,对回答者给予应有的尊重。我建议您从他们发布的链接中阅读信息,但不要遵循他们的建议,因为它们会稍微出现对Nginx选择位置块本身的方式感到困惑。