nginx-根据端口号重定向

nginx-根据端口号重定向

我想使用 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

首先:我不相信listennginx 的指令可以在其自身配置中动态设置。您最终应该将这些配置作为静态内容放入配置文件中(/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

希望这有帮助!:)

相关内容