Nginx反向代理功能:

ngx_http_proxy_module模块
重点语句:proxy_pass

具体使用:
实现Nginx--->httpd
RS1--192.168.23.36[静态页面主机]
RS2--192.168.23.37[动态页面主机]

Nginx主机配置:
location / {
    proxy_pass http://192.168.23.36;
}
location ~* .*\.php$ { 
    proxy_pass http://192.168.23.37;
}

注意事项:
1 proxy_pass后面路径不带uri时,会将location的uri传递(附加)给后端主机 
2 用了正则表达式后:
proxy_pass  http://172.20.23.36:[port] [/]<--这里不能使用斜线;
3 案例讲解:
location /test2 {
    proxy_pass  http://192.168.23.36;
}
这时候访问www.c.com/test2/color.html实际上访问的是
http://192.168.23.36/test2/color.html

location /test2 {
    proxy_pass http://192.168.23.36/;
}
这时候访问http://www.c.com/test2/color.html实际
访问的路径是http://192.168.23.36/color.html

ngx_http_fastcgi_module模块

代码解析:location|if
fastcgi_pass   172.20.23.9:9000; --后端php服务器地址
location|if 
fastcgi_index  index.php; --默认的主页资源
fastcgi_param parameter value 
设置传递给 FastCGI服务器的参数值,可以是文本,变量或组合 
fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;-->后端php-fpm主机中网页文件位置

具体配置:
location ~* .*\.php$ {           
    fastcgi_pass   192.168.23.37:9000;               
    fastcgi_index  index.php;                
    include        /etc/nginx/fastcgi.conf;
    fastcgi_param  SCRIPT_FILENAME
    include        fastcgi_params;
    /var/www/html$fastcgi_script_name;
}

支持status和ping功能:
location ~* ^/(status|ping)$ {  
    include        fastcgi_params;      
    fastcgi_pass   192.168.23.37:9000;  
    fastcgi_param  SCRIPT_FILENAME /var/www/html$fastcgi_script_name; 
} 

php-fpm支持使用socket文件本机通信:
listen=/var/run/php-fcgi.sock
nginx配置支持使用:
fastcgi_pass /var/run/php-fcgi.sock;

Nginx缓存功能:使用http协议的缓存使用

基本语句:
定义缓存:用于http语句块
proxy_cache_path path 
[levels=levels] --目录结构级别[1:1:1]--三级目录
[use_temp_path=on|off] 
keys_zone=name:size  --名称:大小
[inactive=time]  --非活动时长
[max_size=size]  --最大缓存大小

proxy_cache [name] | off;  
默认off  指明调用的缓存,或关闭缓存机制
server|http|location

proxy_cache_key string;       
缓存中用于"键"的内容        
默认值:
proxy_cache_key $scheme $proxy_host $request_ur

针对不同响应码设置缓存时长:
proxy_cache_valid [code ...] time;  
定义对特定响应码的响应内容的缓存时长   
定义在http{...}中  
示例:  
proxy_cache_valid 200 302 10m;  
proxy_cache_valid 404 1m; 
any--所有

proxy_cache_use_stale;  
proxy_cache_use_stale error | timeout | invalid_header | updating 
| http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ...   

在被代理的后端服务器出现哪种情况下,可直接使用过期的缓存响应客户端

proxy_cache_methods GET | HEAD | POST ...;  
对哪些客户端请求方法对应的响应进行缓存
GET和HEAD方法总是被缓存

