这是我第一次在 serverfault 上提问。如果我漏掉了什么,请告诉我!
我已经尝试解决这个问题两天了。仍然找不到解决方案。以下是我的场景:
服务器 A
- 端口 3000 上的节点应用程序 A
- 端口 80 上的 Nginx
- 当我去时
/hello
,应用程序B应该由服务器B提供服务
服务器 B
- 节点应用程序 B 在端口 3000
当我访问时/hello
,我得到了502 Bad Gateway
。
在我的错误日志中,我看到了以下内容:
connect() to 162.243.104.184:3000 failed (22: Invalid argument) while connecting to upstream, client: 75.72.170.8, server: 107.170.64.149, request: "GET /hello/ HTTP/1.1", upstream: "http://162.243.104.184:3000/hello/", host: "107.170.64.149"
以下是服务器 A 的 nginx 配置:
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
server_name 107.170.64.149;
location / {
proxy_http_version 1.1;
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_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_pass http://107.170.64.149:3000;
proxy_redirect off;
}
location /hello {
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_set_header Host $host;
proxy_pass http://162.243.104.184:3000;
proxy_bind 162.243.104.184;
proxy_redirect off;
}
}
在我的 中/etc/sysctl.conf
,我添加了:
net.ipv4.ip_nonlocal_bind=1
允许进程绑定到非本地地址,因为我之前收到此错误:
bind(162.243.104.184) failed (99: Cannot assign requested address) while connecting to upstream, client: 75.72.170.8, server: 107.170.64.149, request: "GET /hello/ HTTP/1.1", upstream: "http://162.243.104.184:3000/hello/", host: "107.170.64.149"
任何指导或帮助都将不胜感激!谢谢!
编辑1
我的新 nginx 配置:
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
server_name 107.170.39.161;
location / {
proxy_http_version 1.1;
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_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_pass http://107.170.39.161:3000;
proxy_redirect off;
}
location /hello {
rewrite /hello(.*) /$1 last;
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_set_header Host $host;
proxy_pass http://162.243.33.9:3000;
proxy_redirect off;
}
}
编辑2
服务器 A
- http://107.170.113.66/
- 该服务器为 appA 提供服务
- 当我去时
/
,我应该看到SSR Landing Page
哪个是从 appA 提供的 - 当我访问时
/hello
,我应该看到hello
哪些服务是由服务器 B 提供的。但我There is no route for the path: /hello
在浏览器控制台中没有看到任何对服务器 B 的请求
服务器 B
- http://107.170.98.207:3000/
- 该服务器为 appB 提供服务
- 当我转到 时
/hello
,我看到了该页面。
对于如此频繁地更改服务器地址,我深感抱歉。
答案1
您确实希望将发往服务器 B 的传出请求设为源自 吗162.243.104.184
?根据您提供的信息,我认为没有必要这样做,因此该proxy_bind
语句是不必要的,实际上只会导致问题。
proxy_bind
将其分配162.243.104.184
给服务器 B 的请求的源 IP 地址,因此服务器 B 将回复发送回该 IP 地址,也就是返回到其自身。
/hello
然后,如果您想要转到 的请求http://162.243.104.184:3000/
,您需要添加一个rewrite
指令来改变 URI:
rewrite /hello(.*) /$1 last;