前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Nginx 基于请求头的分发

Nginx 基于请求头的分发

作者头像
BUG弄潮儿
发布2024-06-08 08:43:13
2230
发布2024-06-08 08:43:13
举报
文章被收录于专栏:JAVA乐园

基于请求头分发适用于多个集群场景;也适应进行服务灰度发布的场景。

1、基于host分发

适用于一个公司有多个网站,一个网站设置为一个集群

代码语言:javascript
复制
#nginx分发器设置
http {

    upstream web1 {   # 名为web1的反向代理群组
        server server1;
    }
    
    upstream web2 {   # 名为web2的反向代理群组
        server server2;
    }
    
    server {    # web1虚拟主机
        listen 80;
        server_name www.web1.com;    # 基于域名分发必须有域名
        location / {
            proxy_pass http://web1; 
        }
    }
    
    server {    # web2虚拟主机
        listen 80;
        server_name www.web2.com;    # 基于域名分发必须有域名 
        location / {
            proxy_pass http://web2; 
        }
    }
}

2、基于开发语言分发

适用于混合开发的网站,某些大型网站既有php也有jsp

代码语言:javascript
复制
# 分发器上nginx配置
http {
    upstream php {
        server server1; 
    }
    
     upstream asp {
        server server2;
    }
    
    upstream html {
        server server2;
    }
    
    server {
        location ~* \.php$ {    # 以php结尾的
            proxy_pass http://php;
        } 
        
        location ~* \.asp$ {    # 以asp结尾的
            proxy_pass http://asp;
        } 
        
        location ~* \.html$ {   # 以html结尾的
            proxy_pass http://html;
        }
    }
}

3、基于浏览器分发

常应用于PC端和移动端区分或浏览器适配

代码语言:javascript
复制
upstream curl { 
  server server1; 
}

upstream firefox { 
  server server2; 
}

upstream other { 
  server server3; 
}

server {
    listen 80;
    server_name www.web1.com;
    location / {
        proxy_pass http://other;
        
        if ( $http_user_agent ~* curl ) {
            proxy_pass http://curl;
        }
        
        if ( $http_user_agent ~* firefox ) {
            proxy_pass http://firefox;
        }
    }
}

4、基于源IP分

通过ngx_http_geo_module模块,根据客户端ip访问到不同的server

代码语言:javascript
复制
upstream bj.server {
    server server1;    # web01
}

upstream sh.server {
    server server2;      # web02
}

upstream default.server {
    server server3;      # web03
}

geo $geo {       # IP库
    default default;
    server1 bj;    # 北京
    server2 sh;   # 上海
}

server {
    listen  80;
    server_name   www.web1.com;

    location / {
        proxy_pass http://$geo.server$request_uri;
    }
}

5. 根据http header转发到不同的服务

根据请求 Header 转发不同后端服务server。

代码语言:javascript
复制
http {

    map $http_custom_header $backend_name {
        default       backend1;
        "version2.0"  backend2;
    }
 
    upstream backend1 {
        server backend1.example.com;
    }
 
    upstream backend2 {
        server backend2.example.com;
    }
 
    server {
        listen 80;
 
        location / {
            proxy_pass http://$backend_name;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
}

在这个配置中,http_custom_header 是一个变量,代表HTTP请求header中的自定义字段。map 指令根据这个变量的值来设置一个变量 backend_name。如果请求header中的自定义字段值为 "version2.0",则会将请求转发到 backend2.example.com;否则,会转发到 backend1.example.com。

也可以如下配置

代码语言:javascript
复制
map $http_accept $version {
  default "";
  "application/vnd.demo.v2.0+json" "v2.0";
}

upstream backend1 {
    server backend1.example.com;
}

upstream backend2 {
    server backend2.example.com;
}

server {
  listen                    80;
  server_name               olive.com;
  charset                   utf-8;
  autoindex                 off;

  location / {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Port $server_port;
    proxy_set_header X-Forwarded-Ssl on;

    if ($version="v2.0"){
      proxy_pass      http://backend2;
      break;
    }

    proxy_pass      http://backend1;
  }
}

在这个配置中,http_accept 是一个变量,代表HTTP请求header中的http_accept字段。map 指令根据这个变量的值来设置一个变量 version。如果请求header中的自定义字段值为 "application/vnd.demo.v2.0+json",则version的值为v2.0;否则version的值为空字符串。然后if条件判断根据

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 BUG弄潮儿 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、基于host分发
  • 2、基于开发语言分发
  • 3、基于浏览器分发
  • 4、基于源IP分
    • 5. 根据http header转发到不同的服务
    相关产品与服务
    轻量应用服务器
    轻量应用服务器(TencentCloud Lighthouse)是新一代开箱即用、面向轻量应用场景的云服务器产品,助力中小企业和开发者便捷高效的在云端构建网站、Web应用、小程序/小游戏、游戏服、电商应用、云盘/图床和开发测试环境,相比普通云服务器更加简单易用且更贴近应用,以套餐形式整体售卖云资源并提供高带宽流量包,将热门软件打包实现一键构建应用,提供极简上云体验。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档