Nginx学习:代理模块(三)缓冲区与Cookie处理
缓冲区的内容还是和 FastCGI 是相似的,测试方式也是相同的,这个咱们就不多说了。另外一个 Cookie 相关的配置指令则是 Proxy 模块所特有的,但其实也就是重写或修改后端响应的 Cookie 中的一些信息,一般来说用得也不是特别多,大家还是以了解的心态来看待。
今天的内容都是可以在 http、server、location 中进行配置的,有特殊的配置咱们会单独说。
Proxy缓冲区
同样还是针对后端响应的缓冲读写,当超过一定限制之后会将缓冲内容写入到文件。为了高性能,当然是设置一个合理的值,尽量在内存缓冲中进行操作。这些值没啥特别的固定大小,还是要根据业务情况来看,当出现一些相关的缓冲区错误信息时,可以来修改这些配置的值。咱们还是先看配置,最后做一个简单的小测试。
proxy_buffer_size
设置用于读取从代理服务器接收到的响应的第一部分的缓冲区大小。
proxy_buffer_size size;
这部分通常包含一个小的响应头。默认情况下,缓冲区大小等于一内存页。这是 4K 或 8K,具体取决于平台。然而,它可以做得更小。
proxy_buffering
启用或禁用来自代理服务器的响应缓冲。
proxy_buffering on | off;
默认是 on ,启用缓冲后,nginx 会尽快收到来自代理服务器的响应,并将其保存到由 proxy_buffer_size 和 proxy_buffers 指令设置的缓冲区中。如果整个响应不适合内存,可以将其中的一部分保存到磁盘上的临时文件中。写入临时文件由 proxy_max_temp_file_size 和 proxy_temp_file_write_size 指令控制。
当缓冲被禁用时,响应会在收到时立即同步传递给客户端。 nginx 不会尝试从代理服务器读取整个响应。 nginx 一次可以从服务器接收的最大数据大小由 proxy_buffer_size 指令设置。
也可以通过在“X-Accel-Buffering”响应头字段中传递“yes”或“no”来启用或禁用缓冲。可以使用 proxy_ignore_headers 指令禁用此功能。
proxy_buffers
为单个连接设置用于从代理服务器读取响应的缓冲区的数量和大小。
proxy_buffers number size;
默认情况下,缓冲区大小等于一内存页。这是 4K 或 8K,具体取决于平台。
proxy_busy_buffers_size
当启用来自代理服务器的响应缓冲时,限制在响应尚未完全读取时可能忙于向客户端发送响应的缓冲区的总大小。
proxy_busy_buffers_size size;
同时,其余缓冲区可用于读取响应,并在需要时将部分响应缓冲到临时文件。默认情况下,大小受 proxy_buffer_size 和 proxy_buffers 指令设置的两个缓冲区的大小限制。
proxy_temp_file_write_size
当启用缓冲从代理服务器到临时文件的响应时,限制一次写入临时文件的数据大小。
proxy_temp_file_write_size size;
默认值 8 或 16k 。默认情况下,大小受 proxy_buffer_size 和 proxy_buffers 指令设置的两个缓冲区限制。临时文件的最大大小由 proxy_max_temp_file_size 指令设置。
proxy_temp_path
定义一个目录,用于存储从代理服务器接收到的数据的临时文件。
proxy_temp_path path [level1 [level2 [level3]]];
在指定目录下最多可以使用三级子目录层次结构。
proxy_max_temp_file_size
如果启用了来自代理服务器的响应缓冲,并且整个响应不适合 proxy_buffer_size 和 proxy_buffers 指令设置的缓冲区,则可以将部分响应保存到临时文件中。
proxy_max_temp_file_size size;
默认值是 1024m ,该指令设置临时文件的最大大小。一次写入临时文件的数据大小由 proxy_temp_file_write_size 指令设置。
零值禁用对临时文件的响应的缓冲。此限制不适用于将缓存或存储在磁盘上的响应。
Proxy缓冲区测试
配置信息和 FastCGI 的基本一样是吧,就是把前面的 fastcgi 换成了 proxy ,测试效果也是一样的,我们直接写这样一个配置。
location ~ /buffer/(.*) {
proxy_pass http://192.168.56.88:80/$1?$args;
proxy_buffering on;
proxy_buffer_size 257;
proxy_buffers 3 256;
proxy_busy_buffers_size 257;
proxy_temp_file_write_size 300;
proxy_temp_path proxytemptest 1 2;
}
然后也是使用之前的 FastCGI 测试中使用过的 PHP 文件进行测试,当循环次数大于 5000 时,缓冲区临时文件夹会产生变动。
curl 'http://192.168.56.88:8027/buffer/fastcgi1/1.php?c=5000'
其它的就不多说了,因为很多内容和 FastCGI 部分的都一样,不记得的小伙伴可以去那篇文章再好好看一下哦。
Nginx学习:FastCGI模块(三)缓冲区与响应头 https://mp.weixin.qq.com/s/tlznLZKjulf1U7NOYL-tXA
Proxy Cookie操作
这一部分是 Proxy 代理模块有的,而 FastCGI 所没有的哦。不过其实也就三个配置指令,分别是修改 Cookie 域、Cookie 属性及 Cookie 路径的,并没有对具体的 Cookie 值进行修改的配置。
proxy_cookie_domain
设置应在代理服务器响应的“Set-Cookie”标头字段的域属性中更改的文本。
proxy_cookie_domain off;
proxy_cookie_domain domain replacement;
默认值是 off ,假设代理服务器返回“Set-Cookie”标头字段,其属性为“domain=localhost”。那么假如这样配置的话:
proxy_cookie_domain localhost example.org;
就会将这个属性重写为“domain=example.org”。域开头的点和替换字符串以及域属性将被忽略。匹配不区分大小写。域和替换字符串可以包含变量:
proxy_cookie_domain www.$host $host;
该指令也可以使用正则表达式指定。在这种情况下,域应从“~”符号开始。正则表达式可以包含命名和位置捕获,替换可以引用它们:
proxy_cookie_domain ~\.(?P<sl_domain>[-0-9a-z]+\.[a-z]+)$ $sl_domain;
我们也可以在同一级别上指定多个 proxy_cookie_domain 指令:
proxy_cookie_domain localhost example.org;
proxy_cookie_domain ~\.([a-z]+\.[a-z]+)$ $1;
如果可以将多个指令应用于 cookie,则将选择第一个匹配到的指令。
最后 off 参数取消了从先前配置级别继承的 proxy_cookie_domain 指令的效果。
proxy_cookie_flags
为 cookie 设置一个或多个标志。
proxy_cookie_flags off | cookie [flag ...];
其实就是我们设置 Cookie 时的那些属性参数 ,该标志可以包含文本、变量及其组合 (1.19.8)。 secure、httponly、samesite=strict、samesite=lax、samesite=none 参数表示添加了相应的标志。 nosecure、nohttponly、nosamesite 参数则表示删除了相应的标志。
也可以使用正则表达式指定 cookie。在这种情况下,cookie 应该从“~”符号开始。
以在同一配置级别上指定多个 proxy_cookie_flags 指令
proxy_cookie_flags one httponly;
proxy_cookie_flags ~ nosecure samesite=strict;
如果可以将多个指令应用于 cookie,则将选择第一个匹配的指令。在示例中,将 httponly 标志添加到 cookie 之一,对于所有其他 cookie,添加 samesite=strict 标志并删除安全标志。
默认的 off 参数取消了从先前配置级别继承的 proxy_cookie_flags 指令的效果。
proxy_cookie_path
设置应在代理服务器响应的“Set-Cookie”标头字段的路径属性中更改的文本。
proxy_cookie_path off;
proxy_cookie_path path replacement;
假设代理服务器返回“Set-Cookie”标头字段,其属性为“path=/two/some/uri/”。那么这样的设置的话:
proxy_cookie_path /two/ /;
就会会将这个属性重写为“path=/some/uri/”。
路径和替换字符串可以包含变量:
proxy_cookie_path $uri /some$uri;
该指令也可以使用正则表达式指定。在这种情况下,路径应该从“~”符号开始进行区分大小写的匹配,或者从“~*”符号开始进行不区分大小写的匹配。正则表达式可以包含命名和位置捕获,替换可以引用它们:
proxy_cookie_path ~*^/user/([^/]+) /u/$1;
也可以在同一级别上指定多个 proxy_cookie_path 指令:
proxy_cookie_path /one/ /;
proxy_cookie_path / /two/;
如果可以将多个指令应用于 cookie,则将选择第一个匹配的指令。
默认的 off 参数取消了从先前配置级别继承的 proxy_cookie_path 指令的效果。
Proxy的Cookie操作测试
好了,简单测试一下吧,准备一个 PHP 文件,就简单地设置一个 Cookie 好了。
# /usr/local/nginx/html/fastcgi1/proxy/2.cookie.php
<?php
setcookie("one", "11111", 0, '/two/', 'localhost', false, false);
直接访问的话,查看返回的响应头中,Cookie 信息是这样的。
Set-Cookie: one=11111; path=/two/; domain=localhost
接下来,配置上 Proxy 的 Cookie 相关配置指令,随便修改一下就好。
location ~ /cookie/(.*) {
proxy_pass http://192.168.56.88/$1?$args;
proxy_cookie_domain localhost zyblog.net;
proxy_cookie_flags one httponly;
proxy_cookie_path /two/ /;
}
再次访问这个路径,获得的响应头中的内容就变成了我们设置的内容。
Set-Cookie: one=11111; path=/; domain=zyblog.net; HttpOnly
关于 Cookie 这些属性的功能作用,如果有不清楚的小伙伴可以查阅一下相关的资料,一句话概括的话,就是都和安全有关。
总结
还是看起来内容多,但实际没啥吧。因为说实话这些配置平常也不会用得太多,缓冲区可能在性能调优时会用到,但 Cookie 一般很少会让 Nginx 来更改这些属性配置,我们会在后端服务上直接配置好。至于怎么调优,更多的还是经验与错误提示,我对这一块也没有太多的经验,所以只能给的建议就是不懂别瞎调了。不过网上也有很多教程,直接搜 Nginx 优化就会有相关的配置,将来如果搞明白了这里,咱们再单独写文章说吧!
参考文档:
http://nginx.org/en/docs/http/ngx_http_proxy_module.html