Nginx HTTP模块详解
3、数据处理功能模块
3.1、首页处理
HTTP请求经过一系列的请求流程处理后,最终将读取数据并把数据内容返回给用户。当用户请求没有明确指定请求的文件名称时,Nginx会根据设定返回默认数据,实现这一功能包含ngx_http_index_module、ngx_http_random_index_module、ngx_http_autoindex_module这3个模块。
常用的首页处理配置指令如表所示。
3.1.1、首页指令------index

配置样例如下:
bash
location / {
index index.$geo.html index.html;
}
- 指令值为多个文件时,会按照从左到右的顺序依次查找,找到对应文件后将结束查找。
3.1.2、随机首页指令------random_index

配置样例如下:
bash
root /opt/nginx-web/html;
location / {
random_index on;
}
- 该指令的执行优先级高于index指令。
- 文件目录中的隐藏文件将被忽略。
3.1.3、自动首页------autoindex
- 自动首页指令

- 自动首页格式指令

- 自动首页文件大小指令

- 自动首页时间指令

配置样例如下:
bash
location / {
autoindex on;
autoindex_format html;
autoindex_exact_size off;
autoindex_localtime on;
}
3.2、图片处理
模块名称:ngx_http_image_filter_module
该模块可以对JPEG、GIF、PNG或WebP格式的图片文件进行动态旋转、比例缩放及裁剪。该模块的内置配置指令如表所示。
- 图片处理指令
- image_filter指令值参数

- image_filter指令值参数
- 图片处理缓冲区指令

- JEPG图片质量指令


- WebP图片质量指令

- 图片背景指令

- 图片锐化指令

- 图片交错加载指令

配置样例如下:
bash
upstream img1 {
server 192.168.2.145:8080;
}
server {
listen 8083;
server_name image.nginxtest.org;
index index.html index.htm index.php;
image_filter_buffer 20M; # 设置图片处理缓冲区大小为20MB
image_filter_sharpen 150; # 对图片进行150%的锐化处理
image_filter_jpeg_quality 70; # JPEG图片的压缩比为70%
image_filter_transparency off; # 对GIF及PNG图片去掉透明背景
image_filter_interlace on; # 将输出图片转换为交错格式
location / {
root /opt/nginx-web;
}
# 比例缩放图片尺寸file_100x100.jpg
location ~* .*_(\d+)x(\d+)\.(JPG|jpg|gif|png|PNG)$ {
set $img_width $1; # 缩放图片的宽
set $img_height $2; # 缩放图片的高
rewrite ^(.*)_\d+x\d+.(JPG|jpg|gif|png|PNG)$ /images$1.$2 break;
image_filter resize $img_width $img_height;
proxy_pass http://img1;
}
# 比例缩放图片尺寸并压缩file_100x100_80.jpg
location ~* .*_(\d+)x(\d+)_(\d+)\.(JPG|jpg|gif|png|PNG)$ {
set $img_width $1; # 缩放图片的宽
set $img_height $2; # 缩放图片的高
set $img_quality $3; # 图片的质量
rewrite ^(.*)_\d+x\d+_\d+.(JPG|jpg|gif|png|PNG)$ /images$1.$2 break;
image_filter resize $img_width $img_height;
image_filter_jpeg_quality $img_quality;
proxy_pass http://img1;
}
# 比例缩放图片尺寸并旋转file_100x100__90.jpg
location ~* .*_(\d+)x(\d+)__(\d+)\.(JPG|jpg|gif|png|PNG)$ {
set $img_width $1; # 缩放图片的宽
set $img_height $2; # 缩放图片的高
set $img_rotate $3; # 旋转参数
rewrite ^(.*)_\d+x\d+__\d+.(JPG|jpg|gif|png|PNG)$ /images$1.$2 break;
image_filter resize $img_width $img_height ;
image_filter rotate $img_rotate ;
proxy_pass http://img1;
}
# 裁剪图片尺寸file_100x100_crop.jpg
location ~* .*_(\d+)x(\d+)_crop\.(JPG|jpg|gif|png|PNG)$ {
set $img_width $1; # 裁剪图片的宽
set $img_height $2; # 裁剪图片的高
rewrite ^(.*)_\d+x\d+_crop.(JPG|jpg|gif|png|PNG)$ /images$1.$2 break;
image_filter crop $img_width $img_height;
proxy_pass http://img1;
}
}
模块:ngx_http_empty_gif_module
该模块将在内存中创建一个单像素的GIF透明图片。该模块的内置配置指令如表所示。

