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

68 lines
No EOL
2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#### 背景
```
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;
}
}
```