我有以下配置:
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 / { ... }
的端口,则可以获取第二个应用程序,但是我希望它们彼此并行运行。
谢谢
答案 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选择位置块本身的方式感到困惑。