使用 Nginx 将不同的子域名反向代理到不同位置的典型方式是为每个子域名安装一个唯一的服务器,如下所示:
server {
server_name subdomain1.example.com;
location / {
proxy_pass http://hostname1:port1;
}
}
server {
server_name subdomain2.example.com;
location / {
proxy_pass http://hostname2:port2;
}
}
是否可以通过在单个服务器块内指定不同的位置来在单个服务器块(例如 server_name .example.com,没有任何指定的子域)内实现相同的结果?
答案1
对的,这是可能的。
首先,设置map
将域映射到proxy_pass
目的地:
map $host $dest {
www1.example.com 192.168.10.10:8001;
www2.example.com 192.168.10.11:8002;
default 192.168.10.12;
}
server {
server_name *.example.com;
proxy_pass http://$dest;
}
当 nginx 收到请求时,它会转到proxy_pass
指令。然后它$dest
使用 进行解析map
,将不同的虚拟主机名映射到目的地。然后 nginx 使用解析后的目标代理请求。
请记住正确设置默认目标。每个公共 Web 服务器都会接收各种域名的请求。通常,您希望在未知虚拟主机上返回 404。
答案2
如果您指定不同的位置,那么结果将不会相同,因为location /
两个server
块中的结果相同。