Nginx 代理一个大的端口范围到不同 IP 地址上的等效端口

Col*_*son 11 nginx

我想使用 nginx 将整个范围(9000-9999)代理到不同 IP 地址上的同一端口。nginx 是否可以自动绑定到一千个端口?不写 4000 行 nginx 配置就可以做到这一点吗?

rma*_*ter 11

您可以使用内置的server_port 变量执行此操作:

proxy_pass http://backend-host-name:$server_port;
Run Code Online (Sandbox Code Playgroud)

这将使请求进入的任何端口都代理到同一个后端端口。

所以你不需要 1000 个 proxy_pass 语句。但是,您可能对指令有问题。它不会接受一系列端口,因此您需要 1000 行以下形式:

listen 9000;
listen 9001;
listen 9002;
Run Code Online (Sandbox Code Playgroud)

该列表可以使用电子表格轻松生成。您可能还需要调整 nginx 允许的文件句柄数来处理此套接字数。Nginx 可以做到,限制可能在 OS 层。请参阅此处此处

我会说,尽管这似乎是一个有问题的设计。为什么需要 1000 个端口?使用主机名或 URL 的某些部分来区分请求不是更有意义吗?它将更具可扩展性 - 不需要 2000 个套接字作为基准。


Col*_*son 7

这是我最终做的事情:

server {
    server_name "~^port(?P<forwarded_port>9\d{3})\.example\.com$";
    location / { proxy_pass http://127.0.0.1:$forwarded_port; }
}
Run Code Online (Sandbox Code Playgroud)

这样,您可以简单地连接到http://port9034.example.com

  • 如果不小心使用,这可能会在系统上造成巨大的安全漏洞,并且很容易被利用。 (2认同)

小智 6

从 NGINX 版本 1.15.10 开始,该listen指令接受端口范围。

文档

端口范围 (1.15.10) 用连字符分隔的第一个和最后一个端口指定:

listen 127.0.0.1:12345-12399;
listen 12345-12399;
Run Code Online (Sandbox Code Playgroud)

因此,使用

server {
    listen 9000-9999;

    proxy_pass http://upstream-host:$server_port;
}
Run Code Online (Sandbox Code Playgroud)

应该做的伎俩。

需要注意的是,worker连接数也要相应调整,否则NGINX会报错:

# nginx -s reload
nginx: [emerg] 512 worker_connections are not enough for 1000 listening sockets
Run Code Online (Sandbox Code Playgroud)