将 Nginx 扩展至 45k 以上

将 Nginx 扩展至 45k 以上

我遇到一种情况,我的 nginx 服务器有许多长时间运行的打开连接,但是在一定数量的连接之后它开始抛出错误“无法为上游分配请求的地址”。

我已经将底层系统限制增加到最大值(增加打开文件限制、可用端口范围等),就 CPU/RAM 而言,系统运行良好,似乎瓶颈只是打开的连接/端口的数量。

真的没有办法单身的nginx 服务器能够处理 10 万或 20 万个并发开放连接吗?我知道可以添加更多机器,但这会破坏诸如 nginx 速率限制之类的功能。

答案1

您引用的错误消息表明问题不在于传入连接的数量,而是传出连接,从 nginx 到后端 Web 应用程序。

您可能在配置中的某个地方做过类似这样的事情:

proxy_pass http://127.0.0.1:8000;

请记住,TCP 连接由源地址和端口以及目标地址和端口唯一标识。在这种情况下,您似乎已经用尽了源端口号来建立唯一连接。

显而易见的直接解决方法是切换到 UNIX 域套接字。您的应用程序还必须在 UNIX 域套接字上进行监听。您可能还需要安排提高 nginx 的打开文件数限制(例如LimitNOFILE=在其 systemd 单元中提高)以及您的 Web 应用程序的打开文件数限制。通过这种方式可以建立的连接数基本上是无限的。

proxy_pass unix:/run/myapp/myapp.sock;

如果您无法让应用使用 UNIX 域套接字,那么一个不太明显的解决方法是让您的 Web 应用监听多个地址/端口对,并让 nginx 在它们之间轮换。这将使您可以建立的连接数增加一倍。如果您的 Web 应用已经监听 IPv4 和 IPv6 连接,那么一个非常快速且便宜的解决方法是让 nginx 在它们之间轮换。您还可以修改您的应用以监听多个端口。

upstream myapp {
   server 127.0.0.1:8000;
   server [::1]:8000;
}

或者

upstream myapp {
    server 127.0.0.1:8000;
    server 127.0.0.1:8001;
    server 127.0.0.1:8002;
}

然后

proxy_pass http://myapp;

答案2

每台机器都受到底层网络中可用套接字数量的限制,而 tcp/up 使用 2 字节字来定义连接的套接字号。因此,连接数的物理限制为 65536。

相关内容