Nginx同一套前端环境通过请求头访问不通后端的实现方式

发布于:2024-05-08 ⋅ 阅读:(24) ⋅ 点赞:(0)

摘要:本文介绍在开发或调试阶段,前端已经写好了,但是后端不想通过自己组装数据来调试接口,这时候就可以让前端请求直接路由到开发本地,完成开发环境的调试。

背景

为什么会出现这么奇怪的需求,就是后端比较偷懒,不想自己组装各种请求,想直接用现成的页面来来操作,所以有了这种配置方案。下文给出两种实现方案。

浏览器插件安装

强烈推荐插件ModHeader+tweak

ModHeader

可以修改http请求头 image.png

tweak

修改http响应数据,在后端接口报错的时候,可以mock数据让流程走下去

image.png

访问流量图

image.png

Nginx基于map + upstream流量转发

常规方案,基于http请求的header中带的参数gv来决定使用哪个分组,如果不传或者找不到就是默认分组,传入zhangsan就是backend2对应的服务

default.conf

map $http_gv $backend {
    default        backend1;
    zhangsan  backend2;
}

upstream backend1 {
    server 192.168.137.2:5021;
}

upstream backend2 {
    server 192.168.137.2:5022;
}

server {
   listen 8092;
   location / {
      proxy_pass http://$backend;
   }
}

docker-compose.yml

这里的镜像可以使用市面上公用的nginx镜像

version: '3.1'
services:
  nginx-lua-gv:
    image: huzhihui/nginx:1.23.1-lua
    container_name: nginx-lua-gv
    networks:
      - default
    environment:
      - TZ=Asia/Shanghai
    ports:
      - 8092:8092
    volumes:
      - ./conf.d:/etc/nginx/conf.d
      - ./logs:/var/log/nginx
networks:
  default:
    external:
      name: huzhihui

Nginx基于lua脚本的流量转发方案

该方案需要提前编译带有lua脚本的nginx,复杂一点,但是使用更加灵活,也是使用http请求头gv参数来控制

Docker镜像

可以使用我封装的,完全采用官方指南封装

nginx.conf

需要注意的点是,引入了其他第三方模块load_module


user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;

load_module modules/ndk_http_module.so;
load_module modules/ngx_http_lua_module.so;
load_module modules/ngx_stream_lua_module.so;

events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;

      server {
         listen 8092;
         location / {
              set_by_lua_block $backend {
                   local gv = ngx.req.get_headers()["gv"]
                   local backend
                   if gv == "zhangsan" then
                       backend = "http://192.168.137.2:5022"
                   elseif gv == "lisi" then
                       backend = "http://192.168.137.2:5023"
                   else
                       backend = "http://192.168.137.2:5021"
                   end
                   return backend
              }
              proxy_pass $backend;
         }
    }
}

docker-compose.yml

version: '3.1'
services:
  nginx-lua-gv:
    image: huzhihui/nginx:1.23.1-lua
    container_name: nginx-lua-gv
    networks:
      - default
    environment:
      - TZ=Asia/Shanghai
    ports:
      - 8092:8092
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./logs:/var/log/nginx
networks:
  default:
    external:
      name: huzhihui

测试结果

  • 不传请求头默认的环境

image.png

  • 传入zhangsan请求头

image.png