nginx按照域名正则表达式将流量引入到不同的upstream

在 Nginx 中,你可以使用正则表达式匹配域名,然后将流量导向不同的 upstream 服务器组。具体来说,Nginx 的 server 块支持正则表达式来匹配主机名(域名),通过 map 指令或者正则表达式的 server_name 配合 upstream 指定不同的后端服务。

以下是几种不同的实现方式:

  1. 使用 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;
    }
}

}

  1. 使用 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 将流量转发给对应的后端。
  1. 使用 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。

相关推荐
乘云数字DATABUFF4 天前
5分钟部署开源APM Databuff:OpenTelemetry全链路追踪入门实战
运维·后端
荣--6 天前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计
江华森6 天前
动手实战学 Docker — 从零到集群编排完全指南
运维
Avan_菜菜7 天前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
SelectDB8 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode9 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户03284722207010 天前
如何搭建本地yum源(上)
运维
ping某11 天前
为什么 Nginx 明明监听了 80,转发后端时却用了 4xxxx 端口?
后端·nginx
大树8813 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠13 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql