Nginx 主要模块解析

您所在的位置:网站首页 sub_filter的用法 Nginx 主要模块解析

Nginx 主要模块解析

#Nginx 主要模块解析| 来源: 网络整理| 查看: 265

Nginx 主要模块解析 1. 主页随机模块1.1 random_index1.2 例子 2. 替换模块2.1 sub_filter2.2 sub_filter_last_modified2.3 sub_filter_once2.4 sub_filter_types2.5 例子 3. 文件读取模块3.1 sendfile3.2 tcp_nopush3.3 tcp_nodelay3.4 例子 4. 文件压缩模块4.1 gzip4.2 gzip_disable4.3 gzip_min_length4.4 gzip_buffers4.5 gzip_vary4.6 gzip_proxied4.7 gzip_comp_level4.8 gzip_http_version4.9 gzip_types4.10 例子 5. 网页缓存模块5.1 expires5.2 例子 6. 防盗链模块6.1 valid_referers6.2 referer_hash_bucket_size6.3 referer_hash_max6.4 例子 7. 连接状态模块7.1 stub_status7.2 例子, 浏览及含义7.3 请求与连接7.4 与 TCP 连接相关的一个参数 8. 访问限制模块8.1 limit_req_zone8.2 limit_conn_zone8.3 limit_req8.4 limit_conn8.5 limit_rate8.6 limit_rate_after8.7 压力测试8.7.1 安装和使用8.7.2 结果解析 8.8 例子和结果 9. 访问控制模块9.1 基于主机 (IP) 访问控制9.1.1 allow && deny9.1.2 例子 9.2 基于用户 (username/password) 访问控制9.2.1 auth_basic9.2.2 auth_basic_user_file9.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; 状态下 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; off: 关闭所有代理结果的数据的压缩.expired: 启用压缩, header 头中包括 “Expires” 头信息.no-cache: 启用压缩, header 头中包含 “Cache-Control:no-cache”.no-store: 启用压缩, header 头中包含 “Cache-Control:no-store”.private: 启用压缩, header 头中包含 “Cache-Control:private”.no_last_modefied: 启用压缩, header 头中不包含"Last-Modified".no_etag: 启用压缩, header 头中不包含 “Etag” 头信息.auth: 启用压缩, header 头中包含 “Authorization” 头信息.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: 指定 “Expires” 的值为 Thu, 01 Jan 1970 00:00:01 GMT.max: 指定 “Expires” 的值为 Thu, 31 Dec 2037 23:55:55 GMT, “Cache-Control” 的值为 max-age=315360000. (10 年)-1: 指定 “Expires” 的值为当前服务器时间 -1s, 即永远过期.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; none: 允许缺失 referer 头部的请求访问.block: 允许 referer 头部没有对应的值的请求访问.server names: 若 referer 中站点域名与 server_name 中本机域名某个匹配, 则允许该请求访问.表示域名及 URL 的字符串, 对域名可在前缀或者后缀中含有 * 通配符: 若 referer 头部的值匹配字符串后, 则允许访问.正则表达式: 若 referer 头部的值匹配正则表达式后, 则允许访问.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; address: IP 地址.CIDR: 无类别域间路由. (IP 访问段)unix: 一种按照 Socket 访问的方式.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; ...... }

在这里插入图片描述



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3