一、Nginx反向代理

 Nginx中的ngx_http_proxy_module模块可以实现后端服务器的反向代理功能,这样就可以实现客户端请求的动静分离以及负载均衡功能。

 

 1、实验场景

Nginx主机作为反向代理服务器将客户端请求发往node1主机web服务器

Nginx主机IP:192.168.0.110

node1主机IP:192.168.0.40

 

 2、Nginx主机配置

grep -Ev "#|^$" server.conf
    server {
        listen       80;
        server_name   localhost;
	
        location / {
	    proxy_pass http://192.168.0.40;
	    proxy_set_header Host    $host;
	    proxy_set_header X-Real-IP  $remote_addr;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
[root@Nginx conf]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@Nginx conf]# nginx -s reload

 

 3、node1主机配置为apache服务器

[root@node1 ~]# service httpd start
Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 192.168.0.15 for ServerName
                                                           [  OK  ]
[root@node1 ~]# curl 192.168.0.40
This is node1

 

 4、测试反向代理

wKiom1iYBrmxCOJ9AAAoVhft050684.png-wh_50



 5、注意事项

如果是/uri反向代理到后端,那么/uri在后端可以为/newuri;

如果/uri是使用模式匹配的,则直接补在代理链接后面

如果proxy之前有定义rewrite的话,那么proxy将使用rewrite后的uri做代理

proxy_pass http://192.168.0.40;

proxy_set_header Host    $host; 自定义客户端请求的首部的值

proxy_set_header X-Real-IP  $remote_addr;  自定义头部信息加入客户端IP

 

 6、自定义头部信息后的日志信息

[root@node1 ~]# vim /etc/httpd/conf/httpd.conf 
LogFormat "%{X-Real-IP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
[root@node1 ~]# service httpd reload
[root@node1 ~]# cat /etc/httpd/logs/access_log
192.168.0.109 - - [06/Feb/2017:13:56:20 +0800] "GET /user/ HTTP/1.0" 304 - "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0"
192.168.0.109 - - [06/Feb/2017:13:56:21 +0800] "GET /user/ HTTP/1.0" 304 - "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0"

 

 7、部分代理(动静分离)

Nginx部分

[root@Nginx conf]# !grep
grep -Ev "#|^$" server.conf
    server {
        listen       80;
        server_name   localhost;
	
        location / {
	    root html/xn1;
	    index index.html;
	}	
        location /user {
	    proxy_pass http://192.168.0.40;
	    proxy_set_header Host    $host;
	    proxy_set_header X-Real-IP  $remote_addr;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
[root@Nginx conf]# nginx -s reload

node1部分

[root@node1 ~]# mkdir /var/www/html/user
[root@node1 ~]# echo "This is node1 user" >> /var/www/html/user/index.html
[root@node1 ~]# service httpd reload

测试:

本地处理请求的部分

wKiom1iYC1Gj2CSCAAAm4C8yyHE357.png-wh_50


反向代理的部分:

wKioL1iYC27R50B4AAAmmsMvzjU914.png-wh_50

更多的proxy指令,详见:http://nginx.org/en/docs/http/ngx_http_proxy_module.html



二、proxy缓存功能

 当Nginx将客户端请求反向代理至后端服务器时,建立的是keep-alive连接;代理服务器与客户端,代理服务器与后端web server都建立长链,这会降低Nginx性能,所以这时候,proxy模块的缓存功能就派上用场了,代理服务器与客户端之间依旧保持长链,而代理服务器与后端web server之间请求结束后,代理服务器将内容缓存在本地,与后端不建立长链,大大节省了系统资源;同时,当客户端请求来时,代理服务器会直接去缓存中寻找并返回给客户端。代理服务器将缓存存在内存中,以key-value形式存储,value存储的是指向本地文件系统中存储的URL的哈希值。

 

 1、配置缓存功能

1.创建缓存目录
[root@Nginx conf]# mkdir -pv /cache/nginx/
mkdir: 已创建目录 "/cache"
mkdir: 已创建目录 "/cache/nginx/"
[root@Nginx conf]# chown -R nginx:nginx /cache/nginx

2.在配置文件的http段定义缓存目录
[root@Nginx conf]# vim nginx.conf
    proxy_cache_path /cache/nginx/ keys_zone=mycache:32m;
    
3.在server或location区段均可调用,根据实际情况使用,此处在location区段调用
[root@Nginx conf]# !grep
grep -Ev "#|^$" server.conf
    server {
        listen       80;
        server_name   localhost;
	
        location / {
	    root html/xn1;
	    index index.html;
	}	
        location /user {
	    proxy_cache mycache;
	    proxy_cache_valid 200 3h;
	    proxy_cache_valid 301 302 10m;
            proxy_cache_valid all 1m;
	    proxy_cache_use_stale error timeout http_500 http_502 http_503;
	    proxy_pass http://192.168.0.40;
	    proxy_set_header Host    $host;
	    proxy_set_header X-Real-IP  $remote_addr;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
[root@Nginx conf]# nginx -s reload

4.请求后,缓存目录中出现缓存
[root@Nginx conf]# ll /cache/nginx/
总用量 4
-rw------- 1 nginx nginx 462 2月   6 17:09 a8d7f3cb1968f4e6056774a5a3a73468

5.cache语句
proxy_cache_path /cache/nginx/ keys_zone=mycache:32m;
定义缓存在文件系统中的保存路径,定义key值在内存中的变量名与大小,其余诸多选项有默认配置,定义在哪个位置,就有哪些配置可使用缓存

proxy_cache mycache;
使用mycache缓存

proxy_cache_valid 200 3h;
以响应状态码定义缓存保存时长,可定义多个

proxy_cache_use_stale error timeout http_500 http_502 http_503;
定义在遇到什么情况下可以使用过期缓存响应客户端


 2、补充说明

 缓存功能可以定义在http,server,location区段,定义在哪个区段表示有哪些请求可以使用缓存;一般来说,我们把缓存路径定义在http段,调用缓存根据具体情况配置。

 其他cache语句:http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache