我想使用 nginx 作为负载均衡器,将负载分配到 2 台服务器上。我以前做过这个,但有一个特定的要求。
我需要根据传入端口号将请求转发到服务器(从 nginx 负载均衡器),但不想在 /etc/nginx/conf.d/load-balancer.conf 文件中输入每个条目,并且想知道是否有办法根据传入端口号对其进行正则表达式处理?
目前,作为示例,我有这个可以正常工作:
# Port 444
upstream backend444 {
server 10.0.0.1:444;
server 10.0.0.2:444;
}
server {
listen 444 ssl;
server_name domain.com;
ssl_certificate /etc/letsencrypt/live/domain.com/cert.pem;
ssl_certificate_key /etc/letsencrypt/live/domain.com/privkey.pem;
location / {
proxy_pass https://backend444;
}
}
# Port 445
upstream backend445 {
server 10.0.0.1:445;
server 10.0.0.2:445;
}
server {
listen 445 ssl;
server_name domain.com;
ssl_certificate /etc/letsencrypt/live/domain.com/cert.pem;
ssl_certificate_key /etc/letsencrypt/live/domain.com/privkey.pem;
location / {
proxy_pass https://backend445;
}
}
是否有办法让我使用正则表达式或变量来表示端口号,以便我可以匹配端口号并使用相同的端口号重定向请求?
如果失败了,还有其他方法吗?我有很多端口需要添加。传入端口只需转到目标服务器上的相同端口即可。
谢谢。
答案1
首先:我不相信listen
nginx 的指令可以在其自身配置中动态设置。您最终应该将这些配置作为静态内容放入配置文件中(/etc/nginx/conf.d/load-balancer.conf
)
第二:如何让这个文件自动填充,而无需您手动填充?
a)如果你使用 ansible 作为配置管理,你可以使用 jinja2 ( ansible 使用的模板引擎)来实现
b) 您可以创建一个 shell 脚本来填充 nginx 配置文件的内容。以下是您可以执行的操作的示例:
#!/bin/bash
# Source file ( List of backend ports )
FILE="${1}"
# Loop through each line from the file and parse the values
for PORT in $( cat ${FILE} ); do
cat >> /tmp/nginx_lb_config_file <<EOF
# Begin Port ${PORT}
upstream backend${PORT} {
server 10.0.0.1:${PORT};
server 10.0.0.2:${PORT};
}
server {
listen ${PORT} ssl;
server_name domain.com;
ssl_certificate /etc/letsencrypt/live/domain.com/cert.pem;
ssl_certificate_key /etc/letsencrypt/live/domain.com/privkey.pem;
location / {
proxy_pass https://backend${PORT};
}
}
# End Port ${PORT}
EOF
done
将其保存在名为 filltheconfig.sh 的文件中,并在该文件上设置执行位(chmod +x filltheconfig.sh
)
注意:源文件每行仅包含一个端口。例如:
user@host:~$ cat sourcefile
444
445
446
447
希望这有帮助!:)