配置样例如下:
bash
location = /_.gif {
empty_gif;
}
3.3、响应处理
模块:ngx_http_headers_module
该模块允许用户在HTTP响应头中添加Expires、Cache-Control及自定义属性字段。该模块的内置配置指令如表所示。
-
添加字段指令

-
尾添加字段指令

-
尾添加字段指令

指令格式如下:bashadd_trailer name value [always];可以通过HTTP响应体尾部的数据对响应数据做完整性校验、数字签名或请求处理后的状态传递。
-
缓存时间指令

-
当指令值为时间时,既可以是正值也可以是负值。Expires的值为当前时间与指令值的时间之和。当指令值的时间为正或0时,Cache-Control的值为指令值的时间。当指令值的时间为负时,Cache-Control的值为no-cache。
-
当指令值为时间时,可用前缀@指定一个绝对时间,表示在当天的指定时间失效。
-
当指令值为epoch时,Expires的值为Thu,01 Jan 197000:00:01 GMT, Cache-Control的值为no-cache。
-
当指令值为max时,Expires的值为Thu,31 Dec 203723:55:55 GMT, Cache-Control的值为10年。
-
当指令值为off时,不对响应头中的属性字段Expires和Cache-Control进行任何操作。
配置样例如下:
bash
map $content_type $expires { # 根据$content_type的值,对变量$expires进行赋值
default off; # 默认不修改Expires和Cache-Control的值
application/pdf 42d; # application/pdf类型为42天
~image/ max; # 图片类型为max
}
server {
expires 24h; # 设置Expires的值为当前时间之后的24小时,
# Cache-Control的值为24小时
expires modified +24h; # 编辑Expires的值增加24小时,Cache-Control的值增
# 加24小时
expires @15h; # 设置Expires的值为当前日的15点,Cache-Control的值
# 为当前时间到当前日15点的时间差
expires $expires; # 根据变量$expires的内容设置缓存时间
add_header Cache-Control no-cache;
add_trailer X-Always $host always;
}
模块:ngx_http_charset_module
该模块在响应头的属性字段"Content-Type"添加指定的字符集,同时还可以进行字符集转换。字符集转换有如下限制:
- 只能从服务端到客户端进行单向转换。
- 只能单字节字符集进行转换或在单字节字符集与UTF-8之间进行转换。
该模块的内置配置参数如表所示。
- 字符集指令

- 源字符集指令

- 字符集映射指令

- 字符集MIME类型指令

- 字符集代理转换指令

3.4、数据修改
模块:ngx_http_addition_module
该模块可以在响应数据的前面或后面添加文本。该模块需要配置编译时,添加编译参数--with-http_addition_module。该模块的内置配置指令如所示。
- 响应数据前添加指令

- 响应数据后添加指令

- 响应数据类型指令

配置样例如下:
bash
server {
listen 8081;
server_name localhost;
charset utf-8;
root /opt/nginx-web/html;
location / {
add_before_body /_head.html; # 在响应数据前添加/_head.html的响应数据
add_after_body /_footer.html; # 在响应数据后添加/_footer.html的响应数据
index index.html;
}
}
模块:ngx_http_sub_module
该模块可以通过内建指令将响应数据中的字符串替换成指定的字符串。该模块需要配置编译时,需要添加编译参数--with-http_sub_module。该模型的内置配置指令如表所示。
- 字符串替换指令

- 保留最后编辑字段指令

- 仅替换一次指令

- 替换数据类型指令

配置样例如下:
bash
location / {
sub_filter_types text/html;
sub_filter_once off;
sub_filter '<a href="http://127.0.0.1:8080/' '<a href="https://$host/';
sub_filter '<img src="http://127.0.0.1:8080/' '<img src="https://$host/';
}
3.5、gzip压缩
模块:ngx_http_gzip_module
为提高用户获取响应数据的速度,Nginx服务器可以将响应数据进行gzip压缩,在减小响应数据的大小后再发送给用户端浏览器,相对于使用户浏览Web页面,上述方式显示速度更快。要想启用响应数据gzip压缩功能,需要用户浏览器也支持gzip解压功能,目前大多数浏览器都支持gzip压缩数据的显示。Nginx服务器接收客户端浏览器发送的请求后,通过请求头中的属性字段Accept-Encoding判断浏览器是否支持gzip压缩,对支持gzip压缩的浏览器将发送gzip压缩的响应数据。该模块的内置配置参数如表所示。
- gzip压缩指令

- gzip压缩缓冲区指令

- gzip压缩关闭指令

- gzip压缩HTTP版本指令

- gzip压缩最小长度指令

- gzip压缩代理指令

指令值选项说明如下。- off:关闭该指令功能。
- expired:若HTTP响应头中包含属性字段Expires,则启用压缩。
- no-cache:若HTTP响应头中包含属性字段Cache-Control:no-cache,则启用压缩。
- no-store:若HTTP响应头中包含属性字段Cache-Control:no-store,则启用压缩。
- private:若HTTP响应头中包含属性字段Cache-Control:private,则启用压缩。
- no_last_modified:若HTTP响应头中不包含属性字段Last-Modified,则启用压缩。
- no_etag:若HTTP响应头中不包含属性字段ETag,则启用压缩。
- auth:若HTTP响应头中包含属性字段Authorization,则启用压缩。
- any:对所有响应数据启用压缩。
- gzip响应数据类型指令

- gzip_vary指令

模块:ngx_http_gunzip_module
当客户端浏览器不支持gzip压缩时,该模块将压缩的数据解压后发送给客户端。对支持gzip压缩的浏览器不做处理。该模块的内置配置指令如表所示。
- gzip解压指令

- gzip解压缓冲区指令

模块:ngx_http_gzip_static_module
通常gzip压缩指令都是读取未压缩的文本,在进行动态压缩后把响应数据发送给客户端,该模块可以使Nginx把gzip压缩过的以.gz为后缀的文件或已压缩的响应数据直接发送给客户端。
该模块的内置配置指令如表所示。
- 静态压缩指令
- on:不检查客户端是否支持gzip压缩数据,始终发送gzip压缩数据。
- always:不检查客户端是否支持gzip压缩数据,始终发送gzip压缩数据。
- 该指令的执行优先级高于gzip指令。
- 开启该指令后,默认优先查找以.gz为后缀的文件。
- gzip_types指令对gzip_static的设置无效。
配置样例如下:
bash
gzip_static always; # 始终发送静态的gzip压缩数据
gunzip on; # 若客户端浏览器不支持gzip压缩数据,则解压后发送
gunzip_buffers 16 8k; # 解压缓冲区大小为128KB
gzip_proxied expired no-cache no-store private auth; # 当被代理的服务器符合条件时,
# 对响应数据启用gzip压缩
gzip on; # 启用动态gzip压缩功能
gzip_min_length 1k; # 响应数据超过1KB时启用gzip压缩
gzip_buffers 4 16k; # 动态压缩的缓冲区大小是64KB
gzip_comp_level 3; # 压缩级别为3
gzip_types text/plain application/x-javascript
text/css application/xml text/javascript
application/x-httpd-php image/jpeg
image/gif image/png; # 对指定的MIME类型数据启用动态压缩
gzip_vary on; # 向前端代理或缓存服务器发送添加"Vary: Accept-
# Encoding"的响应数据