我想使用 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 个套接字作为基准。
这是我最终做的事情:
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;
小智 6
从 NGINX 版本 1.15.10 开始,该listen指令接受端口范围。
从文档:
端口范围 (1.15.10) 用连字符分隔的第一个和最后一个端口指定:
Run Code Online (Sandbox Code Playgroud)listen 127.0.0.1:12345-12399; listen 12345-12399;
因此,使用
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)
| 归档时间: |
|
| 查看次数: |
18779 次 |
| 最近记录: |