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。

相关推荐
desssq10 分钟前
ubuntu 18.04 泰山派编译报错
linux·运维·ubuntu
Dovis(誓平步青云)1 小时前
《Linux 基础指令实战:新手入门的命令行操作核心教程(第一篇)》
linux·运维·服务器
维尔切2 小时前
Shell 脚本编程:函数
linux·运维·自动化
云泽8082 小时前
从ENIAC到Linux:计算机技术与商业模式的协同演进
linux·运维·服务器
wheeldown2 小时前
【Linux】【实战向】Linux 进程替换避坑指南:从理解 bash 阻塞等待,到亲手实现能执行 ls/cd 的 Shell
linux·运维·bash
ZeroNews内网穿透2 小时前
企业远程访问方案选择:何时选内网穿透,何时需要反向代理?
运维·服务器·网络·python·安全
看好多桂花树2 小时前
Nginx 优化
运维·nginx
羑悻的小杀马特3 小时前
Docker 容器化部署核心实战:从镜像仓库管理、容器多参数运行到 Nginx 服务配置与正反向代理原理解析
nginx·docker·容器·镜像仓库
NiKo_W3 小时前
Linux 深入理解权限
linux·运维·服务器
zzywxc7873 小时前
自动化测试框架是软件测试的核心基础设施,通过预设规则和脚本自动执行测试用例,显著提高测试效率和覆盖率。
运维·人工智能·自动化·prompt·测试用例·流程图