连接到上游时,nginx 连接被拒绝

连接到上游时,nginx 连接被拒绝

我有一台服务器,上面部署了一个 API (Sinatra)。我在端口 9292 上运行该 API,并将请求代理到它。

我还需要部署静态 javascript 文件及其支持资源。我在同一台服务器上执行此操作。

以下所有信息均已匿名化。

API访问端点是这样的:

server {
    listen 80;
    server_name api.myapp.com;

    location / {
            proxy_pass http://localhost:9292;
    }
}

我为 JS 提供服务的端点是:

server {
    listen 80;
    server_name xsa.myapp.com;

    location / {
            root /data/mydir/xsa;
    }
}

您在下面错误中看到的“localhost:3003”服务器就是我所指的 JS 所在的地方。

2018/11/23 23:31:27 [error] 18720#0: *32 connect() failed 
(111: Connection refused) while connecting to upstream, 
client: 255.255.255.7, server: api.myapp.com,
request: "GET /api/v1/sub/sub_ABCXYZ/info?token%3D56f51132-
406b-4e06-a600-7379876446ed HTTP/1.1", upstream:
"http://[::1]:9292/api/v1/sub/sub_ABCXYZ/info?token%3D56f51132
-406b-4e06-a600-7379876446ed", host: "api.myapp.com",
 referrer: "http://xsa.myapp.com/src/selector.html?
mfid=sub_ABCXYZ&location=http://localhost:3003/"

总结一下:

  • 虚拟机“x”上的 Sinatra API,端口为 9292
  • VM“x”上的 nginx 服务器在端口 80 上为 API 提供代理,以处理来自“api.myapp.com”的请求
  • 同一个 nginx 服务器还在端口 80 上提供一个 javascript 文件,用于处理进入“xsa.myapp.com”的请求

我可以在浏览器中正常查看 JS,因此它确实被提供了。它在实例化时执行的动态操作导致了错误。

我还可以看到 9292 上的 Sinatra 服务器确实收到了请求并返回了 200。看来问题出在这之后了。因此,上游连接似乎并没有被拒绝。我仔细检查了此回复是否与 JS 在本地提供(并且有效)时的响应完全相同。

* 更新 *

即使 JS 在本地运行并且正常工作,实际上也会发生“连接被拒绝”错误,因此看起来该错误是一个转移注意力的借口。

答案1

您收到此错误消息是因为您的 Sinatra 应用程序没有监听 localhost 的默认 IPv6 地址,::1而是监听传统的 IPv4 地址127.0.0.1

由于您指定 nginx 上游为localhost,因此 nginx 首先尝试 IPv6 地址,但由于您的应用服务器未侦听此地址,因此 nginx 收到“连接被拒绝”信息。然后,它会在 IPv4 上重试连接,并成功并为您的应用程序提供服务。

由于这会带来性能问题,并且 IPv6 优于已弃用的 IPv4,因此您应该重新配置 Sinatra 应用程序以监听 IPv6。例如,

set :bind, '::1'

特别是,你应该不是绑定到127.0.0.1。

您也可以删除绑定主机,因为如果您使用的是 Thin(在生产环境中应该如此)或 Webrick(在开发环境中,如果您忘记安装 gem install thin),它将默认在 IPv6 本地主机上监听。

(另外,您已明确配置 nginx 以不是监听 IPv6,这会在以后甚至现在给您带来类似的问题。你也应该解决这个问题,趁你还在的时候。)

相关内容