具体用法:
首先我要做一个不用缓存的压力测试:
ab -c 500 -n 3000  http://www.c.com/
测试的值:
Requests per second:    1733.13 [#/sec] (mean)
每秒钟处理的请求数!

下面我们开始启用缓存功能:
首先需要在http语句块中设置:
proxy_cache_path /var/nginx/ levels=1:1:1 keys_zone=test:30m  max_size=300m inactive=120s;

接下来我们引用缓存:
location / {
    proxy_pass http://192.168.23.36;
    proxy_cache test;
    proxy_cache_key $request_uri; 
    proxy_cache_valid 200 302 10m;
    proxy_cache_valid 404 30s;
    proxy_cache_use_stale http_500 http_503 http_502;
    proxy_cache_methods GET HEAD;  
}

再次做压力测试:
ab -c 500 -n 3000  http://www.c.com/
测试结果
Requests per second:    16782.84 [#/sec] (mean)
缓存效果明显!

下面我们来测试一下动态页面的缓存效果:
我们是用的fastcgi协议进行的反向代理,所以这里缓存
的使用方式我们需要换一下!

缓存生成目录:
[root@www20:48:59nginx]#tree
.
└── 9
    └── d
        └── 7
            └── 6666cd76f96956469e7be39d750cc7d9

Nginx缓存功能:使用fastcgi反代的缓存

基本语句:
fastcgi_cache_path path 
[levels=levels] --目录结构级别[1:1:1]--三级目录
[use_temp_path=on|off] 
keys_zone=name:size  --名称:大小
[inactive=time]  --非活动时长
[max_size=size]  --最大缓存大小

解析:
path   缓存位置为磁盘上的文件系统 
max_size=size   
磁盘path路径中用于缓存数据的缓存空间上限 
levels=levels:缓存目录的层级数量,以及每一级的目录数量     
levels=ONE:TWO:THREE     
示例:leves=1:2:2 
keys_zone=name:size   
k/v映射的内存空间的名称及大小 
inactive=time   
非活动时长

fastcgi_cache [name] | off;  
调用指定的缓存空间来缓存数据  
可用位置:http, server, location 

fastcgi_cache_key string;  
定义用作缓存项的key的字符串   
示例:fastcgi_cache_key $request_uri;

fastcgi_cache_methods GET | HEAD | POST ...;  
为哪些请求方法使用缓存

fastcgi_cache_min_uses number;  
缓存空间中的缓存项在inactive定义的非活动时间内至少要被访问到此处所指定的次数方可被认作活动项 

fastcgi_keep_conn on | off;     
收到后端服务器响应后,fastcgi服务器是否关闭连接,建议启用长连接

fastcgi_cache_valid [code ...] time;  
不同的响应码各自的缓存时长

具体使用:
首先我们依然进行压力测试:
ab -c 200 -n 1000 http://www.c.com/index.php
测试结果:
Requests per second:    545.95 [#/sec] (mean)
明显要低于静态页面!

下面我们开始使用缓存:
http语句块中设置:
fastcgi_cache_path /var/cache/nginx levels=1:1:1 keys_zone=test1:20m inactive=120s max_size=200m;

引用缓存:
location ~* .*\.php$ {           
    fastcgi_pass   192.168.23.37:9000;               
    fastcgi_index  index.php;                
    include        fastcgi.conf;
    fastcgi_param  SCRIPT_FILENAME  /var/www/html$fastcgi_script_name;
    fastcgi_cache test1;
    fastcgi_cache_key $request_uri; 
    fastcgi_cache_methods GET HEAD;
    fastcgi_cache_min_uses 2;
    fastcgi_keep_conn off;
    fastcgi_cache_valid 200 302 301 1h;
    fastcgi_cache_valid any 20s;
}

现在我们来做压力测试:
ab -c 200 -n 1000 http://www.c.com/index.php
测试结果:
Requests per second: 13053.64 [#/sec] (mean)

缓存目录:
[root@www20:57:16nginx]#tree
.
└── 1
    └── f
        └── a
            └── e251273eb74a8ee3f661a7af00915af1

Nginx隐藏后端服务器的首部字段:

proxy_hide_header [header_name];
官网说明:
Syntax: proxy_hide_header field;
Default:    —
Context:http, server, location

首先我们来看一下http报文的常用首部:
响应首部:
Age:响应持续时间
Server:向客户端标明服务器程序名称和版本
Date: 时间
Content-Type: 文件类型|字符集
Content-Length: 响应数据长度
Connection: 是否保持连接
Accept-Ranges: 单位
ETag: "c-579f82358dd88
Last-Modified:最后一次修改时间

具体使用:
隐藏前:
[root@apache120:48:24html]#curl -I www.c.com
HTTP/1.1 200 OK
Server: nginx
Date: Sat, 10 Nov 2018 13:02:44 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 12
Connection: keep-alive
Last-Modified: Tue, 06 Nov 2018 05:18:55 GMT
ETag: "c-579f82358dd88"
X-Cache: MISS
Accept-Ranges: bytes

设置隐藏:
proxy_hide_header ETag; 

隐藏后:
[root@apache221:17:33html]#curl -I www.c.com
HTTP/1.1 200 OK
Server: nginx
Date: Sat, 10 Nov 2018 13:18:58 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 12
Connection: keep-alive
Last-Modified: Tue, 06 Nov 2018 05:18:55 GMT
X-Cache: MISS
Accept-Ranges: bytes

ETag --->已经不能被看见了!

其它反向代理参数:

proxy_connect_timeout time;  
定义与后端服务器建立连接的超时时长,
如超时会出现502错误,默认为 60s,一般不建议超出75s
官网说明:
Syntax: proxy_connect_timeout time;
Default:    
proxy_connect_timeout 60s;
Context:http, server, location

proxy_send_timeout time;  
将请求发送给后端服务器的超时时长;默认为60s 
官网说明:
Syntax: proxy_send_timeout time;
Default:    
proxy_send_timeout 60s;
Context:http, server, location

proxy_read_timeout time;  
等待后端服务器发送响应报文的超时时长,默认为60s
官网说明:
Syntax: proxy_read_timeout time;
Default:    
proxy_read_timeout 60s;
Context:http, server, location

Nginx-添加响应首部报文:

ngx_http_headers_module模块 
向由代理服务器响应给客户端的响应报文添加自定义首部,
或修改指定首部的值 

1 add_header name value [always];  添加自定义首部   
官网说明:
Syntax: add_header name value [always];
Default:    —
Context:http, server, location, if in location
具体用法:
add_header X-Via  $server_addr;  
add_header X-Cache $upstream_cache_status[nginx是否使用了缓存];  
add_header X-Accel $server_name;  

2 add_trailer name value [always];  添加自定义响应信息的尾部
官网说明:
Syntax: add_trailer name value [always];
Default:    —
Context:http, server, location, if in location
This directive appeared in version 1.13.2.

rpm包安装的nginx版本:
[root@www21:19:16conf.d]#nginx -v
nginx version: nginx/1.12.2

变量解析:
$upstream_cache_status[nginx是否使用了缓存]
http|server|location

这个用法还是值得一用的:
add_header [X-Cache] $upstream_cache_status[nginx是否使用了缓存];  

说明:
[]-->括号中内容可自定义!

具体使用:
location / {
    proxy_pass http://192.168.23.36;
    proxy_cache test;
    proxy_cache_key $request_uri; 
    proxy_cache_valid 200 302 10m;
    proxy_cache_valid 404 30s;
    proxy_cache_use_stale http_500 http_503 http_502;
    proxy_cache_methods GET HEAD; 
    add_header X-Cache $upstream_cache_status;
    proxy_hide_header ETag; 
}

测试第一次:
[root@apache121:13:48html]#curl -I www.c.com
HTTP/1.1 200 OK
Server: nginx
Date: Sat, 10 Nov 2018 13:28:51 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 12
Connection: keep-alive
Last-Modified: Tue, 06 Nov 2018 05:18:55 GMT
X-Cache: MISS -->未命中
Accept-Ranges: bytes

测试第二次:
[root@apache121:28:51html]#curl -I www.c.com
HTTP/1.1 200 OK
Server: nginx
Date: Sat, 10 Nov 2018 13:29:10 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 12
Connection: keep-alive
Last-Modified: Tue, 06 Nov 2018 05:18:55 GMT
X-Cache: HIT -->命中
Accept-Ranges: bytes

可以用来测试缓存是否生效!