当前位置: 首页 > news >正文

Nginx之HTTP模块详解

        Nginx是模块化的代码架构,其代码由核心代码与功能模块代码构成。Nginx的主要功能模块是HTTP功能模块,HTTP功能模块在HTTP核心功能的基础上为Nginx对HTTP请求的处理流程提供了扩展功能,这些扩展功能可以让用户很方便地应对访问控制、数据处理、代理缓存等各种复杂的场景应用,同时也让有开发能力的用户能够积极参与,不断增强Nginx的功能。由于功能模块比较多,为了便于对各功能模块进行介绍,此处按照模块的功能进行如下分类:

                动态赋值:可根据HTTP请求的变化动态地进行变量赋值的功能模块。

                访问控制:对外部访问请求做认证、数量限制等功能的模块。

                数据处理:对用户的响应数据进行过滤或修改的功能模块。

                协议客户端:可与其他应用协议服务连接的客户端模块。

                协议服务:可运行相关应用协议服务、提供其他客户端访问的功能模块。

                代理负载:对后端服务器实现代理负载的功能模块。

                缓存功能:对响应数据内容实现缓存的功能模块。

                日志管理:对请求的日志进行管理配置的功能模块。

                监控管理:对Nginx自身状态进行监控的功能模块。

1.动态赋值功能模块

        Nginx在核心模块及其他模块中都提供了内置变量,用户可以根据需要灵活调用。在Nginx的模块中除提供了rewrite指令以方便用户对变量进行静态赋值外,还提供了根据请求内容的变化为变量动态赋值的功能。

        1.1 根据浏览器动态赋值

        模块名称:ngx_http_browser_module。该模块的功能是根据客户端HTTP请求头中的属性字段User-Agent的值,按照用户的指令配置设置变量 $modern_browser和$ancient_browser的值。用户可以根据变量$modern_browser和$ancient_browser的值对客户端浏览器进行区分,并对HTTP请求进行不同的处理。

        1.1.1 旧浏览器标识指令

名称旧浏览器标识指令
指令ancient_browser
作用域http、server、location
默认值

-

指令说明当客户端的HTTP请求头中的属性字段User-Agent的值中包含指令值中的字符串时,设置变量$ancient_browser的值为1
#配置样例如下:
http {ancient_browser 'UCWEB';
}
#变量$ancient_browser的值默认为1

         1.1.2 设置旧浏览器变量值指令

名称设置旧浏览器变量值指令
指令ancient_browser_value
作用域http、server、location
默认值

1

指令说明将$ancient_browser的值设置为指定的字符串
#配置样例如下:
http {ancient_browser 'UCWEB';ancient_browser_value oldweb;server {if ($ancient_browser) {rewrite ^ /${ancient_browser}.html;
# 重定向到oldweb.html}}
}

        1.1.3 新浏览器标识指令 

名称新浏览器标识指令 
指令modem_browser
作用域http、server、location
默认值

-

指令说明当客户端浏览器被nginx识别为内置的浏览器类型,且HTTP请求头中的属性字段User-Agent的值中的版本号等于或高于指令值的版本号时,设置变量$modem_browser的值为1
#配置样例如下:
http {modern_browser msie 5.5;
}

        内置浏览器类型有msie、gecko(由Mozilla基 金会维护,Mozilla及Netscape 6后续版本是基于Gecko开发的)、opera、safari、konqueror。

        当指令值为unlisted时,Nginx在HTTP请求头中 的属性字段User-Agent的值为空或无法识别浏览器类型时,设置变量$modern_browser的值为1。

#配置样例如下:
http {modern_browser msie 5.5;modern_browser unlisted;
}

        1.1.4 设置新浏览器变量值指令 

名称设置新浏览器变量值指令 
指令modem_browser_value
作用域http、server、location
默认值

1

指令说明将变量$modem_browser的值设置为指定的字符串
#配置样例如下:
http {modern_browser msie 5.5;modern_browser_value newweb;server {if ($modern_browser) {rewrite ^ /${modern_browser}.html;}}
}

         1.2 根据IP动态赋值

        模块名称:ngx_http_geo_module。该模块的功能是从源变量获取IP地址,并根据设定的IP与对应值的列表对新变量进行赋值。该模块只 有一个geo指令,指令格式如下:

geo [源变量]新变量{}

        geo指令的默认源变量是$remote_addr,新变量默认值为空。

        geo指令的作用域只能是http。

        geo指令的指令值参数如下:

参数名参数描述
delete删除配置中已经存在的相同IP地址的设定
default如果从源变量获取的IP无法匹配任何一个IP或IP范围,通过该参数的参数值为新变量赋值
include引入一个包含IP与对应值的外部文件
proxy指定上层代理IP。当源变量的IP为该参数指定的IP时,nginx将从X-Fowarded-For头中获取IP
proxy-recursive开启代理递归查询。当X-Fowarded-For头中有多个IP时,nginx会将X-Fowarded-For头中的最后一个IP定义为源变量的IP;启用该参数后,nginx会将X-Fowarded-For头中的最后一个IP与所有不属于proxy参数定义的IP定义为源变量的IP
ranges使用地址段的形式定义的IP地址时,该参数必须放在最上面
#配置样例如下:
http{geo $country {proxy_recursive; # 启用代理递归查询default ZZ; # 默认值为ZZinclude conf/geo.conf; # 引入外部列表文件proxy 192.168.100.0/24; # 上层代理地址为192.168.100.0/24的IPproxy 2001:0db8::/32; # 上层代理地址为2001:0db8::/32的IP127.0.0.0/16 US; # 赋值US127.0.0.1/32 RU; # 赋值RU10.1.0.0/16 RU; # 赋值RU192.168.1.0/24 UK; # 赋值UK}
}

        为了加速加载IP来设定变量表,IP地址应按升序填写。 

10.2.0.0/16 RU;
192.168.2.0/24 RU;

        以地址段形式定义的IP地址中ranges参数的配置样例如下:

http{geo $country {ranges; # 使用以地址段的形式定义的IP地址default ZZ;10.1.0.0-10.1.255.255 RU;192.168.1.0-192.168.1.255 UK;}
}

        1.3 根据IP动态获取城市信息

        模块名称:ngx_http_geoip_module

        该模块的功能是将客户端的IP地址与MaxMind数据 库中的城市地址信息进行比对,然后将对应的城市地 址信息赋值给内置变量

        1.3.1 国家信息数据库指令

名称国家信息数据库指令 
指令geoip_country
作用域http
默认值

1

指令说明指定国家信息的MaxMind数据库文件路径

         1.3.2 城市信息数据库指令

名称城市信息数据库指令
指令geoip_city
作用域http
默认值

1

指令说明指定城市信息的MaxMind数据库文件路径

        1.3.3 机构信息数据库指令 

名称机构信息数据库指令 
指令geoip_org
作用域http
默认值

1

指令说明指定机构信息的MaxMind数据库文件路径

        1.3.4 上层代理IP指令 

名称上层代理IP指令 
指令geoip_proxy
作用域http
默认值

-

指令说明指定上层代理IP。当请求的源IP为该参数指定的地址时,Nginx将从“X-Fowarded-For”头中获取客户端IP

        1.3.5 代理递归查询IP指令 

名称代理递归查询IP指令 
指令geoip_proxy_recursive
作用域http
默认值

off

指令值选项on或off
指令说明默认配置下,当geoip_proxy指令被配置且X-Fowarded-For头中有多个IP时,nginx会将X-Fowarded-For头中的最后一个IP定义为客户端IP。启用该指令后,nginx会将X-Fowarded-For头中的最后一个不属于proxy参数定义范围的IP定义为客户端IP
#配置样例如下:
geoip_country /usr/share/GeoIP/GeoIP.dat;
geoip_city
/usr/share/GeoIP/GeoIPCity.dat;
geoip_org
/usr/share/GeoIP/GeoIPASNum.dat;
geoip_proxy 192.168.2.145;
geoip_proxy_recursive on;
server {listen 8081;server_name localhost;charset utf-8;root /opt/nginx-web;default_type text/xml;location / {if ( $geoip_country_code ) {rewrite ^ /$geoip_country_code/break; # 重定向到$geoip_country_cod目录}}
}

        1.4 比例分配赋值

        模块名称:ngx_http_split_clients_module

        该模块会按照配置指令将一个0~232之间的数值根据设定的比例分割为多个数值范围,每个数值范围 会被设定一个对应的给定值。用户每次请求时,指定的字符串会被计算出一个数值,该模块会将该数值所在范围对应的给定值赋值给配置中定义的变量。该功能常用来按照用户的来源IP进行访问流量分流。该指令语法格式如下:

split_clients 字符串 新变量{}
#配置样例如下:
split_clients "${remote_addr}AAA" $source { #"${remote_addr}AAA"会被计算出一个数值
0.5% .one; # 数值在0~21474835之间,$source被赋值".one"
80.0% .two; # 数值在21474836~3435973836之间,$source被赋值".two"
* ""; # 数值在3435973837~4294967295,$source被赋值""
}
server {location / {index index${source}.html;}
}

        该指令会将一个2的32次幂计算的值(数值范围 为0~4294967295)按照指令域中的比例进行分割。

        客户端每次请求时,会将指定字符串使用MurmurHash2算法计算出一个0~232(0~4 294 967 295)之间的数值,该模块会将该数值所在范围对应的 给定值赋值给配置中定义的变量。

        指定的字符串可以是Nginx内置变量。

        1.5 变量映射赋值

        模块名称:ngx_http_map_module

        该模块的功能是在客户端每次请求时,Nginx按照 map指令域中源变量的当前值把设定的对应值赋值给新 变量。该指令语法格式如下:

map 源变量 新变量{}
#配置样例如下:
map $remote_addr $name {hostnames;default 0;example.com 1;*.example.com 1; # 主机名前缀wap.* 4; # 主机名后缀include hostmap.conf;
}

        map指令只能编辑在http指令域中。

        map指令域中指定了源变量为不同值时与新变量 值的对应关系。

        map指令域中源变量的值可以是字符串或正则表 达式的匹配。 

        map指令域中对源变量的值进行正则表达式匹配 时,以“~”开头表示对源变量值的匹配,区分大小 写,以“*”开头表示对源变量值的匹配不区分大小 写。

2.访问控制功能模块

        2.1 访问镜像模块

        Nginx 镜像模块:ngx_http_mirror_module

        Nginx 中镜像模块的功能是将用户的访问请求镜像复制到指定的 URI,通过 location 的 URI 匹配将流量发送到指定的服务器。用户请求的实际请求响应通过 Nginx 返回客户端,镜像服务器的请求响应则会被 Nginx 服务器丢弃。

镜像请求与实际请求是异步处理的,对实际请求无影响。该模块的内置配置指令如下面表格中所示。

        2.1.1 访问镜像指令

名称访问镜像指令
指令mirror
作用域http、server、location
默认值off
指令说明将用户的访问请求镜像到指定的 URI,同级支持多个 URI
#配置样例如下:
server {listen 8080;root /opt/nginx-web/www;location / {mirror /benchmark;index index.html;}location = /benchmark {internal;proxy_pass http://192.168.2.145$request_uri;}
}

        2.1.2 镜像请求体指令

名称镜像请求体指令
指令mirror_request_body
作用域http, server, location
默认值on
指令值可选项on 或 off
指令说明将用户的访问请求体同步镜像到指定的 URI,当启用该指令时,创建镜像子请求前会优先读取并缓存客户端的请求体内容,同时 proxy_request_buffering、fastcgi_request_buffering、scgi_request_buffering 和 uwsgi_request_buffering 等指令的不缓存设置将被关闭
#配置样例如下:
server {listen 8080;server_name localhost;root /opt/nginx-web/www;mirror_request_body off;location / {index index.html;mirror /accesslog;}location = /accesslog {internal;proxy_pass http://192.168.2.145/accesslog/${server_name}_$server_port$request_uri;}
}

        如果该指令值为 off 则不同步请求体。

#配置样例如下:
server {listen 8080;root /opt/nginx-web/www;location / {mirror /benchmark; # 镜像用户请求mirror /benchmark; # 镜像用户请求mirror /benchmark; # 镜像用户请求index index.html;}location = /benchmark {internal;proxy_pass http://192.168.2.145$request_uri;}
}

访问镜像模块可以将用户请求同步镜像到指定的服务器,同时还可以对用户的流量进行放大,通常可以在镜像线上流量后进行压力测试或预生产环境验证。 

        2.2 referer请求头控制模块

         Nginx referer:请求头控制模块

        referer 请求头控制模块可以通过设置请求头中的属性字段 Referer 的值控制访问的拒绝与允许。Referer 字段用来表示当前请求的跳转来源,由于该字段可能会涉及隐私权问题,部分浏览器允许用户不发送该属性字段,因此也会存在浏览器正常的请求头中无 Referer 字段的情况。
        另外,有些代理服务器或防火墙也会把 Referer 字段过滤掉。通常情况下,伪造 Referer 字段的内容是很容易的,因此该模块主要用于浏览器正常发送请求中 Referer 值的过滤。
        虽然通过 Referer 字段进行来源控制并不十分可靠,但用在防盗链的场景中还是基本可以满足需求的。该模块的内置配置指令如下表所示。

指令作用域默认值 指令说明
referer_hash_max_sizeserver, location 2048referer 指令中,存储变量的哈希表的大小
referer_hash_bucket_sizeserver, location64 referer 指令中,存储变量的哈希桶的大小
valid_referersserver, location--当用户的 HTTP 头的属性字段 Referer 的值符合指令值的检测时,设置变量 $invalid_referer 为空

        referer 指令值参数如下表所示。

参数名称参数说明
noneReferer 的值为空
blocked代理服务器或防火墙过滤后的 Referer 值,这些值都不以 http:// 或 https:// 开头
server_namesReferer 的值中包含一个服务器名
#配置样例如下:
server{listen 8080;server_name nginxtest.org;root /opt/nginx-web/www;valid_referers none blocked *.nginxtest.org;# 当Referer为空或内容不包含"http://"或以"https://"开头的主机名为"*.nginxtest.# org"时允许访问if ($invalid_referer) {return 403;}
}

        指令值为字符串时,既可以是包含前缀或后缀的主机名,也可以是包含主机名的 URI。
        指令值为正则表达式时,必须以 ~ 开头,Nginx 将从"http://"或"https://"之后的字符串开始匹配。
        默认变量 $invalid_referer 的值为 1,当 Referer 的值与指令值的内容匹配时,$invalid_referer 的值为空。 

        2.3 IP访问控制模块

        Nginx allow、deny:IP访问控制模块

        Nginx 中IP访问控制模块名称为 ngx_http_access_module,该模块可以对客户端的源 IP 地址进行允许或拒绝访问控制。该模块的内置配置指令如下面表格中所示。

名称允许访问指令
指令 allow
作用域http、server、location、limit_except
默认值--
指令说明允许指定源 IP 的客户端请求访问
名称拒绝访问指令
指令deny
作用域http、server、location、limit_except
默认值--
指令说明拒绝指定源 IP 的客户端请求访问
#配置样例如下:
location / {deny  192.168.1.1;          # 禁止192.168.1.1allow 192.168.0.0/24;       # 允许192.168.0.0/24的IP访问allow 10.1.1.0/16;          # 允许10.1.1.0/16的IP访问allow 2001:0db8::/32;deny  all;
}

        Nginx 会按照自上而下的顺序进行匹配。

        2.4 用户cookie模块

        用户 cookie 模块(ngx_http_userid_module)的作用是为客户端设置 cookie 以标识不同的访问用户。可以通过内部变量 $uid_got 和 $uid_set 记录已接收和设置的 cookie。该模块的内置配置指令如下面表格中所示。

名称用户 cookie 指令
指令userid
作用域http、server、location
默认值off
指令值可选项on、off、v1 或 log
指令说明设置关闭或启用用户 cookie 及启用的方式

        当指令值为 off 时,关闭用户 cookie 接收和记录功能。
        当指令值为 on 时,启用用户 cookie 接收和记录功能,默认为 v2 版本设置 cookie。设置 cookie 的响应头标识为 Set-Cookie2。
        当指令值为 v1 时,使用 v1 版本设置 cookie,设置 cookie 的响应头标识为 Set-Cookie。
        当指令值为 log 时,不设置用户 cookie,但对接收到的 cookie 进行记录。

名称用户 cookie 域指令
指令userid_domain
作用域http, server, location
默认值none
指令说明设置用户 cookie 中的域名,none 表示禁用 cookie 的域设置
名称用户 cookie 过期指令
指令userid_expires
作用域http, server, location
默认值off
指令值可选项time 或 max 或 off
指令说明设置用户 cookie 的过期时间,time 表示客户端保存 cookie 的时间,max 表示 cookie 的过期时间,默认为会话结束即过期
名称用户 cookie 标识指令
指令userid_mark
作用域http, server, location
默认值off
指令值可选项letter 或 digit 或 = 或 off
指令说明设置用户 cookie 的标识机制并设置用作标记的字符。该标识机制用于在保存客户标识符的同时添加或修改 userid_p3p 及 cookie 的过期时间

        用作标记的指令值可以是任意英文字母(区分大小写)、数字或"="。
        userid_mark 设置完成后,将与用户 cookie 中传送的 Base64 格式的标识的第一个字符进行比较,如果不匹配,则重新发送用户标识、userid_p3p 及 cookie 的过期时间。 

名称用户 cookie 名称指令
指令userid_name
作用域http, server, location
默认值uid
指令说明设置 cookie 名称
名称用户 p3p 指令
指令userid_p3p
作用域http、server、location
默认值none
指令说明设置是否将 p3p 头属性字段同 cookie 一同发送

         P3P 是 W3C 推荐的隐私保护标准,P3P 头属性字段通常用于解决与支持 P3P 协议的浏览器的跨域访问问题。

名称用户 cookie 路径指令
指令userid_path
作用域http, server, location
默认值--
指令说明设置 cookie 路径
名称 用户 cookie 源服务器指令
指令userid_service
作用域http, server, location
默认值--
指令说明设置 cookie 的发布服务器。当 cookie 标识符由多个服务器发出时,为确保用户标识的唯一性,则应为每个服务器分配编号,cookie 版本 1 时默认为 0,cookie 版本 2 时默认为服务器 IP 地址的最后 4 个八位字节组成的数字
#配置样例如下:
server {listen 8083;server_name example.com;root /opt/nginx-web;auth_request /auth;userid         on;userid_name    uid;userid_domain  example.com;userid_path    /;userid_expires 1d;userid_p3p     'policyref="/w3c/p3p.xml", CP="CUR ADM OUR NOR STA NID"';location / {index  index.html index.htm;add_header    Set-Cookie "username=$remote_user";}location /auth {proxy_pass_request_body off;proxy_set_header Content-Length "";proxy_set_header X-Original-URI $request_uri;proxy_pass http://192.168.2.145:8080/HttpBasicAuth.php;}
}

        2.5 并发连接数限制模块 

        Nginx 中的并发连接数限制模块(ngx_http_limit_conn_module)能够对访问连接中含有指定变量且变量值相同的连接进行计数,指定的变量可以是客户端 IP 地址或请求的主机名等。当计数值达到 limit_conn 指令设定的值时,将会对超出并发连接数的连接请求返回指定的响应状态码(默认状态码为 503)。
        该模块只会对请求头已经完全读取完毕的请求进行计数统计。由于 Nginx 采用的是多进程的架构,该模块通过共享内存存储计数状态以实现多个进程间的计数状态共享。该模块的内置配置指令如下面表格中所示。

名称计数存储区指令
指令limit_conn_zone
作用域http
默认值--
指令说明设定用于存储指定变量计数的共享内存区域
名称连接数设置指令
指令limit_conn
作用域http, server, location
默认值--
指令说明设置指定变量的最大并发连接数
名称连接数日志级别指令
指令limit_conn_log_level
作用域http、server、location
默认值error
指令值可选项info、notice、warn、error
指令说明当指定变量的并发连接数达到最大值时,输出日志的级别
名称连接数状态指令
指令limit_conn_status
作用域http、server、location
默认值503
指令说明当指定变量的并发连接数达到最大值时,请求返回的状态码
#配置样例如下:
limit_conn_zone $binary_remote_addr zone=addr:10m;  # 对用户IP进行并发计数,将计数内存区命# 名为addr,设置计数内存区大小为10MB
server {location /web1/ {limit_conn addr 1;                                                      # 限制用户的并发连接数为1}
}

        imit_conn_zone 的格式为 limit_conn_zone key zone=name:size。
        limit_conn_zone 的 key 可以是文本、变量或文本与变量的组合。
        $binary_remote_addr 为 IPv4 时占用 4B,为 IPv6 时占用 16B。
        limit_conn_zone 中 1MB 的内存空间可以存储 32 000 个 32B 或 16 000 个 64B 的变量计数状态。
        变量计数状态在 32 位系统平台占用 32B 或 64B,在 64 位系统平台占用 64B。
        并发连接数同样支持多个变量的同时统计,配置样例如下: 

limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;server {...limit_conn perip 10;limit_conn perserver 100;
}

3.数据处理功能模块

        3.1 首页处理模块

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

名称首页指令
指令 index
作用域http、server、location
默认值index index.html
指令说明设置 HTTP 服务器的默认首页
#配置样例如下:
location / {index index.$geo.html index.html;
}

        指令值为多个文件时,会按照从左到右的顺序依次查找,找到对应文件后将结束查找。

名称随机首页指令
指令random_index
作用域location
默认值off
指令值可选项on 或 off
指令说明随机读取文件目录下的文件内容为首页内容
#配置样例如下:
root /opt/nginx-web/html;
location / {random_index on;
}

        该指令的执行优先级高于 index 指令,文件目录中的隐藏文件将被忽略。

名称自动首页指令
指令 autoindex
作用域http、server、location
默认值off
指令值可选项on 或 off
指令说明

自动创建目录文件列表为目录首页

名称自动首页格式指令
指令autoindex_format
作用域http、server、location
默认值html
指令值可选项html 或 xml 或 json 或 jsonp
指令说明设置 HTTP 服务器的自动首页文件格式
名称 自动首页文件大小指令
指令autoindex_exact_size
作用域http、server、location
默认值on
指令值可选项on 或 off
指令说明设置 HTTP 服务器的自动首页显示文件大小。默认文件大小单位为 Byte,当指令值为 off 时,将根据文件大小自动换算为 KB 或者 MB 或者 GB 的单位大小
名称自动首页时间指令
指令autoindex_localtime
作用域http、server、location
默认值off
指令值可选项on 或 off
指令说明按照服务器时间显示文件时间。默认显示的文件时间为 GMT 时间。当指令值为 on 时,显示的文件时间为服务器时间
#配置样例如下:
location / {autoindex on;autoindex_format html;autoindex_exact_size off;autoindex_localtime on;
}

        3.2 请求频率限制模块

        Nginx 的请求频率限制模块(ngx_http_limit_req_module)会对指定变量的请求次数进行计数,当该变量在单位时间内的请求次数超过设定的数值时,后续请求会被延时处理,当被延时处理的请求数超过指定的队列数时,将返回指定的状态码(默认状态码为 503)。
        通常该模块被用于限定同一 IP 客户端单位时间内请求的次数。该模块通过共享内存存储计数状态以实现多个工作进程间的同一变量计数状态的共享。该模块的内置配置指令如下面表格中所示。

名称计数存储区指令
指令limit_req_zone
作用域http
默认值--
指令说明设定用于存储指定变量请求计数的共享内存区域
名称请求限制设置指令
指令limit_req
作用域http, server, location
默认值--
指令说明启用请求限制并进行请求限制的相关配置
名称请求限制日志级别指令
指令limit_req_log_level
作用域http, server, location
默认值error
指令值可选项info, notice, warn, error
指令说明当指定变量的并发连接数达到最大值时,输出日志的级别
名称请求限制状态指令
指令limit_req_status
作用域http, server, location
默认值503
指令说明当指定变量的并发连接数达到最大值时,请求返回的状态码
#配置样例如下:
http {limit_req_zone $server_name zone=addr:10m rate=1r/s;# 限制访问当前站点的请求数,对站点请求计数,将计数内存区命名为addr,# 设置计数内存区大小为10MB,请求限制为1秒1次server {location /search/ {limit_req zone=one;       # 同一秒只接收一个请求,其余的立即返回状态码503,直到第2秒才接收新的请求limit_req zone=one burst=5;# 同一秒接收6个请求,其余的返回状态码503,只处理一个请求,其余5个请求进入队# 列,每秒向Nginx释放一个请求进行处理,同时允许接收一个新的请求进入队列limit_req zone=one burst=5 nodelay; # 同一秒接收6个请求,其余的返回状态码503,同时处理6个请求,6秒后再接收新的请求}}
}

        limit_req_zone 的 rate 参数的作用是对请求频率进行限制,有 r/s(每秒的请求次数)和 r/m(每分钟的请求次数)两个频率单位,也可根据每秒的次数换算成毫秒单位的次数。1MB 内存大小大约可以存储 16000 个 IP 地址的状态信息。
        limit_req 的 burst 参数相当于一个缓冲容器,该容器内可容纳 burst 所设置的数量的请求,没有 nodelay 参数时,将匀速向 Nginx 释放需要处理的请求。未进入 burst 容器队列的请求将被返回状态码 503 或由 limit_req_status 指令指定的状态码。
        limit_req 的 nodelay 参数是指对请求队列中的请求不进行延时等待,而是立即处理。
        请求频率同样支持多个变量的同时计数及叠加,配置样例如下: 

limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s;
limit_req_zone $server_name zone=perserver:10m rate=10r/s;  server {...limit_req zone=perip burst=5 nodelay;limit_req zone=perserver burst=10;
}

        3.3 页面缓存时间配置

        ginx 缓存的设置可以提高网站性能,对于网站的图片,尤其是新闻网站,图片一旦发布,改动的可能是非常小的,为了减小对服务器请求的压力,提高用户浏览速度,我们可以通过设置 Nginx 中的 expires 指令,让用户访问一次后,将图片缓存在用户的浏览器中。
        需要注意的是,这种缓存方式只能在用户不对浏览器强制刷新的情况下生效,如果用户通过 url 来进行访问,是可以访问到缓存的。
        Nginx 中的 expires 指令的介绍如下表所示:

名称缓存时间指令
指令expires
作用域http、server、location、if in location
默认值off
指令值可选项时间或 epoch 或 max 或 off
指令说明当响应状态码为 200、201、204、206、301、302、303、304、307 或 308 时,对响应头中的属性字段"Expires"和"Cache-Control"进行添加或编辑操作

        当指令值为时间时,既可以是正值也可以是负值。Expires 的值为当前时间与指令值的时间之和。当指令值的时间为正或 0 时,Cache-Control 的值为指令值的时间。当指令值的时间为负时,Cache-Control 的值为 no-cache。

        当指令值为时间时,可用前缀 @ 指定一个绝对时间,表示在当天的指定时间失效。

        当指令值为 epoch 时,Expires 的值为 Thu,01 Jan 1970 00:00:01 GMT,Cache-Control 的值为 no-cache。

        当指令值为 max 时,Expires 的值为 Thu,31 Dec 2037 23:55:55 GMT,Cache-Control 的值为 10 年。

        当指令值为 off 时,不对响应头中的属性字段 Expires 和 Cache-Control 进行任何操作。

#配置样例如下:
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;
}

        3.4 gzip开启压缩及相关配置详解

        为提高用户获取响应数据的速度,Nginx 服务器可以将响应数据进行 gzip 压缩,在减小响应数据的大小后再发送给用户端浏览器,相对于使用户浏览 Web 页面,上述方式显示速度更快。
        要想启用响应数据 gzip 压缩(ngx_http_gzip_module 模块)功能,需要用户浏览器也支持 gzip 解压功能,目前大多数浏览器都支持 gzip 压缩数据的显示。Nginx 服务器接收客户端浏览器发送的请求后,通过请求头中的属性字段 Accept-Encoding 判断浏览器是否支持 gzip 压缩,对支持 gzip 压缩的浏览器将发送 gzip 压缩的响应数据。
        ngx_http_gzip_module 模块的内置配置参数如下表所示。

指令作用域默认值指令值可选项指令说明
gziphttp、server、location、if in locationoffon 或 off启用 gzip 功能
gzip_buffershttp、server、location32 4k 或 16 8k--设置 gzip 压缩缓冲区
gzip_comp_levelhttp、server、location1--设置 gzip 压缩级别,取值范围为 1~9,该指令值越大,压缩程度越高
gzip_disablehttp、server、location----当请求头中的属性字段 User-Agent 的内容与指令值正则匹配时关闭 gzip 压缩功能
gzip_http_versionhttp、server、location1.11.0 或 1.1设置压缩请求的最早 HTTP 协议版本
gzip_min_lengthhttp、server、location20--设置启用 gzip 压缩的响应数据的最小长度,判断依据为响应头中 Content-Length 的值。如果 Content-Length 不存在,则该指令无效;如果指令值为 0,则表示全部压缩
gzip_proxiedhttp、server、locationoffoff 或 expired 或 no-cache 或 no-store 或 private 或 no_last_modified 或 no_etag 或 auth 或 any根据被代理服务器返回响应数据的响应头属性字段判断是否启用 gzip 压缩
gzip_typeshttp、server、locationtext/html--设置可进行 gzip 压缩的响应数据的 MIME 类型,指令值为 * 时表示所有 MIME 类型
gzip_varyhttp、server、locationoffon 或 off在响应头中添加 Vary:Accept-Encoding,返回给前端代理或 CDN 服务器,用于判岗是否向客户端发送 gzip 的缓存副本,避免代理或 CDN 服务器将 gzip 压缩后的缓存副本响应给不具备 gzip 解压能力的浏览器

其中 gzip_proxied 指令的指令值可选项说明如下:

  • 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 压缩时,可以使用 ngx_http_gunzip_module 模块将压缩的数据解压后发送给客户端。对支持 gzip 压缩的浏览器不做处理。

        ngx_http_gunzip_module 模块的内置配置指令如下表所示。

指令作用域默认值指令值可选项指令说明
gunziphttp、server、locationoff on 或  off 设置是否启用动态解压支持
gunzip_buffershttp、server、location32 4K--设置用于解压的缓冲区大小

         通常 gzip 压缩指令都是读取未压缩的文本,在进行动态压缩后把响应数据发送给客户端,ngx_http_gzip_static_module 模块可以使 Nginx 把 gzip 压缩过的以 .gz 为后缀的文件或已压缩的响应数据直接发送给客户端。
        ngx_http_gzip_static_module 模块的内置配置指令如下表所示。

名称静态压缩指令
指令gzip_static
作用域http、server、location
默认值off
指令值可选项on 或 off 或 always
指令说明启用压缩数据读取功能

gzip_static 指令的指令值可选项说明如下:

  • on:不检查客户端是否支持 gzip 压缩数据,始终发送 gzip 压缩数据;
  • always:不检查客户端是否支持 gzip 压缩数据,始终发送 gzip 压缩数据;
  • 该指令的执行优先级高于 gzip 指令;
  • 开启该指令后,默认优先查找以 .gz 为后缀的文件;
  • gzip_types 指令对 gzip_static 的设置无效。
#配置样例如下:
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-javascripttext/css application/xml text/javascriptapplication/x-httpd-php image/jpegimage/gif image/png; # 对指定的MIME类型数据启用动态压缩
gzip_vary on;                        # 向前端代理或缓存服务器发送添加"Vary: Accept-# Encoding"的响应数据

相关文章:

  • 【LeetCode 5.】 最长回文子串
  • 主窗体设计
  • 2023年的Top20 AI应用在近一年表现怎么样?
  • Postman如何做接口测试:什么?postman 还可以做压力测试?
  • Windows 服务器Nginx 下载、部署、配置流程(图文教程)
  • 一次基于 rebase 的 PR 提交
  • MEMS:Lecture 18 Feedback
  • 【Linux】基础IO [万字之作]
  • tcp和udp的例子
  • 用Copilot画漫画,Luma AI生成视频:解锁创意新玩法
  • 享元和代理模式
  • 反射,枚举以及lambda表达式
  • Spring 整合 MyBatis 底层源码解析
  • 条件语句与循环结构
  • PyFlink
  • canvas 五子棋游戏
  • CSS 三角实现
  • django开发-定时任务的使用
  • Java 23种设计模式 之单例模式 7种实现方式
  • Javascript设计模式学习之Observer(观察者)模式
  • jquery ajax学习笔记
  • Koa2 之文件上传下载
  • Laravel核心解读--Facades
  • mysql外键的使用
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • vue 配置sass、scss全局变量
  • 笨办法学C 练习34:动态数组
  • 闭包,sync使用细节
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 技术:超级实用的电脑小技巧
  • 来,膜拜下android roadmap,强大的执行力
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 阿里云移动端播放器高级功能介绍
  • ​如何在iOS手机上查看应用日志
  • #Linux(make工具和makefile文件以及makefile语法)
  • $(function(){})与(function($){....})(jQuery)的区别
  • (1)Android开发优化---------UI优化
  • (1)无线电失控保护(二)
  • (2.2w字)前端单元测试之Jest详解篇
  • (5)STL算法之复制
  • (55)MOS管专题--->(10)MOS管的封装
  • (C)一些题4
  • (初研) Sentence-embedding fine-tune notebook
  • (二)PySpark3:SparkSQL编程
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (区间dp) (经典例题) 石子合并
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (三十)Flask之wtforms库【剖析源码上篇】
  • (五)网络优化与超参数选择--九五小庞
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上