您当前的位置:首页 > 电脑百科 > 站长技术 > 服务器

Nginx 的过滤模块是干啥用的?

时间:2020-06-25 15:44:13  来源:  作者:

上一篇文章我写了 Nginx 的 11 个阶段,很多人都说太长了。这是出于文章完整性的考虑的,11 个阶段嘛,一次性说完就完事了。今天这篇文章比较短,看完没问题。

过滤模块的位置

之前我们介绍了 Nginx 的 11 个阶段,在 content 阶段时,Nginx 会生成返回给用户的响应内容,对用户的响应内容,实际上还需要做再加工处理,Nginx 的过滤模块就是对响应内容进行再加工处理的。所以实际上过滤模块位于 content 阶段之后,log 阶段之前。

我们先来看一段配置指令:

limit_req zone=req_one
burst=120;
limit_conn c_zone 1;

satisfy any;
allow 192.168.1.0/32;
auth_basic_user_file access.pass;

gzip on;
image_filter resize 80 80;

那么在这一段配置指令之下,会遵循怎样的请求流程呢?请看一下下面这张图:

Nginx 的过滤模块是干啥用的?

 

上面这张图的流程大致说一下,如果对于 Nginx 的 11 个阶段不了解的去翻一下之前的文章。

我这里再简单说一下。首先由 Nginx 框架接收 HTTP 请求,经过 preaccess、access、content 阶段的处理,当经过 static 模块之后生成响应的时候,很多时候需要对响应进行处理,然后才会返回给客户端。

这里我们假如响应是一张图片的话,那么需要做缩略图的时候,首先就要经过 image_filter 模块的处理。这里面还有一个 gzip 模块,这两个模块也是需要遵循严格的顺序的。因为如果先做 gzip 压缩的话,缩略图后面就没办法做了。

第二个需要关注的地方是,首先对 header 进行过滤,再对 body 进行过滤。因为我们在对用户发送响应的时候,一定是先发送 header,然后再发送 body,所以所有的过滤模块都会提供对 header 或 body 的过滤,当然 image_filter 和 gzip 模块对这两者都可以过滤。

返回响应

前面我们说过,Nginx 的 11 个阶段是有严格的顺序的,而这个顺序是在 Nginx 的代码中以一个数组的形式存在的,这个数组的顺序是从后往前。在给用户返回响应的时候,过滤模块也是有严格顺序的,这个顺序同样是从后往前。来看一下在代码中的定义,标红的是我下面会提到的几个过滤模块。

Nginx 的过滤模块是干啥用的?

 

我们需要重点关注四个过滤模块,它们分别的作用是啥呢?

  • copy_filter:复制包体内容 当我们使用 sendfile 指令的时候,也就是零拷贝技术,不经过用户态内存,这里就是不经过 Nginx 直接发给用户,同时也用了 gzip 模块的时候,gzip 是必须在 copy_filter 模块之后的,因为 gzip 必须对内存中的数据做压缩,这时 copy_filter 就会让 sendfile 指令失效。有些模块不需要对内存中的数据进行处理,就需要在 copy_filter 模块之前进行处理。
  • postpone_filter:处理子请求 用来处理子请求,有些过滤模块需要关心子请求的处理结果,需要放在该模块之后。
  • header_filter:构造响应头部 用来构造最终发送给用户的响应头部,可能会添加一些 Server,Nginx 版本号等内容。
  • write_filter:发送响应 用来实际调用操作系统的 write 或 send 等系统调用,来把响应实际发送出去。

介绍完了过滤模块的功能以及所处的阶段,下面来具体看两个模块。

sub 模块

介绍一个可以替换响应中字符串内容的模块:sub 模块。

  • 功能:将响应中指定的字符串,替换成新的字符串
  • 模块:ngx_http_sub_filter_module 模块,默认未编译进 Nginx,通过 --with-http_sub_module 启用

指令

Syntax: sub_filter string replacement;
Default: —
Context: http, server, location

Syntax: sub_filter_last_modified on | off;
Default: sub_filter_last_modified off; 
Context: http, server, location

Syntax: sub_filter_once on | off;
Default: sub_filter_once on; 
Context: http, server, location

Syntax: sub_filter_types mime-type ...;
Default: sub_filter_types text/html; 
Context: http, server, location

来解释一下这四个指令都是啥意思。

  • sub_filter string replacement sub_filter 指令会把匹配到的 string 字符串替换成 replacement 表示的字符串。
  • sub_filter_last_modified on | off sub_filter_last_modified 指令的意思是,是否要返回原来的 last_modified HTTP 头部,因为我们已经修改了文件内容,如果是 on 的话,就会继续返回原来的头部。
  • sub_filter_once on | off sub_filter_once 的意思是,是否只替换一次,默认打开,如果设置为 off 的话,那就会将响应中的内容全部扫描一遍并替换。
  • sub_filter_types mime-type 这个指令是说针对那些文件类型进行替换,这里可以设置成 *,但是效率就会比较低了,需要根据实际情况考虑。

