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应用系列文章:
作者原创技术好文推荐: