【充电】《Nginx核心知识100讲》proxy模块:proxy
极客专栏《Nginx核心知识100讲》89~90小节,笔记
注意:这个是看专栏视频,敲的哈。这个专栏让我收货蛮大的。
89 | proxy模块中的proxy_pass指令
Proxy_pass 指令的用法
image.png image.png示例
先看先不加uri的。
image.png可以看到URI原封不动的打印了。
image.png再看加了URI的
image.png image.pngproxy_pass 是一个动作类指令,它会指定在某一个阶段中直接使用proxy_pass处理请求。而proxy_pass中是否加URI往往是我们容易犯的一个错误。因为nginx对我们是否加URI会产生完全不同的转发URI,需要我们注意。
留言问题
1.有个地方没讲,有个坑,proxy_pass后面接域名时候会DNS缓存,导致这个域名背后的机器负载不均衡,官方推荐的是使用变量解决。
作者回复
谢谢提醒。
nginx为了提升性能,对于proxy_pass后的域名,不会每次连接都去做resolve,而是解决完一次后就把IP地址存储在内存中,导致如果基于DNS来做负载均衡,而不是nginx做负载均衡时,会有伟忠提出的这个问题。
使用变量,就用到了nginx的脚本,每个请求都会执行一次,虽然效率有下降,但能解这问题。
90 | 根据指令修改发往上游的请求
http proxy模块在为上游生成请求的时候提供了许多指令。接下来看看这些指令怎么样去修改我们转发给上游http请求的内容。
再回顾下那个HTTP反向代理的流程图。
局部图 image.png一个请求呢,实际上有三部分构成。一个是请求行,比如GET URL、HTTP 1.1。这样的信息中哪些我们可以改呢?比如GET,可以用proxy_method修改。再比如proxy_http_version可以修改HTTP字段。可以用proxy_http_version 吧 HTTP 1.0
修改成HTTP 1.1
向后端发往1.1的请求,比如我们使用keepalive的时候就必须改成1.1,因为1.0不支持。
生成完请求行之后就开始生成请求头部。
控制头部
image.pngproxy_set_header:可以修改或者添加一个新的头部。字段的值还可以使用一些变量,比如$proxy_host。默认nginx会去修改Host 跟Connection这两个头部,所以之前在介绍keep alive功能的时候会看到主动的设置了Connection的值为keepalive,否则的话默认是不启用的keepalive的。如果value的值(字段的值)是空字符串,或者设置的变量本身是空字符串。那么实际上,nginx并不会往上游发送字段名:空字符串
,而是这个header字段就不发了。
proxy_pass_request_headers:告诉nginx,是否要把要把用户请求中的头部内容发往上游,默认是on,是发的。如果改成off,用户的请求都不在向上游发放了。
控制包体
image.pngproxy_pass_request_body:默认为on,把用户请求中的body传递给上游。设为off,就会忽略或丢掉用户请求中的body。
proxy_set_body:手动的构造发往上游的内容。
例子
上游服务配置。主要是观察打印的变量值。
image.png在看nginx配置文件。先验证下不加这些指令(注释掉)的时候得到的一个响应。
image.png结果
image.png接下来看使用了这些指令的效果。
image.png结果
image.png在看对body的操作
image.png image.png通过抓包看下构造的bodyhello world
有没有传过去。
tcpdump -i lo port 8012 -A -s 0
image.png
构造发往上游的http请求的内容,会影响上游服务器怎样处理这个请求包括对缓存、host头部、keepalive等等诸多特性。所以,我们必须非常熟悉如何利用nginx更改转发给上游的内容。