实战

配置文件如下:

server {
    server_name sub.ziyang.com;
    error_log  logs/myerror.log  info;

    location / {
        sub_filter 'Nginx.oRg'  '$host/nginx';
        sub_filter 'nginX.cOm' '$host/nginx';
        #sub_filter_once on;
        sub_filter_once off;
        #sub_filter_last_modified off;
        sub_filter_last_modified on;
    }    
}

这里需要重新编译 Nginx,我这里把下一节需要的模块也一起编译进去了:

./configure --prefix=/Users/mtdp/myproject/nginx/test_nginx --with-http_sub_module --with-http_addition_module --with-http_realip_module
make
cp nginx ../../test_nginx/sbin/ # 复制编译好的 nginx 到之前的目录

执行热部署:

热部署的流程详见 Nginx 入门及命令行操作

kill -USR2 87693 # 使用新的 Nginx 二进制文件提供服务
kill -WINCH 87693 # 退出老的 Nginx 的 worker 进程
kill -quit 87693 # 优雅的退出老的 master 进程

在浏览器中打开 sub.ziyang.com:

Nginx 的过滤模块是干啥用的?

 

这里面会发现,nginx.org 已经替换成了 sub.ziyang.com/nginx,nginx.com 也替换成了 sub.ziyang.com/nginx。

addition 模块

下面再来看一个过滤模块,addition 模块,它可以在响应的前后添加内容。

  • 功能:在相应前或者响应后增加内容,增加内容的方式,是通过新增子请求,根据子请求的响应来完成。
  • 模块:ngx_http_addition_filter_module 默认未编译进 Nginx,通过 --with-http_addition_module 启用

指令

Syntax: add_before_body uri;
Default: —
Context: http, server, location

Syntax: add_after_body uri;
Default: —
Context: http, server, location

Syntax: addition_types mime-type ...;
Default: addition_types text/html; 
Context: http, server, location

这里的三个指令都比较简单,说一下 add_before_body 和 add_after_body 后面的 uri,这个的意思是说,向指定 uri 发起子请求,根据子请求的响应来添加内容。

addition_types 指令是指定要添加的文件类型。

实战

配置文件如下:

server {
    server_name addition.ziyang.com;
    error_log logs/myerror.log info;

    location / {
        #add_before_body /before_action;
        #add_after_body  /after_action;
        #addition_types *;
    }    
    location /before_action {
        return 200 'new content beforen';
    }
    location /after_action {
        return 200 'new content aftern';
    }
    location /testhost {
        uninitialized_variable_warn on;
        set $foo 'testhost';
        return 200 '$gzip_ration';
    }
}

先看在注释掉 addition 模块的指令的情况下,会是什么效果:

➜  ~ curl addition.ziyang.com/a.txt
a

然后打开注释:

➜  ~ curl addition.ziyang.com/a.txt
new content before
a
new content after

在原响应前后都增加了内容。

这里面需要注意一点,在实际情况下,add_before_body 和 add_after_body 后面是其他的 uri,我这里为了简化,直接转发到对应的 location。

本文涉及到的所有配置文件我已经放在了 Nginx 配置文件,大家可以自取。


本文首发于我的个人博客:iziyang.github.io



