一 proxy模块处理请求的流程
① 流程图
说明: nginx从client接收的是'http协议','转发给上游'的也是http协议
备注: 后续根据'处理'请求的流程,来讲解'相关指令'
二 proxy_pass
① 基本解读
说明: proxy_pass是一个'动作'指令
② proxy_pass的形式
重点: 理解'proxy_pass'的构成
1)"协议[http、https]"+"://"+"域名[ip]:端口"+"option[可选]的attach_url"
2)"协议[http、https]"+"://"+"upstream_id"+"[可选]的attach_url"
注意:变量可以用在'proxy_pass'组成的'任何'一部分
++++++++'proxy_pass的形式'++++++++
字面值ip、'域名'、'upstream_id'、'变量[表示域名]' -->四种方式设置'上游[源站]'地址
1)有'变量',先'预'编译,'reload|restart'不会报错,等'客户端的请求'来了再'handle处理'
方式1: '自定义变量'
resolver 114.114.114.114 valid=30s
set $target www.baidu.com;
proxy_pass http://$target;
方式2: '客户端传递的http变量'
proxy_pass http://http_target;
特性:服务'启动'的时候,'绕过域名检查';有'请求过来'的时候,需要'resolver'指令进行域名解析
2)无'变量'
③ nginx dns缓存的问题
1)域名用'变量(动态域名解析)'代替,无法使用'upstream'模块的'健康检查、会话保持'等功能
dns解析引发对proxy_pass的思考
nginx dns缓存的问题
dns解析的问题
动态和静态dns解析
④ attach_url
(1)案例1
测试1: proxy_pass '不'携带 'attach_url'
结论: proxy_pass '不携带' attach_url,会将'client原始的url'转发给上游
(2)案例2
测试1: proxy_pass '携带attach_url',attach_url为'/'
request_uri: '/ceshi/index.html'
location 匹配 '/ceshi/',剩余'index.html' 添加到 'attach_url --> / ' 后面
后端收到的请求: '/index.html'
(3) 案例3
+++++++++++ "解读" +++++++++++
1)request_uri: '/ceshi/hello.html'
2) location: '/ceshi/'
3) attatch_url: '/abc'
4) location匹配后,剩余的'hello.html'追加到proxy_pass的'attach_url'中 --> '/abchello.html'
⑤ nginx无法确认attach_url
(1)案例1
1)原来'错误'的理解
当'location'带有'~、~* [以~开头]'正则时,proxy_pass'不允许'有'URI [变量、文本、还是混合的形式]'
2) '修证后'的理解
如果location使用'正则'表达式,proxy_pass中'不能指定[裸]path',除非proxy_pass中包含'变量'
+++++++++ "以下是两个对比案例" +++++++++
重点'关注': location中指定"正则表达式"和proxy_pass配置的"attach_url中带变量"混合场景
参考连接
如果'location'使用'正则表达式',proxy_pass中'不能'指定path,除非proxy_pass中包含'变量'
++++++++++++++ "扩展学习" ++++++++++++++
location /abc/d {
if ( $request_uri ~ /abc/d/(.+) ) {
set $args $1;
}
proxy_pass https://backend/ef/$args;
}
============'等价'方式============
location ~ /abc/d/(.+) {
proxy_pass https://backend/ef/$1;
}
(2)案例2
1)rewrite改变'uri',此时'proxy_pass'的'attach_url'被'ignored'忽略
场景:proxy_pas有'attach_url',但是又要将'原始请求'转发到'后端',使用'$request_uri'变量
2)使用proxy_pass中指定的域名加上'rewrite中指定的path路径'即为转发后的url
(3) 案例3
1)当'attach_url'中携带'变量',会用'proxy_pass中解析后的uri'替换'原始url',作为最终转发到后端的'uri'
备注:注意与'案例1'的差异点
案例讲解 案例学习 使用变量