Nginx:连接到上游时,与 xxx.xxx.xxx.184:3000 的连接失败(22:参数无效),

Nginx:连接到上游时,与 xxx.xxx.xxx.184:3000 的连接失败(22:参数无效),

这是我第一次在 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

对于如此频繁地更改服务器地址,我深感抱歉。

答案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;

相关内容