在 Nginx 中,你可以使用正则表达式匹配域名,然后将流量导向不同的 upstream 服务器组。具体来说,Nginx 的 server 块支持正则表达式来匹配主机名(域名),通过 map 指令或者正则表达式的 server_name 配合 upstream 指定不同的后端服务。
以下是几种不同的实现方式:
- 使用 server_name 和正则表达式
你可以在不同的 server 块中使用正则表达式匹配不同的域名,然后将请求转发给不同的 upstream。
示例:
http {
upstream backend1 {
server backend1.example.com;
}
upstream backend2 {
server backend2.example.com;
}
upstream backend3 {
server backend3.example.com;
}
server {
listen 80;
server_name ~^www\.example1\.com$;
location / {
proxy_pass http://backend1;
}
}
server {
listen 80;
server_name ~^www\.example2\.com$;
location / {
proxy_pass http://backend2;
}
}
server {
listen 80;
server_name ~^www\.example3\.com$;
location / {
proxy_pass http://backend3;
}
}
}
- 使用 map 指令动态选择 upstream
如果你有大量的域名需要映射,可以使用 map 指令来动态选择 upstream,根据域名来设置代理目标。
示例:
http {
upstream backend1 {
server backend1.example.com;
}
upstream backend2 {
server backend2.example.com;
}
upstream backend3 {
server backend3.example.com;
}
# 使用 map 根据域名来映射 upstream
map $host $backend_upstream {
~^www\.example1\.com$ backend1;
~^www\.example2\.com$ backend2;
~^www\.example3\.com$ backend3;
}
server {
listen 80;
location / {
proxy_pass http://$backend_upstream;
}
}
}
解释:
• 正则表达式匹配:~^www\.example1\.com$ 用于匹配带有特定域名的请求。~ 表示使用正则表达式,^ 和 $ 分别匹配字符串的开头和结尾。
• map 指令:通过 $host(表示请求中的域名)动态选择合适的 upstream,然后使用 proxy_pass 将流量转发给对应的后端。
- 使用 if 指令结合 proxy_pass
如果你想在单个 server 块中处理多个域名,可以结合 if 语句使用 proxy_pass 选择不同的 upstream。
示例:
http {
upstream backend1 {
server backend1.example.com;
}
upstream backend2 {
server backend2.example.com;
}
upstream backend3 {
server backend3.example.com;
}
server {
listen 80;
location / {
if ($host ~* ^www\.example1\.com$) {
proxy_pass http://backend1;
}
if ($host ~* ^www\.example2\.com$) {
proxy_pass http://backend2;
}
if ($host ~* ^www\.example3\.com$) {
proxy_pass http://backend3;
}
}
}
}
解释:
• if 语句:可以根据域名条件设置 proxy_pass,但请注意 Nginx 对 if 的使用有时效率较低,建议尽量使用 map 或 server_name 配合 upstream。
总结:
• 如果域名匹配规则较少,直接使用正则表达式的 server_name 是一种简单有效的方法。
• 如果需要动态选择不同的 upstream,可以使用 map 指令来根据请求的域名映射到不同的后端服务器。
• if 指令可以用于简单的条件逻辑,但要小心使用,map 通常效率更高。
你可以根据实际需求选择合适的方式来配置 Nginx。