waynblog

nginx 连续监听一千个端口。。。

最近遇到个需求,要让 Nginx 监听 8000-8999 这 1000 个端口。一开始想着写 1000 行配置,后来发现有更简单的办法。

1. 先介绍一些 "蠢" 方法

手写多个 listen

server {
    listen 8000;
    listen 8001;
    listen 8002;
    ...
    listen 8999;
}

这样写没问题,但太蠢了。1000 个端口要写 1000 行。

脚本生成配置

如果 Nginx 版本太老,不支持端口范围,可以用脚本:

#!/bin/bash
CONFIG_FILE="/etc/nginx/conf.d/multi_ports.conf"

echo"server {" > $CONFIG_FILE
for port in {8000..8999}; do
echo"    listen $port;" >> $CONFIG_FILE
done
cat >> $CONFIG_FILE <<'EOF'
    server_name _;
    location / {
        proxy_pass http://backend;
    }
}
EOF

nginx -t && nginx -s reload

生成的配置文件会很大,但至少不用手写。

2. 直接用端口范围(最简单)

Nginx 1.15.10 之后支持这个语法:

server {
    listen 8000-8999;
    server_name _;

    location / {
        proxy_pass http://backend;
    }
}

就一行,搞定 1000 个端口。

3. 几个坑

1. 版本问题

先看看你的 Nginx 版本:

nginx -v

低于 1.15.10 就老实用脚本吧。

2. 文件描述符不够

监听 1000 个端口,系统默认限制可能不够:

ulimit -n 65535

生产环境改 /etc/security/limits.conf:

* soft nofile 65535
* hard nofile 65535

3. 防火墙别忘了

# firewalld
firewall-cmd --permanent --add-port=8000-8999/tcp
firewall-cmd --reload

# iptables
iptables -A INPUT -p tcp --dport 8000:8999 -j ACCEPT

4. 日志会很多

要么按日期切分,要么直接关掉:

access_log /var/log/nginx/multi_ports_$date.log;
# 或者
access_log off;

4. 怎么选

  • 能升级就升级到新版本,用端口范围语法
  • 升级不了就用脚本生成配置
  • 别手写,真的

端口范围语法内存占用更小,配置文件更清爽,改起来也方便。除非你的 Nginx 版本实在太老,否则没理由不用。

👨‍💻欢迎关注我的公众号「程序员wayn」,加入我的技术群,一起深入探讨技术、共享信息差!

FastAPI开发AI应用系列文章:

作者原创技术好文推荐: