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。

相关推荐
Cx330❀29 分钟前
【Linux网络】网络层协议 IP :从网络层原理到 Linux 内核源码
linux·运维·服务器·网络·tcp/ip·ai·ai编程
志栋智能1 小时前
运维超自动化的变更管理实践
运维·自动化
全栈攻略1 小时前
Docker 中 ROS2 工作流 Topic 验证与常用命令指南
运维·docker·容器
Gl�ria1 小时前
Linux 清理日志常用命令
linux·运维·服务器
j7~3 小时前
【Linux网络加餐(二)】《进程组,会话,控制终端,作业控制和守护进程》---详解
linux·运维·服务器·守护进程·会话·进程组·控制终端
名字还没想好☜3 小时前
Docker 数据卷实战:volume、bind mount、tmpfs 到底怎么选,数据持久化与权限坑
运维·docker·容器·kubernetes
天道jimmy3 小时前
VulnHub 系列:Prime,1
linux·运维·服务器
Lumistory4 小时前
从OPPO长安研发中心看头部科技企业的照明运维选择
大数据·运维·人工智能·光照贴图
好评1244 小时前
【Linux】数据链路层
linux·运维·网络
新时代牛马5 小时前
Linux 信号处理完整篇:从sigaction、掩码到内核发送与可重入排障
linux·运维·信号处理