Nginx 主要模块解析
- 1. 主页随机模块
- 1.1 random_index
- 1.2 例子
- 2. 替换模块
- 2.1 sub_filter
- 2.2 sub_filter_last_modified
- 2.3 sub_filter_once
- 2.4 sub_filter_types
- 2.5 例子
- 3. 文件读取模块
- 3.1 sendfile
- 3.2 tcp_nopush
- 3.3 tcp_nodelay
- 3.4 例子
- 4. 文件压缩模块
- 4.1 gzip
- 4.2 gzip_disable
- 4.3 gzip_min_length
- 4.4 gzip_buffers
- 4.5 gzip_vary
- 4.6 gzip_proxied
- 4.7 gzip_comp_level
- 4.8 gzip_http_version
- 4.9 gzip_types
- 4.10 例子
- 5. 网页缓存模块
- 5.1 expires
- 5.2 例子
- 6. 防盗链模块
- 6.1 valid_referers
- 6.2 referer_hash_bucket_size
- 6.3 referer_hash_max
- 6.4 例子
- 7. 连接状态模块
- 7.1 stub_status
- 7.2 例子, 浏览及含义
- 7.3 请求与连接
- 7.4 与 TCP 连接相关的一个参数
- 8. 访问限制模块
- 8.1 limit_req_zone
- 8.2 limit_conn_zone
- 8.3 limit_req
- 8.4 limit_conn
- 8.5 limit_rate
- 8.6 limit_rate_after
- 8.7 压力测试
- 8.7.1 安装和使用
- 8.7.2 结果解析
- 8.8 例子和结果
- 9. 访问控制模块
- 9.1 基于主机 (IP) 访问控制
- 9.1.1 allow && deny
- 9.1.2 例子
- 9.2 基于用户 (username/password) 访问控制
- 9.2.1 auth_basic
- 9.2.2 auth_basic_user_file
- 9.2.3 创建认证信息的文件
- 9.2.4 例子和显示
module: 模块; Syntax: 语法; Default: 默认状态; Context: 配置段;
1. 主页随机模块
用于随机生成页面, 属于微调更新机制.
此模块默认是禁止状态.
开启该模块: 需要在安装 Nginx 时加上配置参数--with-http_random_index_module
.
1.1 random_index
module: ngx_http_random_index_module;
Syntax: random_index on | off;
Default: random_index off;
Context: location;
1.2 例子
此时 index 行可有可无. 无论有无: 随机文件夹下所有可用文件.
location / {
root html;
random_index on;
}
2. 替换模块
用于替换, 应用于及时替换状态.
替换并没有改动底层代码.此模块默认是禁止状态.
开启该模块: 需要在安装 Nginx 时加上配置参数--with-http_sub_module
.
指令:
1. sub_filter: 用来替换文本.
2. sub_filter_last_modified: 是否阻止 response header 中写入 Last-Modified.
3. sub_filter_once: 设置字符串替换次数, 默认只替换一次.
4. sub_filter_types: 指定需要被替换的 MIME 类型.
2.1 sub_filter
module: ngx_http_sub_module;
Syntax: sub_filter string replacement;
Default: -
Context: http, server, location;
replacement 替换 string 不区分大小写.
2.2 sub_filter_last_modified
module: ngx_http_sub_module;
Syntax: sub_filter_last_modified on | off;
Default: sub_filter_last_modified off;
Context: http, server, location;
off: 防止缓存.
2.3 sub_filter_once
module: ngx_http_sub_module;
Syntax: sub_filter_once on | off;
Default: sub_filter_once on;
Context: http, server, location;
on:
只替换第一次匹配到的字符.off:
2.4 sub_filter_types
module: ngx_http_sub_module;
Syntax: sub_filter_types * | mime-type [mime-types];
Default: sub_filter_types text/html;
Context: http, server, location;
*
2.5 例子
.......
sub_filter 'nginx' 'java';
.......
location / {
root html;
index index.html;
sub_filter_once off;
sub_filter_last_modified off;
sub_filter_types *;
}
3. 文件读取模块
用于网络传输, 网络资源的设置.
此模块默认是启动状态.
禁止该模块: 需要在安装 Nginx 时加上配置参数--without-http_core_module
.
很明显是核心模块, 故安装了 Nginx 就不要关闭该模块.
指令:
1. sendfile: 是否关闭传统文件传输.
2. tcp_nopush: 是否多个包到达一定大小整合发送.
3. tcp_nodelay: 是否确定重放信息.
3.1 sendfile
module: ngx_http_core_module;
Syntax: sendfile on | off;
Default: sendfile off;
Context: http, server, location, if in location;
传统文件传输需要 copy
6
次, 而 sendfile on; 状态下 copy2
次.sendfile on;
3.2 tcp_nopush
module: ngx_http_core_module;
Syntax: tcp_nopush on | off;
Default: tcp_nopush off;
Context: http, server, location
tcp_nopush off; 状态下若文件一次传输的大小很小, 而却进行大量的传输, 这样会产生大量的 buffer 数据. 容易产生阻塞, 而且浪费资源.
tcp_nopush on;
状态下将一次传输很小的文件, 累积到一定大小, 进行打包发送, 这样 buffer 数据比 tcp_nopush off; 下降低数倍.
这里的 buffer 数据就是发送一次文件的时候带有的40 字节的包头
.
3.3 tcp_nodelay
module: ngx_http_core_module;
Syntax: tcp_nodelay on | off;
Default: tcp_nodelay on;
Context: http, server, location;
tcp_nodelay on; 状态下
keepalive
3.4 例子
http {
......
sendfile on;
tcp_nopush on;
tcp_nodelay on;
......
}
4. 文件压缩模块
用于压缩文件, 提高传输速度.
此模块默认是启动状态.
禁止该模块: 需要在安装 Nginx 时加上配置参数--without-http_gzip_module
.
指令:
1. gzip: 是否开启压缩功能.
2. gzip_disable: 指定浏览器对开启压缩功能无效.
3. gzip_min_length: 设置允许压缩页面的最小字节数.
4. gzip_buffers: 申请多少个单位运用多少内存进行压缩.
5. gzip_vary: 是否开启 vary header 支持.
6. gzip_proxied: 代理结果数据的压缩.
7. gzip_comp_level: 设置压缩比率.
8. gzip_http_version: 识别 http 协议的版本.
9. gzip_types: 指定压缩对 MIME 类型生效.
4.1 gzip
module: ngx_http_gzip_module;
Syntax: gzip on | off;
Default: gzip off;
Context: http, server, location;
4.2 gzip_disable
module: ngx_http_gzip_module;
Syntax: gzip_disable browser_type;
Default: -
Context: http, server, location;
gzip_disable msie6;
4.3 gzip_min_length
module: ngx_http_gzip_module;
Syntax: gzip_min_length bytes;
Default: gzip_min_length 0k;
Context: http, server, location;
建议使用
gzip_min_length 1k;
4.4 gzip_buffers
module: ngx_http_gzip_module;
Syntax: gzip_buffers number bytes;
Default: gzip_buffers n nk; (n 为正整数)
Context: http, server, location;
默认值: 申请与原始数据值相同的内存空间来存储 gzip 压缩.
4.5 gzip_vary
module: ngx_http_gzip_module;
Syntax: gzip_vary on | off;
Default: gzip_vary off;
Context: http, server, location;
gzip_vary on
状态下 在 Header 里增加 “Vary: Accept-Encoding”, 让 CDN 缓存服务器发给客户端的文件也要进行压缩.
4.6 gzip_proxied
module: ngx_http_gzip_module;
Syntax: gzip_proxied off | expired | no-cache | no-store | private | no_last_modefied | no_etag | auth | any |...;
Default: gzip_proxied off;
Context: http, server, location;
1.
off:
2.
expired:
3.
no-cache:
4.
no-store:
5.
private:
6.
no_last_modefied:
7.
no_etag:
8.
auth:
9.
any:
4.7 gzip_comp_level
module: ngx_http_gzip_module;
Syntax: gzip_comp_level [1-9];
Default: gzip_comp_level 1;
Context: http, server, location;
gzip 压缩级别为 [1, 9], 值越小压缩效果越差, 也消耗 CPU; 值越大处理越慢. 建议取 4, 5, 6 中一个.
4.8 gzip_http_version
module: ngx_http_gzip_module;
Syntax: gzip_http_version http_version;
Default: gzip_http_version 1.1;
Context: http, server, location;
识别 http 协议的版本, 早起浏览器可能不支持 gzip 自解压, 用户可能会看到乱码.
4.9 gzip_types
module: ngx_http_gzip_module;
Syntax: gzip_types http_version;
Default: gzip_types text/html;
Context: http, server, location;
对指定的 MIME 类型生效, 其中
text/html
4.10 例子
http {
......
gzip on;
gzip_vary on;
gzip_disable msie6;
gzip_http_version 1.1;
gzip_min_length 1k;
......
server {
gzip_buffers 4 8k;
......
location / {
......
gzip_vary on;
gzip_proxied any;
gzip_comp_level 5;
gzip_types application/javascript text/css;
......
}
......
}
......
}
5. 网页缓存模块
用于设置网络缓存, 减少服务器压力.
此模块默认是启动状态.
禁止该模块: 需要在安装 Nginx 时加上配置参数--without-http_headers_module
.
5.1 expires
module: ngx_http_headers_module;
Syntax: expires off | epoch | max | [modified] time;
Default: expires off;
Context: http, server, location, if in location;
控制 HTTP 应答中的 “Expires” 和 “Cache-Control” 的头标, 起到控制页面缓存的作用.
time:
正数或负数. “Expires” 头标的值将通过当前系统时间加上设定 time 值来设定.
正数: “Cache-Control” 的值 max-age=time.
负数: “Cache-Control” 的值表示 no-cache.epoch:
max:
- -1: 指定 “Expires” 的值为当前服务器时间 -1s, 即永远过期.
off:
5.2 例子
server {
......
expires 24h;
......
}
6. 防盗链模块
用于拒绝非正常行为访问网站的资源.
此模块默认是启动状态.
禁止该模块: 需要在安装 Nginx 时加上配置参数--without-http_referer_module
.
指令:
1. valid_referers: 指定允许访问的站点.
2. referer_hash_bucket_size: 共享内存.
3. referer_hash_max: 共享内存的最大值.
6.1 valid_referers
module: ngx_http_referer_module;
Syntax: valid_referers none | blocked | server_ names| string ...;
Default: -
Context: server, location;
none:
block:
server names:
- 表示域名及 URL 的字符串, 对域名可在前缀或者后缀中含有
*
- 正则表达式: 若 referer 头部的值匹配正则表达式后, 则允许访问.
invalid_referer:
6.2 referer_hash_bucket_size
module: ngx_http_referer_module;
Syntax: referer_hash_bucket_size size;
Default: referer_hash_bucket_size 64;
Context: server, location;
对 referer 模块设置共享内存, 可以加速访问.
6.3 referer_hash_max
module: ngx_http_referer_module;
Syntax: referer_hash_max size size;
Default: referer_hash_max size 2048;
Context: server, location;
对 referer 模块设置共享内存, 可以加速访问.
6.4 例子
location / {
......
valid_referers none blocked server_names
*.baidu.* ~\.google\. ~\.csdn\.;
referer_hash_bucket_size 64;
referer_hash_max size 2048;
if ($invalid_referer) {
return 403;
}
......
}
7. 连接状态模块
用于观察连接数和请求数.
此模块默认是禁止状态.
启动该模块: 需要在安装 Nginx 时加上配置参数--with-http_stub_status_module
.
7.1 stub_status
module: ngx_http_stub_status_module;
Syntax: stub_status on | off;
Default: stub_status off;
Context: location;
7.2 例子, 浏览及含义
location /stub_status {
stub_status on;
}
显示信息 | 含义 |
Active connections | Nginx 当前活跃连接数 |
server | Nginx 处理接收连接的总次数 |
accepts | Nginx 处理接收成功连接的连接数 |
handled requests | 总共处理请求次数 |
Reading | Nginx 读取到客户端的 Header 信息数. |
Writing | Nginx 返回给客户端的 Header 信息数. |
Waiting | Nginx 开启 keep-alive 的情况下, 这个值等于 active – (reading + writing), 意思就是 Nginx 已经处理完成, 正在等候下一次请求指令的驻留连接. |
7.3 请求与连接
预备知识:
1. HTTP 协议: 简单对象访问协议, 对应于应用层. HTTP 协议是基于 TCP 连接的.
2. TCP 协议: 对应于传输层.
3. IP 协议: 对应于网络层.
4. TCP/IP 是传输层协议, 主要解决数据如何在网络中传输. 而 HTTP 是应用层协议, 主要解决如何包装数据.
5. Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。
6. HTTP 连接: http 连接就是所谓的短连接. 即客户端向服务器端发送一次请求, 服务器端响应后连接即会断掉.
7. socket 连接: socket 连接就是所谓的长连接. 理论上客户端和服务器端一旦建立起连接将不会主动断掉, 但是由于各种特殊原因可能会是连接断开.
请求
对应的是 HTTP 连接.连接
对应的是 TCP 连接.
TCP 连接:
建立起一个可靠的 TCP 连接需要经过三次握手.
理想状态下, TCP 连接一旦建立, 在通信双方中的任何一方主动关闭连接之前, TCP 连接都将被一直保持下去, 断开连接时服务器和客户端均可以主动发起断开 TCP 连接的请求.
在断开过程中需要经过四次握手/四次断开.
HTTP 连接:
最显著的特点是客户端发送的每次请求都需要服务器回送响应, 在请求结束后, 会主动释放连接. 从建立连接到关闭连接的过程称为 "一次连接". (指短连接)
1. 在 HTTP 1.0 中, 客户端的每次请求都要求建立一次单独的连接, 在处理完本次请求后, 就自动释放连接.
2. 在 HTTP 1.1 中, 则可以在一次连接中处理多个请求, 并且多个请求可以重叠进行, 不需要等待一个请求结束后再发送下一个请求.
7.4 与 TCP 连接相关的一个参数
keepalive_timeout: 指定每个 TCP 连接最多可以保持多长时间.
Syntax: keepalive_timeout time;
Default: keepalive_timeout 0;
Context: http, server, location;
例子:
......
keepalive_timeout 60s;
......
8. 访问限制模块
用于限制请求数和连接数, 防止数量及其多恶意攻击网站.
此模块默认是启动状态.
禁止该模块: 需要在安装 Nginx 时加上配置参数--without-http_limit_req_module --without-http_limit_conn_module
.
指令:
1. limit_req_zone: 限制访问请求数, 限制范围为 IP 地址.
2. limit_conn_zone: 限制访问连接数, 限制范围为 IP 地址.
3. limit_req: 进行请求限制.
4. limit_conn: 进行连接限制.
5. limit_rate: 限制文件下载速度.
6. limit_rate_after: 下载文件达到限定值后开始限速.
limit_rate, limit_rate_after 来自 ngx_http_core_module.
8.1 limit_req_zone
module: ngx_http_limit_req_module;
Syntax: limit_req_zone $session_variable zone=name:size rate=rate;
Default: -
Context: http;
为 session 会话状态分配名字为 name, 大小为 size 的内存存储区, 限制了每秒 (分, 小时) 只接受 rate 个 IP 的频率.
8.2 limit_conn_zone
module: ngx_http_limit_conn_module;
Syntax: limit_conn_zone $variable zone=name:size;
Default: -
Context: http;
指令描述会话状态名字为 name 的存储区域. 会话的数目按照指定的变量来决定, 它依赖于使用的变量大小 size 和 memory_max_size 的值.
8.3 limit_req
module: ngx_http_limit_req_module;
Syntax: limit_req zone=name burst=burst [nodelay];
Default: -
Context: http, server, location;
zone:
内存存储区名称.burse:
若请求的速率超过了 limit_req_zone 指令中设置的速率, 这些请求将被延迟处理, 在这种情况下, 请求获得服务不可用信息, 返回 503 状态码.
8.4 limit_conn
module: ngx_http_limit_conn_module;
Syntax: limit_conn zone_name max_clients_per_ip_number;
Default: -
Context: http, server, location;
zone_name:
内存存储区名称.max_clients_per_ip_number:
指令指定一个会话的最大同时连接数, 超过这个数字的请求将被返回 “Service unavailable” (503) 代码.
8.5 limit_rate
module: ngx_http_core_module;
Syntax: limit_rate bytes;
Default: -
Context: http, server, location;
bytes:
8.6 limit_rate_after
module: ngx_http_core_module;
Syntax: limit_rate_after bytes;
Default: -
Context: http, server, location;
bytes:
8.7 压力测试
8.7.1 安装和使用
下载 httpd-tools 包.
yum install httpd-tools; # yum 源安装.
ab -V; # 查看版本.
ab -help; # 查看参数以及含义.
ab -n 100 -c 10 url # 对 url 一共请求 100 次, 并发请求 10 次.
8.7.2 结果解析
信息 | 解析 |
Server Software | 访问 url 用的服务器软件 |
Server Hostname | 主机名/域名 |
Server Port | 端口号 |
Document Path | 路径 |
Document Length | 文件长度 |
Concurrency Level | 并发级别 |
Time taken for tests | 测试所用时间 |
Complete requests | 完成请求 |
Failed requests | 失败的请求 |
(Connect: 0, Receive: 0, Length: 68, Exceptions: 0) | (连接: 0, 接收: 0, 长度: 68, 异常: 0) |
Write errors | 写入错误 |
Total transferred | 传输的总共的大小 |
HTML transferred | 传输的 HTML 的大小 |
Requests per second | 每秒请求数 |
Time per request | 每次请求的时间 |
Time per request | 每次请求的时间 |
Transfer rate | 传输的速率 |
8.8 例子和结果
http {
......
limit_req_zone $binary_remote_addr zone=lim_req:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=lim_conn:10m;
......
location / {
......
limit_req zone=lim_req burst=20;
limit_conn lim_conn 50;
limit_rate_after 10m;
limit_rate 512k;
......
}
......
}
$binary_remote_addr:
是限制同一客户端 IP 地址.$server_name:
是限制同一 server 最大并发数.用压力测试看结果.
ab -n 300 -c 15 http://localhost/
Complete requests: 300
Failed requests: 285
可以看出已经限制了.
9. 访问控制模块
用于有权限才可以访问. 防止泄露.
9.1 基于主机 (IP) 访问控制
此模块默认是启动状态.
禁止该模块: 需要在安装 Nginx 时加上配置参数--without-http_access_module
.
指令:
1. allow: 允许进行访问.
2. deny: 禁止进行访问.
9.1.1 allow && deny
module: ngx_http_access_module;
Syntax: allow | deny address | CIDR | unix: | all;
Default: -
Context: http, server, location, limit_except;
address:
CIDR:
unix:
all:
9.1.2 例子
location / {
root html;
index index.html;
deny 192.168.1.2;
allow 192.168.1.0/24;
allow 192.168.2.0/24;
deny all;
}
IP 至, 上通下, 遇则止.
9.2 基于用户 (username/password) 访问控制
此模块默认是启动状态.
禁止该模块: 需要在安装 Nginx 时加上配置参数--without-http_auth_basic_module
.
指令:
1. auth_basic: 是否开启用户权限访问, 若开启定义提示信息.
2. auth_basic_user_file: 存储用户认证信息的文件.
9.2.1 auth_basic
module: ngx_http_auth_basic_module;
Syntax: auth_basic string | off;
Default: auth_basic off;
Context: http, server, location, limit_except;
string:
表示已开启, 登录的提示信息.off:
9.2.2 auth_basic_user_file
module: ngx_http_auth_basic_module;
Syntax: auth_basic_user_file file_path;
Default: -
Context: http, server, location, limit_except;
file_path:
9.2.3 创建认证信息的文件
需要安装 httpd-tools.
htpasswd -cm /mnt/data/nginx/auth_basic/password user1;
htpasswd -m /mnt/data/nginx/auth_basic/password user2;
c:
创建.m:
加密.建立一个 user1 用户后, 已经存在 password 文件, 在建立 user2 用户就不用再创建.
9.2.4 例子和显示
location / {
......
auth_basic "Please input user and password!";
auth_basic_user_file /mnt/data/nginx/auth_basic/password;
......
}