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;

注意:

  1. 其中的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压缩

  2. 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 返回响应时的速度上限值