nginx常用模块详解
ngx_http_stub_status_module模块
用于输出nginx的基本状态信息;
1
2Active connections: 291
3server accepts handled requests
416630948 16630948 31070465
5Reading: 6 Writing: 179 Waiting: 106
6Active connections: 活动状态的连接数;
7accepts:已经接受的客户端请求的总数;
8handled:已经处理完成的客户端请求的总数;
9requests:客户端发来的总的请求数;
10Reading:处于读取客户端请求报文首部的连接的连接数;
11Writing:处于向客户端发送响应报文过程中的连接数;
12Waiting:处于等待客户端发出请求的空闲连接数;
1330、stub_status;
14配置示例:
15 location /basic_status {
16 stub_status;
17 }
18 curl http://www.xxx.com/basic_status
内嵌变量
变量名 | 含义 |
---|---|
$connections_active | 同 Active connections值 |
$connections_reading | 同Reading值 |
$connections_writing | 同 Writing |
$connections_waiting | 同 Waiting |
connection 是连接,tcp三次握手,是有状态的
request 是请求, http无状态
ngx_http_auth_basic_module模块
1#实现基于用户的访问控制,使用basic机制进行用户认证;
2auth_basic string | off;
3auth_basic_user_file file;
4 location /admin/ {
5 alias /webapps/app1/data/;
6 auth_basic "Admin Area";
7 auth_basic_user_file /etc/nginx/.ngxpasswd;
8 }
9#注意:htpasswd命令由httpd-tools所提供;
10
11
1yum -y install httpd-tools
2Usage:
3 htpasswd [-cimBdpsDv] [-C cost] passwordfile username
4 htpasswd -b[cmBdpsDv] [-C cost] passwordfile username password
5
6
7生成新的密码文件 htpasswd -bc passwordfile username password
8如果还要添加新用户 htpasswd -b passwordfile username1 password1
9htpasswd -m -c .ngpasswd maozhongyu
访问控制模块
用来对特定IP的进行访问控制 默认是允许所有ip访问,若部分允许需定义deny all
allow 语法: allow address | CIDR | unix: | all; 默认值: — 区块: http, server, location, limit_except
允许某个ip或者一个ip段访问
deny 语法: deny address | CIDR | unix: | all; 默认值: — 区块: http, server, location, limit_except
allow、deny实例
1location / {
2 deny 192.168.1.1;
3 allow 192.168.1.0/24;
4 allow 47.98.147.49;
5 deny all; # 拒绝除 allow的
6}
比如可以限制某些目录下的某些文件的访问,具体可以自己组合
禁止访问所有目录下的sql|log|txt|jar|sh|py后缀的文件,
1location ~.*\.(sql|log|txt|jar|war|sh|py|php) {
2 deny all;
3}
autoindex 目录列表
下载索引
1location /download/ {
2 root /opt/source;
3 autoindex on;
4 auto0ndex_exact_size off;
5 autoindex_format html;
6 autoindex_localtime off;
7 }
ngx_http_auth_basic_module模块
1实现基于用户的访问控制,使用basic机制进行用户认证;
2auth_basic string | off;
3auth_basic_user_file file;
4 location /admin/ {
5 alias /webapps/app1/data/;
6 auth_basic "Admin Area";
7 auth_basic_user_file /etc/nginx/.ngxpasswd;
8 }
注意:htpasswd命令由httpd-tools所提供;
1yum -y install httpd-tools
2Usage:
3 htpasswd [-cimBdpsDv] [-C cost] passwordfile username
4 htpasswd -b[cmBdpsDv] [-C cost] passwordfile username password
5htpasswd -m -c .ngpasswd maozhongyu
ngx_http_stub_status_module模块
stub_status; 配置示例:
1location /basic_status {
2 stub_status;
3}
curl http://www.xxx.com/basic_status
用于输出nginx的基本状态信息;
1Active connections: 291
2server accepts handled requests
316630948 16630948 31070465
4Reading: 6 Writing: 179 Waiting: 106
5Active connections: 活动状态的连接数;
6accepts:已经接受的客户端请求的总数;
7handled:已经处理完成的客户端请求的总数;
8requests:客户端发来的总的请求数;
9Reading:处于读取客户端请求报文首部的连接的连接数;
10Writing:处于向客户端发送响应报文过程中的连接数;
11Waiting:处于等待客户端发出请求的空闲连接数;
访问日志模块
我们观察nginx的server段,可以看到如下类似信息
#access_log logs/host.access.log main;
这说明 该server, 它的访问日志的文件是 logs/host.access.log ,
使用的格式”main”格式.
除了main格式,你可以自定义其他格式.
main格式是什么?
1log_format main '$remote_addr - $remote_user [$time_local] "$request" '
2'$status $body_bytes_sent "$http_referer" '
3'"$http_user_agent" "$http_x_forwarded_for"';
1语法:access_log path [format [buffer=size]];
2 access_log logs/access.log [log_format_name] ;
3 access_log off;
4
5默认值:
6 access_log logs/access.log combined ;
7上下文:http, server, location, if in location, limit_except
2: 声明一个独特的log_format并命名
1 log_format mylog '$remote_addr-"$request" '
2 '$status $body_bytes_sent "$http_referer" '
3 '"$http_user_agent" "$http_x_forwarded_for"';
在下面的server/location,我们就可以引用 mylog
在server段中,这样来声明
Nginx允许针对不同的server做不同的Log ,(有的web服务器不支持,如lighttp)
access_log logs/access_8080.log mylog;
声明log log位置 log格式;
日志按日期存储shell脚本
实际应用: shell+定时任务+nginx信号管理,完成日志按日期存储
分析思路:
凌晨00:00:01,把昨天的日志重命名,放在相应的目录下
再USR1信息号控制nginx重新生成新的日志文件
具体脚本:
1#!/bin/bash
2
3base_path='/usr/local/nginx/logs'
4
5log_path=$(date -d yesterday +"%Y%m")
6
7day=$(date -d yesterday +"%d")
8
9mkdir -p $base_path/$log_path
10
11mv $base_path/access.log $base_path/$log_path/access_$day.log
12
13#echo $base_path/$log_path/access_$day.log
14
15kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
16# nginx -s reload 和上面等价
nginx 请求数限制
ngx_http_limit_req_module :限制某一时间内,单一IP的请求数.示例:
limit_req_zone key zone=name:size
key 限速客户端 唯一性标志
1http {
2 limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
3 limit_conn_status 503;
4 limit_conn_log_level error;
5 ... #定义一个名为one的limit_req_zone用来存储session,大小是10M内存,
6
7 #以$binary_remote_addr 为key,限制平均每秒的请求为1个,
8 #1M能存储16000个状态,rete的值必须为整数,
9
10 server {
11 ...
12 location /search/ {
13 limit_req zone=one burst=5 ;
14 # limit_req zone=one burst=5 nodelay;
15 #限制每ip每秒不超过1个请求,漏桶数burst为5,也就是队列.
16 #nodelay,如果不设置该选项,严格使用平均速率限制请求数,超过的请求被延时处理.
17 #举个栗子:
18 #设置rate=20r/s每秒请求数为20个,漏桶数burst为5个,
19 #brust的意思就是,如果第1秒、2,3,4秒请求为19个,第5秒的请求为25个是被允许的,可以理解为20+5
20 #但是如果你第1秒就25个请求,第2秒超过20的请求返回503错误.
21 #如果区域存储空间不足,服务器将返回503(服务临时不可用)错误
22 #速率在每秒请求中指定(r/s)。如果需要每秒少于一个请求的速率,则以每分钟的请求(r/m)指定。
23 }
24
25 }
nginx 连接数限制
ngx_http_limit_conn_module 模块 限制客户端并发连接数,使用共享内存,对所有worker子进程生效
1http {
2 limit_conn_zone $binary_remote_addr zone=addr:10m;
3
4 ...
5 server {
6 ...
7 location /download/ {
8 limit_conn addr 1;
9 }
10
11
可能有几个limit_conn 指令,以下配置将限制每个客户端IP与服务器的连接数,同时限制与虚拟服务器的总连接数
1http {
2 limit_conn_zone $binary_remote_addr zone=perip:10m;
3 limit_conn_zone $server_name zone=perserver:10m
4 # 如果binary_remote_addr为空则限制失败
5 ...
6
7 server {
8 ...
9 limit_conn perip 10; #单个客户端ip与服务器的连接数.
10 limit_conn perserver 20000; #限制与服务器的总连接数
11 }
白名单
1http{
2 ...
3 #判断客户端地址是否在白名单列表,如果在返回0在白名单列表,否则返回1
4 geo $white {
5 default 1;
6 #include '/conf/ip.conf';
7 # ip.conf 内容如下
8 # 192.169.168.120 0;
9 # 192.168.169.137 0;
10 127.0.0.1/32 0;
11 192.168.1.0/24 0;
12 }
13
14 #映射 $white => $limit,1=>二进制ip,0=>“”
15 #如果满足条件返回二进制ip地址 ,黑名单的就要使用二进制ip地址
16 map $white $limit {
17 1 $binary_remote_addr;
18 0 "";
19 }
20 #$limit "" 是不生效的
21 limit_req_zone $limit zone=two:10m rate=1r/s;
22 limit_req_status 503;
23 limit_req_log_level info;
24
25 server {
26 location / {
27 limit_req zone=one burst=3 nodelay; #这个是请求限流。
28 }
29 }
30}
rewrite模块(ngx_http_rewrite_module)
rewrite的主要功能是实现URL地址的重定向。Nginx的rewrite功能需要PCRE软件的支持,即通过perl兼容正则表达式语句进行规则匹配的。默认参数编译nginx就会支持rewrite的模块,但是也必须要PCRE的支持。
使用场景:
1、可以调整用户浏览的URL,看起来更规范,合乎开发及产品人员的需求。
2、为了让搜索引擎搜录网站内容及用户体验更好,企业会将动态URL地址伪装成静态地址提供服务。
3、网址换新域名后,让旧的访问跳转到新的域名上。例如,访问京东的360buy.com会跳转到jd.com
4、根据特殊变量、目录、客户端的信息进行URL调整等
if指令
https://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_rewrite_module.html#if
语法:if(condition){…}
区块:server,location
该指令用于检查一个条件是否符合,如果条件符合,则执行大括号内的语句。if指令不支持嵌套,不支持多个条件&&和||处理。
其中,condition中可以包含的判断标识如下
~为区分大小写匹配
~*为不区分大小写匹配
-f和!-f用来判断是否存在文件
-d和!-d用来判断是否存在目录
-e和!-e用来判断是否存在文件或目录
-x和!-x用来判断文件是否可执行
1 server {
2 ...
3 location /if {
4 if ( $http_user_agent ~* (mobile|nokia|iphone|ipad|android|samsung|htc|blackberry|Mozilla) ) {
5 rewrite ^(.*) http://crm.mms.com/test permanent;
6 }
7 }
8
9 #匹配文件不存在
10 if (!-e $request_filename) {
11 proxy_pass http://127.0.0.1:9501;
12 }
13
14 }
return指令
语法:
return code [text]
return code URL; 如 return 302 /bbs; 让他重定向到 然后再去匹配 location /bbs 去。
return URL; 如return http://xxxx/bbs
区块:server,location,if
该指令用于结束规则的执行并返回状态吗给客户端。
状态码包括:204(No Content)、400(Bad Request)、402(Payment Required)、403(Forbidden)、404(Not Found)、405(Method Not Allowed)、406(Not Acceptable)、408(Request Timeout)、410(Gone)、411(Length Required)、413(Request Entity Too Large)、416(Requested Range Not Satisfiable)、500(Internal Server Error)、501(Not Implemented)、502(Bad Gateway)、503(Service Unavailable)和504(Gateway Timeout)。
示例,如果访问的URL以.sh .bash 结尾,返回状态码403
1location ~ .*\.(sh|bash)?$ {
2 return 403;
3}
列子
1if ($remote_addr = 192.168.1.100) {
2 return 403;
3}
4
5if ($http_user_agent ~ MSIE) {
6 rewrite ^.*$ /ie.htm;
7 break; #(不break会循环重定向)
8 }
9if (!-e $document_root$fastcgi_script_name) {
10 rewrite ^.*$ /404.html break;
11}
12注, 此处还要加break,
13以 xx.com/dsafsd.html这个不存在页面为例,
14我们观察访问日志, 日志中显示的访问路径,依然是GET /dsafsd.html HTTP/1.1
15提示: 服务器内部的rewrite和302跳转不一样.
16跳转的话URL都变了,变成重新http请求404.html, 而内部rewrite, 上下文没变,
17就是说 fastcgi_script_name 仍然是 dsafsd.html,因此 会循环重定向.
set 指令
set 是设置变量用的, 可以用来达到多条件判断时作标志用. 达到apache下的 rewrite_condition的效果
如下: 判断IE并重写,且不用break; 我们用set变量来达到目的
1if ($http_user_agent ~* msie) {
2 set $isie 1;
3}
4
5if ($fastcgi_script_name = ie.html) {
6 set $isie 0;
7}
8
9if ($isie = 1) {
10 rewrite ^.*$ ie.html;
11}
rewrite 语法
语法:rewrite regex replacement [flag]; 默认值:— 上下文:server, location, if
rewrite是实现URL重写的关键指令,根据regex(正则表达式)部分内容,重定向到replacement,结尾是flag标记。 正则:perl兼容正则表达式语句进行规则匹配 替代内容:将正则匹配的内容替换成replacement flag标记:rewrite支持的flag标记
flag标记说明:
- last : 本条规则匹配完成后,继续向下匹配新的location URI规则 ,结束当前的请求处理,用替换后的URI重新匹配location; 可理解为重写(rewrite)后,发起了一个新请求,进入server模块,匹配locaton; 如果重新匹配循环的次数超过10次,nginx会返回500错误;
- break :本条规则匹配完成即终止,不再匹配后面的任何规则结束当前的请求处理,使用当前资源,不在执行location里余下的语句
- redirect :返回302临时重定向,浏览器地址会显示跳转后的URL地址
- permanent :返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
Nginx重写 url实现伪静态
1#商品页面
2goods-3.html ---->goods.php?id=3
3 # 栏目页面
4/ecshop/category-2-b1.html -> /ecshop/category.php?id=3&brand=1
5
6
7Goods-3.html ---->Goods.php?goods_id=3
8goods-([\d]+)\.html ---> goods.php?goods_id =$1
9
10
11location /ecshop {
12index index.php;
13rewrite goods-([\d]+)\.html$ /ecshop/goods.php?id=$1;
14rewrite article-([\d]+)\.html$ /ecshop/article.php?id=$1;
15rewrite category-(\d+)-b(\d+)\.html /ecshop/category.php?id=$1&brand=$2;
16
17rewrite category-(\d+)-b(\d+)-min(\d+)-max(\d+)-attr([\d\.]+)\.html /ecshop/category.php?id=$1&brand=$2&price_min=$3&price_max=$4&filter_attr=$5;
18
19rewrite category-(\d+)-b(\d+)-min(\d+)-max(\d+)-attr([\d+\.])-(\d+)-([^-]+)-([^-]+)\.html /ecshop/category.php?id=$1&brand=$2&price_min=$3&price_max=$4&filter_attr=$5&page=$6&sort=$7&order=$8;
20}
21
22注意:用url重写时, 正则里如果有”{}”,正则要用双引号包起来
防盗链
http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_referer_module.html#valid_referers
语法: valid_referers none | blocked | server_names | string …
上下文: server
, location
“Referer”请求头为指定值时,内嵌变量$invalid_referer
被设置为空字符串, 否则这个变量会被置成“1
”。查找匹配时不区分大小写。
该指令的参数可以为下面的内容:
-
none
缺少“Referer”请求头;
-
blocked
“Referer” 请求头存在,但是它的值被防火墙或者代理服务器删除; 这些值都不以“
http://
” 或者 “https://
”字符串作为开头; -
server_names
“Referer” 请求头包含某个虚拟主机名;
-
任意字符串
定义一个服务器名和可选的URI前缀。服务器名允许在开头或结尾使用“
*
”符号。 当nginx检查时,“Referer”请求头里的服务器端口将被忽略。 -
正则表达式
必须以“
~
”符号作为开头。 需要注意的是表达式会从“http://
”或者“https://
”之后的文本开始匹配。
防止别人直接从你网站引用图片等链接,消耗了你的资源和网络流量,那么我们的 就可以设置防盗链策略下面的方法是直接给予404的错误提示,或者是显示一个图片
1location ~* ^.+\.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {
2 valid_referers none blocked www.23673.com 23673.com;
3 if ($invalid_referer) {
4 #return 302 http://nginx.23673.com/img/nolink.jpg;
5 return 404;
6 break;
7 }
8 }
Nginx web缓存设置
nginx提供了expires、etag、if-modified-since指令来进行浏览器缓存控制。
expires
假设我们使用nginx作为静态资源服务器,此时可以使用expires进行缓存控制。
1location /img {
2 alias /export/img/;
3 expires 10s;
4}
5expires 30s;#30秒
6expires 30m;#30分钟
7expires 2h;#2个小时
8expires 30d;#30天
ngx_http_proxy_module(nginx代理缓存模块)
Proxy模块,用于把请求后抛给服务器节点或upstream服务器池
常用配置,具体看手册
1tcpdump -i enp0s3 port 8888 -A
如何更改发往上游的请求
代理场景下nginx,如何更改发往上游的请求
1 #请求头传递
2 proxy_redirect off ;
3 proxy_set_header Host $host;
4 proxy_set_header X-Real-IP $remote_addr;
5 proxy_set_header REMOTE-HOST $remote_addr;
6 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
7 client_max_body_size 50m;
8 client_body_buffer_size 256k;
9 proxy_connect_timeout 30;
10 proxy_send_timeout 30; // 30s 没往上游发,自动关闭链接
11 proxy_read_timeout 60;
12 proxy_buffer_size 256k;
13 proxy_buffers 4 256k;
14 proxy_busy_buffers_size 256k;
15 proxy_temp_file_write_size 256k;
16 proxy_max_temp_file_size 128m;
17 proxy_pass http://nginx.23673.com;
18
19 #proxy_set_body 修改请求体信息
20 # proxy_ignore_client_bort on |off ,默认off, 就算客户端关闭了 发往上游服务器还是继续的。
21
22
23 http {
24 #设置缓存目录
25 #levels=1:2 设置2级目录 第一级1个字母 第二级2个字母 , inactive 缓存清楚时间策略
26 proxy_cache_path /usr/local/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=10s use_temp_path=off;
27 location /nginx {
28 proxy_http_version 1.1;
29 proxy_pass http://127.0.0.1:9502;//一个swoole 写的简单http服务 ,可以写成upstream_name
30 #请求头设置
31 proxy_set_header X-Real-IP $remote_addr;
32 proxy_set_header connection keep-alive;
33 proxy_set_header REMOTE-HOST $remote_addr;
34 # add_header Nginx-Cache-Status "$upstrem_cache_status" # 如果proxy_pass到upstream,看是否缓存成功了
35 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
36 #时间设置
37 proxy_connect_timeout 30;
38 proxy_send_timeout 30;
39 proxy_read_timeout 60;
40 proxy_cache my_cache; #开启缓存了
41 proxy_cache_valid 200 302 2s; #不同的响应头设置不同缓存时间
42 proxy_cache_valid 404 1s;
43 #默认get
44 #proxy_cache_methods GET HEAD POST;
45 #不想源服务器(目标服务器)控制是否缓存 ,一般不开启 ,如果目标服务器设置header("cache-control:private") 就让目标服务器控制
46 #proxy_ignore_headers Cache-Control;
47 #最少使用10次,累计的,缓存文件计数器 同样的请求达到10次,那么就开始缓存生效
48 proxy_cache_min_uses 10;
49 }
50 }
上游服务器
1server{
2 add_header X-Accel-Expires 5; 告诉只能缓存5秒
3}
缓存细节
**NGINX仅仅默认缓存GET和HEAD客户端请求,在响应头部中Cache-Control被配置为Private,No-Cache,No-Store或者Set-Cookie,NGINX不会进行缓存。 **
如 目标服务器可以响应header(“Cache-control:private”) 设置不缓存
如果你不想源服务器(目标服务器)控制是否缓存,也可以在nginx当中配置忽略利用
proxy_ignore_headers Cache-Control 指令实现
如果反向代理服务器设置proxy_ignore_headers Cache-Control 那么即使目标服务器响应header(“Cache-control:private”) 也会被缓存
下面的指令允许多种请求类型缓存
proxy_cache_methods GET HEAD POST;
缓存设置优化
proxy_cache_min_uses设置响应被缓存的最小请求次数。
当缓存不断被填满时,这项设置便十分有用,因为这确保了只有那些被经常访问的内容才会被添加到缓存中。该项默认值为1。
经测试,最少使用次数是累计的,缓存文件计数器 同样的请求达到设置的次数,那么就开始缓存生效
proxy_cache_lock 开启此功能时,对于相同的请求,同时只允许一个请求发往后端。
只有这些请求中的第一个被允许发送至服务器。其他请求在第一个请求得到满意结果之后在缓存中得到文件。如果不启用proxy_cache_lock,则所有在缓存中找不到文件的请求都会直接与源服务器通信。
不缓存的条件
有时候,我们也不想所有的请求都被缓存,我们可以指定某些请求不被缓存,比如带有后台后缀的,可以通过一些条件判断决定是否缓存。
语法: proxy_cache_bypass string …;
默认值: —
上下文: http, server, location
定义nginx不从缓存取响应的条件。如果至少一个字符串条件非空而且非“0”,nginx就不会从缓存中去取响应,而是请求源服务器
比如后台模块是不允许缓存的,就可以设置不缓存
1map $request_url $no_cache {
2 default 0;
3 ~*/admin 1; #url 当中包含admin
4}
5#设置当前请求是否缓存 ,$no_cache 有值就不会被缓存
6proxy_cache_bypass $no_cache
还有个命令
proxy_no_cache $no_cache; #$no_cache有值 就不缓存。
清除缓存
某些时候我们如果不想等待缓存的过期,想要主动清除缓存,可以采用第三方的缓存清除模块清除缓存nginx_ngx_cache_purge
第三方地址 https://www.nginx.com/resources/wiki/modules/
Purge 模块下载地址 http://labs.frickle.com/nginx_ngx_cache_purge/
可以利用平滑升级的方式安装
1proxy_cache_purge
2syntax: proxy_cache_purge zone_name key
3default: none
4context: location
5
6注意:要在proxy_cache 指令下方
7
8proxy_cache_purge tmp-test $uri;
9tmp-test:指定的key_zone
10$uri:指定的生成key的参数
11
12 比如:匹配url当中包含了purge关键字的就清除
13缓存 xxx.com/nginx/shop/?a=1
14清除 xxxx.com/purge/shop/?a=1
实际测试配置
1 #缓存。 http://www.test.com/nginx/shop?a=1。
2 #清楚。 http://www.test.com/purge/nginx/shop?a=1
3 location ~ /purge(/.*) {
4 proxy_cache_purge my_cache $host$1$is_args$args;
5 #allow 127.0.0.1;
6 #deny all;
7 #default_type text/html;
8 #return 200 $host$1$is_args$args;
9 }
10 location /nginx {
11 proxy_http_version 1.1;
12 proxy_pass http://127.0.0.1:9502;
13 #测试 proxy_cache_key
14# default_type text/html;
15# return 200 $host$uri$is_args$args;
16 #请求头设置
17 proxy_set_header X-Real-IP $remote_addr;
18 proxy_set_header connection keep-alive;
19 proxy_set_header REMOTE-HOST $remote_addr;
20 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
21
22 #时间设置
23 proxy_connect_timeout 30;
24 proxy_send_timeout 30;
25 proxy_read_timeout 60;
26 proxy_cache my_cache; #开启缓存了
27 proxy_cache_valid 200 302 20s; #不同的响应头设置不同缓存时间
28 proxy_cache_valid 404 1s;
29 #默认get
30 #proxy_cache_methods GET HEAD POST;
31 #不想源服务器(目标服务器)控制是否缓存
32 #proxy_ignore_headers Cache-Control;
33 #最少使用10次
34 #proxy_cache_min_uses 10;
35 # 必须放在后面才生效
36 proxy_cache_key $host$uri$is_args$args;
37
38 }
39
40
41#成功返回结果 失败会返回404 ,可以设置错误页面
42Successful purge
43Key : www.test.com/nginx/shop?a=1
44Path: /usr/local/nginx/cache/b/26/1ff01872dd7718cc49bc32441436b26b
45nginx/1.10.0
gzip 配置详解
Nginx自带的有gzip模块,
http://nginx.org/en/docs/http/ngx_http_gzip_module.html
这个模块支持在线实时压缩输出数据流。经过良好的配置优化,可以大幅的提升网站的输出效率。
使用范例
1gzip on;
2gzip_min_length 1000;
3gzip_proxied expired no-cache no-store private auth;
4gzip_types text/plain application/xml;
内置变量 $gzip_ratio 可以获取到gzip的压缩比率
gzip
语法: gzip on|off
默认值: gzip off
作用域: http, server, location, if (x) location
开启或者关闭gzip模块
gzip_buffers 语法: gzip_buffers number size
默认值: gzip_buffers 4 4k/8k
作用域: http, server, location
设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。 例如 4 4k 代表以4k为单位,按照原始数据大小以4k为单位的4倍申请内存。 4 8k 代表以8k为单位,按照原始数据大小以8k为单位的4倍申请内存。
如果没有设置,默认值是申请跟原始数据相同大小的内存空间去存储gzip压缩结果。
gzip_comp_level
语法: gzip_comp_level 1..9
默认值: gzip_comp_level 1
作用域: http, server, location
gzip压缩比,1 压缩比最小处理速度最快,9 压缩比最大但处理最慢(传输快但比较消耗cpu)。
gzip_min_length
语法: gzip_min_length length
默认值: gzip_min_length 0
作用域: http, server, location
设置允许压缩的页面最小字节数,页面字节数从header头中的Content-Length中进行获取。
默认值是0,不管页面多大都压缩。
建议设置成大于1k的字节数,小于1k可能会越压越大。 即: gzip_min_length 1024
gzip_http_version
语法: gzip_http_version 1.0|1.1
默认值: gzip_http_version 1.1
作用域: http, server, location
识别http的协议版本。由于早期的一些浏览器或者http客户端,可能不支持gzip自解压,用户就会看到乱码,所以做一些判断还是有必要的。 注:21世纪都来了,现在除了类似于百度的蜘蛛之类的东西不支持自解压,99.99%的浏览器基本上都支持gzip解压了,所以可以不用设这个值,保持系统默认即可。
gzip_proxied
语法: gzip_proxied [off|expired|no-cache|no-store|private|no_last_modified|no_etag|auth|any] …
默认值: gzip_proxied off
作用域: http, server, location
Nginx作为反向代理的时候启用,开启或者关闭后端服务器返回的结果,匹配的前提是后端服务器必须要返回包含”Via”(目标,经由)的 header头。
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_modified – 启用压缩,如果header头中不包含 “Last-Modified” 头信息
no_etag – 启用压缩 ,如果header头中不包含 “ETag” 头信息
auth – 启用压缩 , 如果header头中包含 “Authorization” 头信息
any – 无条件启用压缩
gzip_types
语法: gzip_types mime-type [mime-type …]
默认值: gzip_types text/html
作用域: http, server, location
匹配MIME类型进行压缩,(无论是否指定)”text/html”类型总是会被压缩的。
注意:如果作为http server来使用,主配置文件中要包含文件类型配置文件
如果你希望压缩常规的文件类型,可以写成这个样子
1http{
2 include conf/mime.types;
3 gzip on;
4 gzip_min_length 1000;
5 gzip_buffers 4 8k;
6 gzip_http_version 1.1;
7 gzip_types text/plain application/x-javascript text/css text/html application/xml;
8 ...
9 }
默认情况下,Nginx的gzip压缩是关闭的
同时,Nginx默认只对text/html进行压缩所以,开启gzip的指令如下:
1gzip on;
2gzip_http_version 1.1;
3gzip_disable "MSIE [1-6].";
4gzip_types text/plain application/x-javascript text/css text/javascript;
关于gzip_types,如果你想让图片也开启gzip压缩,那么用以下这段吧:(不建议,对二进制压缩不明显,浪费cpu)
1gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-php;image/jpeg image/gif image/png;
注意:
-
其中的gzip_http_version的设置,它的默认值是1.1,就是说对HTTP/1.1协议的请求才会进行gzip压缩 如果我们使用了proxy_pass进行反向代理,那么nginx和后端的upstream server之间是用HTTP/1.0协议通信的 This module makes it possible to transfer requests to another server. It is an HTTP/1.0 proxy without the ability for keep-alive requests yet. (As a result, backend connections are created and destroyed on every request.) Nginx talks HTTP/1.1 to the browser and HTTP/1.0 to the backend server. As such it handles keep-alive to the browser. 如果我们使用nginx通过反向代理做Cache Server,而且前端的nginx没有开启gzip 同时,我们后端的nginx上没有设置gzip_http_version为1.0,那么Cache的url将不会进行gzip压缩
-
gzip_disable的设置是禁用IE6的gzip压缩,又是因为杯具的IE6 IE6的某些版本对gzip的压缩支持很不好,会造成页面的假死,今天产品的同学就测试出了这个问题 后来调试后,发现是对img进行gzip后造成IE6的假死,把对img的gzip压缩去掉后就正常了 为了确保其它的IE6版本不出问题,所以就加上了gzip_disable的设置
测试是否压缩
curl -I -H “Accept-Encoding: gzip, deflate” “url地址”
nginx 变量
变量分类
- tcp 连接相关的变量
- http 请求变量
- nginx 处理http 请求产生的变量
- nginx 返回响应的变量
- nginx 内部变量
tcp 连接相关的变量
- | - |
---|---|
remote_addr | 客户端地址 |
remote_port | 客户端ip |
server_addr | 服务器地址 |
server_port | 服务器端口 |
server_protocol | 服务端协议 |
binary_remote_addr | 二进制客户端地址 |
connection | tcp连接序号,递增 |
connection_request | tcp连接当前的请求数 |
调试
1location / {
2 return 200 "remote_addr $remote_addr
3 remote_port $remote_port
4 ";
5}
http 请求变量
- | - |
---|---|
uri | 请求url,不包含参数 |
request_uri | 请求url,包含参数 |
scheme | 协议名 ,http或https |
request_method | 请求方法 |
request_length | 全部请求的长度,包括请求行、请求头、请求体 |
args | 全部参数字符串 |
arg_参数名 | 特定参数值 |
is_args | url有参数返回 ? 否则返回空 |
query_string | = args |
remote_user | 由http basic authentication 协议传入的用户名 |
host | 先看请求行, 再看请求头,再看server_name |
http_user_agent | 用户浏览器 客户端 |
http_referer | 从哪里链接过来的请求 |
http_via | 经过一层代理服务器,添加代理服务器信息 |
http_x_forwarded_for | 获取用户真实ip |
http_cookie | 用户cookie |
nginx 处理http 请求产生的变量
- | - |
---|---|
request_time | 粗粒清气去已耗费的世界 |
request_completion | 请求处理完成返回ok,否则返回空 |
server_name | 匹配上请求的server_name值 |
https | 开启https, 返回on ,否则返回空 |
request_filename | 磁盘文件系统待访问的完整路径 |
document_root | 有URI和root/alias规则生成的文件夹路径 |
realpath_root | 将document_root中的软链接 换成真实路径 |
limit_rate | 返回响应时的速度上限值 |