Nginx 主要模块解析

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; 状态下 copy 2 次.
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; IE5.5 和 IE6 SP1 使用 msie6 参数来禁止 gzip 压缩, 依赖于 PCRE 库.

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; 页面字节数从 header 头的 Content-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: 启用压缩, header 头中包括 “Expires” 头信息.
  3. no-cache: 启用压缩, header 头中包含 “Cache-Control:no-cache”.
  4. no-store: 启用压缩, header 头中包含 “Cache-Control:no-store”.
  5. private: 启用压缩, header 头中包含 “Cache-Control:private”.
  6. no_last_modefied: 启用压缩, header 头中不包含"Last-Modified".
  7. no_etag: 启用压缩, header 头中不包含 “Etag” 头信息.
  8. auth: 启用压缩, header 头中包含 “Authorization” 头信息.
  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” 的头标, 起到控制页面缓存的作用.

  1. time: 正数或负数. “Expires” 头标的值将通过当前系统时间加上设定 time 值来设定.
    正数: “Cache-Control” 的值 max-age=time.
    负数: “Cache-Control” 的值表示 no-cache.
  2. epoch: 指定 “Expires” 的值为 Thu, 01 Jan 1970 00:00:01 GMT.
  3. max: 指定 “Expires” 的值为 Thu, 31 Dec 2037 23:55:55 GMT, “Cache-Control” 的值为 max-age=315360000. (10 年)
  4. -1: 指定 “Expires” 的值为当前服务器时间 -1s, 即永远过期.
  5. off: 不修改 “Expires” 和 “Cache-Control” 的值.
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;
  1. none: 允许缺失 referer 头部的请求访问.
  2. block: 允许 referer 头部没有对应的值的请求访问.
  3. server names: 若 referer 中站点域名与 server_name 中本机域名某个匹配, 则允许该请求访问.
  4. 表示域名及 URL 的字符串, 对域名可在前缀或者后缀中含有 * 通配符: 若 referer 头部的值匹配字符串后, 则允许访问.
  5. 正则表达式: 若 referer 头部的值匹配正则表达式后, 则允许访问.
  6. invalid_referer: 允许访问时值是空, 不允许访问时值是 1.
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 connectionsNginx 当前活跃连接数
serverNginx 处理接收连接的总次数
acceptsNginx 处理接收成功连接的连接数
handled requests总共处理请求次数
ReadingNginx 读取到客户端的 Header 信息数.
WritingNginx 返回给客户端的 Header 信息数.
WaitingNginx 开启 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: 每个连接限速 bytes. 若一个IP允许两个并发连接, 那么 IP 限速为 bytes × 2.

8.6 limit_rate_after
	module: ngx_http_core_module;
	Syntax: limit_rate_after bytes;
	Default: -
	Context: http, server, location;

bytes: 以最大的速度下载 bytes 大小后, 在进行以 limit_rate 限速.

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;
  1. address: IP 地址.
  2. CIDR: 无类别域间路由. (IP 访问段)
  3. unix: 一种按照 Socket 访问的方式.
  4. 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;
	......
}

在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值