上图是nginx的11ge阶段,当执行到content阶段时,会生成响应内容,之后要通过HTTP的过滤模块进行加工处理,所以HTTP过滤模块的执行时间是在content阶段之后,log阶段之前。
一、HTTP过滤模块调用流程
当nginx接收到一个请求的过程是:
-
nginx接收到一个请求时,先接收HTTP头部。
-
然后经过preaccess阶段的limit_req模块和limit_conn模块。
-
再经过access阶段的access模块和auth_basic模块。
-
再经过content阶段的concat模块和static模块。在这个阶段会生成响应。
-
如果生成的响应是一张图片的话,首先会对header进行image_filter模块的缩略处理,再进行gzip压缩,这个顺序是不能乱的。
-
再对body进行缩略处理和gzip压缩。
二、sub模块对响应中的字符串 进行替换
该模块能对响应中的字符串进行替换,全称是ngx_http_sub_filter_module模块,默认是未被编译进nginx中的,可以使用--with-http_sub_module进行编译。
1、指令
-
sub_filter:sub_filter string replacement,string为被替换字符串,replacement为替换字符串。
-
sub_filter_last_modified:on/off,修改了响应,是否还显示原先响应的last_modified,默认为off。
-
sub_filter_once:on/off,对body中的所有string对进行匹配替换,还是只匹配替换一次,默认是on,全部匹配替换。
-
sub_filter_types:只针对什么类型的响应进行替换,默认是text/html,可以设置为*,但是性能很差,它会对所有类型的都进行匹配替换。
2、案例
对nginx.org进行替换。
使用sub模块之前:
nginx.org对应的链接地址是nginx.org/。
使用sub模块进行替换:
nginx配置:
location / {
sub_filter 'nginx.org' 'test';
sub_filter_once on;
sub_filter_last_modified on;
}
这里开启了sub_filter_once,对nginx.org只进行一次替换。
重启之后:
三、addition模块在响应的前后添加内容
该模块可以在HTTP响应之前和之后添加不同的内容,增加内容的方式是通过增加自请求完成的。默认没有被编译进nginx中,可以使用--with-http_addition_module启用。
1、指令
-
add_before_body:add_before_body uri,nginx会去访问该url,添加的内容就是该uri返回的东西。
-
add_after_body:add_after_body uri,同上。
-
addition_types:可以添加的文件类型,默认是text/html。
2、案例
location / {
add_before_body /before;
add_after_body /after;
}
location /before {
return 200 'before';
}
location /after {
return 200 'after';
}
重启之后页面内容变为:
原理:阻塞住之前的请求,生成新的请求,当新请求的响应返回之后,再激活之前的请求。