![使用具有多个端口的 nginx 上游组](https://linux22.com/image/696007/%E4%BD%BF%E7%94%A8%E5%85%B7%E6%9C%89%E5%A4%9A%E4%B8%AA%E7%AB%AF%E5%8F%A3%E7%9A%84%20nginx%20%E4%B8%8A%E6%B8%B8%E7%BB%84.png)
我想对多个端口使用相同的上游定义:
upstream production {
server 10.240.0.26;
server 10.240.0.27;
}
server {
listen 80;
server_name some.host;
location / {
proxy_pass http://production:1234;
}
}
server {
listen 80;
server_name other.host;
location / {
proxy_pass http://production:4321;
}
}
使用该配置nginx -t
会抛出:upstream "production" may not have port 1234
并返回退出代码 1。
当我尝试将proxy_pass
URL (或其中的部分)定义为变量时,例如:
set $upstream_url "http://production:1234"
set $upstream_host production;
set $upstream_port 1234;
proxy_pass $upstream_url;
# or
proxy_pass http://production:$upstream_port;
# or
proxy_pass http://$upstream:$upstream_port;
Nginx 尝试通过解析器解析我的上游的名称:
*16 no resolver defined to resolve production, client: ...., server: some.host, request: "GET / HTTP/1.1", host: "some.host"
对我来说,proxy_pass 文档听起来好像这根本不应该发生;
还可以使用变量指定服务器名称、其端口和传递的 URI:
proxy_pass http://$host$uri; 甚至像这样:
proxy_pass $request; 在这种情况下,在描述的服务器组中搜索服务器名称,如果没有找到,则使用解析器确定。
使用 nginx 版本测试:
- 1.6
- 1.9
- 1.10
- 1.11
我是不是漏掉了什么?有办法解决这个问题吗?
答案1
您必须在server
中的每个条目中定义端口upstream
。如果不定义,nginx 将把它设置为80
。所以server 10.240.0.26;
实际上意味着server 10.240.0.26:80;
。
不过,您可以定义多个上游块:
upstream production_1234 {
server 10.240.0.26:1234;
server 10.240.0.27:1234;
}
upstream production_4321 {
server 10.240.0.26:4321;
server 10.240.0.27:4321;
}
server {
listen 80;
server_name some.host;
location / {
proxy_pass http://production_1234;
}
}
server {
listen 80;
server_name other.host;
location / {
proxy_pass http://production_4321;
}
}
另一种选择是配置本地 DNS 以将主机名解析production
为多个 IP,在这种情况下 nginx 将全部使用它们。
http://nginx.org/r/proxy_pass:如果一个域名解析为多个地址,则所有地址将以循环方式使用。
server {
listen 80;
server_name some.host;
location / {
proxy_pass http://production:1234;
}
}
答案2
当您使用上游时,端口在上游块中定义:
upstream production {
server 10.240.0.26:8080;
server 10.240.0.27:8081;
}
换句话说,nginx 将proxy_pass
参数解析为上游组或host:port
对。当您使用变量作为参数时,它只会解析为host:port
对。