Tags:Nginx   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
项目中,遇到了一个问题,就是PDF等文档不能够在线预览,预览时会报错。错误描述浏览器的console中,显示如下错误:nginx代理服务报Mixed Content: The page at ******** was loaded...【详细内容】
2021-12-17  Tags: Nginx  点击:(7)  评论:(0)  加入收藏
前言Nginx是前后端开发工程师必须掌握的神器。该神器有很多使用场景,比如反向代理、负载均衡、动静分离、跨域等等。把 Nginx下载下来,打开conf文件夹的nginx.conf文件,Nginx服...【详细内容】
2021-12-08  Tags: Nginx  点击:(18)  评论:(0)  加入收藏
最近客户有个新需求,就是想查看网站的访问情况,由于网站没有做google的统计和百度的统计,所以访问情况,只能通过日志查看,通过脚本的形式给客户导出也不太实际,给客户写个简单的页...【详细内容】
2021-10-09  Tags: Nginx  点击:(48)  评论:(0)  加入收藏
安全服务器是只允许所需数量的服务器。理想情况下,我们将通过单独启用其他功能来基于最小系统构建服务器。进行最少的配置也有助于调试。如果该错误在最小系统中不可用,则分别...【详细内容】
2021-09-26  Tags: Nginx  点击:(60)  评论:(0)  加入收藏
在今年的NGINX Sprint 2.0虚拟大会上,NGINX(来自流行的开源web服务器/负载均衡器和反向代理背后的公司F5),发布了NGINX现代应用参考架构(MARA)。该公司在一篇博客文章中说,这将帮...【详细内容】
2021-09-26  Tags: Nginx  点击:(61)  评论:(0)  加入收藏
Ubuntu下安装Nginx一、系统基本信息查看1、查看Ubuntu版本信息:使用命令:cat /proc/version 查看~$ cat /proc/versionLinux version 4.15.0-106-generic (buildd@lcy01-amd6...【详细内容】
2021-09-16  Tags: Nginx  点击:(60)  评论:(0)  加入收藏
出于安全审查或者对于系统安全性的要求,都要求我们生产环境部署的系统需要做一定的权限控制。那么如何简单快速地部署满足安全要求的权限系统呢?其实可以通过nginx的相关功能...【详细内容】
2021-09-07  Tags: Nginx  点击:(69)  评论:(0)  加入收藏
什么是NginxNginx(engine x)是一个高性能的HTTP和反向代理服务器,具有内存少,高并发特点强。1、处理静态文件,索引文件以及自动检索打开文件描述符缓冲2、无缓冲的反向代理加速...【详细内容】
2021-09-02  Tags: Nginx  点击:(70)  评论:(0)  加入收藏
本文适用于 php7.4+NGINX环境,适用于运行 wordpress 环境一、更新服务器sudo apt update二、命令快捷缩写设置通过ssh登录服务器,在用户目录下执行以下命令sudo nano .bashrca...【详细内容】
2021-08-31  Tags: Nginx  点击:(87)  评论:(0)  加入收藏
一、nginx正向代理介绍及配置(需要在客户端配置代理服务器进行指定网站访问)#模块 ngx_http_proxy_module: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy...【详细内容】
2021-08-16  Tags: Nginx  点击:(76)  评论:(0)  加入收藏
▌简易百科推荐
阿里云镜像源地址及安装网站地址https://developer.aliyun.com/mirror/centos?spm=a2c6h.13651102.0.0.3e221b111kK44P更新源之前把之前的国外的镜像先备份一下 切换到yumcd...【详细内容】
2021-12-27  干程序那些事    Tags:CentOS7镜像   点击:(1)  评论:(0)  加入收藏
前言在实现TCP长连接功能中,客户端断线重连是一个很常见的问题,当我们使用netty实现断线重连时,是否考虑过如下几个问题: 如何监听到客户端和服务端连接断开 ? 如何实现断线后重...【详细内容】
2021-12-24  程序猿阿嘴  CSDN  Tags:Netty   点击:(12)  评论:(0)  加入收藏
一. 配置yum源在目录 /etc/yum.repos.d/ 下新建文件 google-chrome.repovim /etc/yum.repos.d/google-chrome.repo按i进入编辑模式写入如下内容:[google-chrome]name=googl...【详细内容】
2021-12-23  有云转晴    Tags:chrome   点击:(7)  评论:(0)  加入收藏
一. HTTP gzip压缩,概述 request header中声明Accept-Encoding : gzip,告知服务器客户端接受gzip的数据 response body,同时加入以下header:Content-Encoding: gzip:表明bo...【详细内容】
2021-12-22  java乐园    Tags:gzip压缩   点击:(9)  评论:(0)  加入收藏
yum -y install gcc automake autoconf libtool makeadduser testpasswd testmkdir /tmp/exploitln -s /usr/bin/ping /tmp/exploit/targetexec 3< /tmp/exploit/targetls -...【详细内容】
2021-12-22  SofM    Tags:Centos7   点击:(7)  评论:(0)  加入收藏
Windows操作系统和Linux操作系统有何区别?Windows操作系统:需支付版权费用,(华为云已购买正版版权,在华为云购买云服务器的用户安装系统时无需额外付费),界面化的操作系统对用户使...【详细内容】
2021-12-21  卷毛琴姨    Tags:云服务器   点击:(6)  评论:(0)  加入收藏
参考资料:Hive3.1.2安装指南_厦大数据库实验室博客Hive学习(一) 安装 环境:CentOS 7 + Hadoop3.2 + Hive3.1 - 一个人、一座城 - 博客园1.安装hive1.1下载地址hive镜像路径 ht...【详细内容】
2021-12-20  zebra-08    Tags:Hive   点击:(9)  评论:(0)  加入收藏
以下是服务器安全加固的步骤,本文以腾讯云的CentOS7.7版本为例来介绍,如果你使用的是秘钥登录服务器1-5步骤可以跳过。1、设置复杂密码服务器设置大写、小写、特殊字符、数字...【详细内容】
2021-12-20  网安人    Tags:服务器   点击:(7)  评论:(0)  加入收藏
项目中,遇到了一个问题,就是PDF等文档不能够在线预览,预览时会报错。错误描述浏览器的console中,显示如下错误:nginx代理服务报Mixed Content: The page at ******** was loaded...【详细内容】
2021-12-17  mdong    Tags:Nginx   点击:(7)  评论:(0)  加入收藏
转自: https://kermsite.com/p/wt-ssh/由于格式问题,部分链接、表格可能会失效,若失效请访问原文密码登录 以及 通过密钥实现免密码登录Dec 15, 2021阅读时长: 6 分钟简介Windo...【详细内容】
2021-12-17  LaLiLi    Tags:SSH连接   点击:(16)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条