Nginx高端成长之路Api设计

【充电】《Nginx核心知识100讲》proxy模块:proxy

2019-01-19  本文已影响5人  言十年

极客专栏《Nginx核心知识100讲》89~90小节,笔记
注意:这个是看专栏视频,敲的哈。这个专栏让我收货蛮大的。

89 | proxy模块中的proxy_pass指令

Proxy_pass 指令的用法

image.png image.png

示例

先看先不加uri的。

image.png

可以看到URI原封不动的打印了。

image.png

再看加了URI的

image.png image.png

proxy_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.png

proxy_set_header:可以修改或者添加一个新的头部。字段的值还可以使用一些变量,比如$proxy_host。默认nginx会去修改Host 跟Connection这两个头部,所以之前在介绍keep alive功能的时候会看到主动的设置了Connection的值为keepalive,否则的话默认是不启用的keepalive的。如果value的值(字段的值)是空字符串,或者设置的变量本身是空字符串。那么实际上,nginx并不会往上游发送字段名:空字符串,而是这个header字段就不发了。

proxy_pass_request_headers:告诉nginx,是否要把要把用户请求中的头部内容发往上游,默认是on,是发的。如果改成off,用户的请求都不在向上游发放了。

控制包体

image.png

proxy_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更改转发给上游的内容。

上一篇下一篇

猜你喜欢

热点阅读