Docs/linux基础/nginx/proxy_pass引入变量.md
2022-10-18 16:59:37 +08:00

2 KiB
Raw Blame History

背景

1、kubernetes中某个nginx需要反向代理某个svc虽然svc对应的pod有扩缩容或更新或者svc重建时svc链接不变但是对应的ip已发生了变化。
2、proxy_pass配置的链接nginx会在请求dns后把对应的ip信息缓存起来后续请求就一直使用缓存ip直到nginx重启

目的

实现nginx热更新即每次请求都使用新的ip地址

方法

nginx使用resolver与set关键字。
resolver用于解析dnsset用于定义变量

具体实现

nginx的server配置段需要配置如下内容

# 
server {
    listen       80;
    server_name  localhost;
    
    # DNS
    resolver kube-dns.kube-system.svc.cluster.local valid=1s;
    
    # test
    # test命名空间中的一个端口为8080的service
    set $test test-svc.test.svc.cluster.local:8080;
    
    location / {
        proxy_pass http://$test; ## 后面不能跟/
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

*** 问题来了 ***

当需要反向代理多个后端或者访问的uri中需要加字符串标识即location不是/,反向代理需要加上/实际访问后端链接不带location配置的字符串实际访问的链接是非期望的。

*** 解决方法 ***

# 
server {
    listen       80;
    server_name  localhost;
    
    # DNS
    resolver kube-dns.kube-system.svc.cluster.local valid=1s;
    
    # test
    # test命名空间中的一个端口为8080的service
    set $test test-svc.test.svc.cluster.local:8080;
    
    location /test/ {
        rewrite ^/test/(.*) /$1 break;
        proxy_pass http://$test; ## 后面不能跟/
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}