首页 > 代码库 > 08-nginx的反向代理、缓存功能

08-nginx的反向代理、缓存功能

nginx作为反向代理的工作模型

相对于LVS工作在四层,nginx工作于应用层,所以它能够理解http请求报文中首部的请求方法、URL、http协议等信息。

nginx收到请求报文后,这个报文源IP为客户端CIP,目标IP是nginx服务器所在的供外界访问的VIP。然后把用户的请求封装成新的报文发给后端服务器,发送的报文源IP为nginx所在服务器的DIP,目标IP为后端真实响应请求的RIP(为避免后端服务器暴露于外网中,DIP与RIP可以为私网地址)。

nginx_http_proxy_model模块实现反向代理,适用范围:location, if in location , limit_except  

常见用法

1) proxy_pass后面的路径不带uri时,其会将location的uri传递给后端主机;
        server {
            ...
            server_name HOSTNAME;
            location /uri/ {
                proxy  http://RIP[:port];
            }
            ...
        }

此时传递给后端的请求路径为:http://RIP/uri/,直接补充在REMOTE-IP之后;
http://HOSTNAME/uri --> http://RIP/uri

2)proxy_pass后面的路径是一个uri时,其会将location的uri替换为proxy_pass的uri;
        server {
            ...
            server_name HOSTNAME;
            location /uri/ {
                proxy http://RIP/new_uri/;
            }
            ...
        }

此时客户端请求被location的/uri/匹配到,跳转到后端请求路径将由/new uri/替换/uri/;
http://HOSTNAME/uri/ --> http://RIP/new_uri/

3)如果location定义其uri时使用了正则表达式的模式,则proxy_pass之后必须不能使用uri;
        server {
            ...
            server_name HOSTNAME;
            location ~|~* /uri/ {
                proxy http://RIP;
            }
            ...
        }

此时客户端请求时传递的uri将直接附加代理到的服务的之后;
http://HOSTNAME/uri/ --> http://host/RIP/

实验环境:

  nginx反向代理服务器centos7.2   VIP:9.110.187.120,DIP:10.1.1.120   安装nginx

  后端RealServer1 RIP:10.1.1.121  安装apache  提供测试页面

[root@controller2 html]# cat index.html
Hello,This is controller2
[root@controller2 html]# cat ./book/index.html 
This is controller  /book/index.html

    后端RealServer2 RIP:10.1.1.122  安装LAMP

  客户端为win7主机

实验一:

nginx 反代配置

技术分享

重启服务后验证

技术分享

实验二:

nginx 反代配置

技术分享技术分享

实验三:

技术分享技术分享


解决后端Web 服务器记录真实客户端IP

默认情况后端服务器记录的全是代理服务器的IP

技术分享

此时需要用户proxy_set_header指令

nginx反向代理服务器server 配置段中添加配置  proxy_set_header  CIP  $remote_addr;

后端apache 配置文件中日志配置更改

    LogFormat "%{CIP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

利用proxy_set_header 指令,nginx向后端发送请求报文中添加CIP首部(名称自定义) 值为remote_addr真实客户端IP(这个是固定的)效果如下

技术分享

Nginx 作为反向代理时,可以启用缓存机制。

1)proxy_cache_path
    path [levels=levels]  [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size]
    定义缓存,可用上下文为http; (与fastcgi的缓存定义相似)

2)proxy_cache zone | off;
    指明要调用的缓存,或关闭缓存机制;用于http, server, location 上下文

3)proxy_cache_key string;
    缓存中用于“键”的内容;默认值为:proxy_cache_key $scheme$proxy_host$request_uri;

4)proxy_cache_valid [code ...] time;
    定义对特定响应码的响应内容的缓存时长;

    缓存定义示例:
        (定义在http上下文)
        proxy_cache_path /var/cache/nginx/proxy_cache levels=1:1:1 keys_zone=pxycache:20m max_size=1g;
    调用缓存定义示例:
        定义在需要调用缓存功能的配置段,例如server{...};
        proxy_cache pxycache;
        proxy_cache_key $request_uri;
        proxy_cache_valid 200 302 301 1h;
        proxy_cache_valid any 1m;

5)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 ...;

6)proxy_cache_methods GET | HEAD | POST ...;
    定义为哪种请求方法使用缓存;默认GET|HEAD 其他的不建议使用

7)proxy_buffering on | off;
    是否启用代理服务器对后端服务器的发送缓冲和接收缓冲
    默认proxy_buffering on;

8)proxy_buffers number size;
    定义启用代理服务器对后端服务器的发送缓冲和接收缓冲的buffer的数量和每个buffer的类型
    默认proxy_buffers 8 4k|8k;
    用于http,server,locaton上下文

9)proxy_buffer_size size;
    定义代理服务器对后端服务器的发送缓冲和接收缓冲的每个buffer的大小
    默认proxy_buffer_size 4k|8k;

定义缓存可以在http,server,location中,作用范围不同,下面是我的例子

    proxy_cache_path    /var/proxycache/             levels=1:1:1       keys_zone=jpgcache:10m max_size=1g;
    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        # root         /usr/share/nginx/html;
        proxy_set_header        CIP     $remote_addr;
        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
                proxy_pass      http://10.1.1.121;
                index           index.html;
                proxy_cache     jpgcache;
                proxy_cache_key $request_uri;
                proxy_cache_valid       200 301 302 1h;
                proxy_cache_valid       any     1m;
        }
[root@controller1 nginx]# tree /var/proxycache/
/var/proxycache/
├── 4
│   └── a
│       └── d
│           └── 880e10635371e8065a004e01fd401da4
└── 9
    └── d
        └── 9
            └── 35a63c8a85b1279a0f991ce8828fb9d9

6 directories, 2 files

缓存的文件和访问的文件(是一个图片)大小相同。

nginx_http_headers_module模块实现nginx响应报文中的首部定义

 

默认情况下,nginx不会传递 Date ,Server,X-Pad ,X-Accel等信息,避免后端服务器信息被泄露。示例

add_header      cache-test      $upstream_cache_status;
添加一个首部名称cache-test,值为nginx_upstream模块引入的一个变量,用于记录从后端服务器缓存的资源是否被命中。

技术分享

nginx_http_upstream_module模块:用于把后端服务器定义成服务器组,实现负载均衡功能。

定义后端服务器组,会引入一个新的上下文;用于http上下文
    upstream httpdsrvs {
        server ...
        server...
        ...
    }

server address [parameters];在upstream中定义一个服务器及其相关参数;仅能用于upstream上下文;

upstream websrvs {
            server 10.1.1.121 weight=2 max_fails=2        fail_timeout=6s;
            server 10.1.1.122 weight=1 max_fails=2 down;
            server 10.1.1.123:8080 backup
     }    
          

负载均衡算法

least_conn:最少连接调度算法,当server拥有不同的权重时其为wlc;(当各server权重不同时,即为加权最少连接);最少连接算法通常只适用与那些长连接的协议;

ip_hash:源地址hash调度方法;把来自同一个ip地址的请求始终发往同一个backendserver,除非此backend server不可用;

hash key [consistent]:基于指定的key的hash表来实现对请求的调度,此处的key可以直接文本、变量或二者的组合;
常用的hash key:
     1) $cookie_name:
        将一个用户的请求始终发往同一个backendserver,能实现会话绑定的功能;此处的name为cookie某些参数的名称,此处常用的有cookie_username;
     2) $request_uri:
        将对同一个uri的请求始终发往同一个backend server,后端为cache server时特别有用;

match NAME { … }:对backendserver做健康状态检测时,定义其结果判断机制;只能用于http上下文;
常用的参数:
    status code[code ...]:期望的响应状态码;
    header HEADER[operator value]:期望存在响应首部,也可对期望的响应首部的值基于比较操作符和值进行比较;
    body:期望响应报文的主体部分应该有的内容;

health _ check [PARAMETERS]:健康状态检测机制;只能用于location上下文;
常用参数:
    interval=#:检测的频率,默认为5秒;
    fails=#:判定服务器不可用的失败检测次数;默认为1次;
    passes=#:判定服务器可用的失败检测次数;默认为1次;
    uri=uri:做健康状态检测测试的目标uri;默认为/;
    match=NAME:健康状态检测的结果评估调用此处指定的match配置块;

keepalive connections:为每个worker进程保留的空闲的长连接数量;

示例:

注释掉之前的缓存配置段

  #  proxy_cache_path   /var/proxycache/             levels=1:1:1       keys_zone=jpgcache:10m max_size=1g;
    upstream    testservers {
        server  10.1.1.121;
        server  10.1.1.122;
}


    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        # root         /usr/share/nginx/html;
        proxy_set_header        CIP     $remote_addr;
        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;
        add_header      cache-test      $upstream_cache_status;
        location / {
                #proxy_pass     http://10.1.1.121;
                proxy_pass      http://testservers;
                index           index.html;
        #       proxy_cache     jpgcache;
        #       proxy_cache_key $request_uri;
        #       proxy_cache_valid       200 301 302 1h;
        #       proxy_cache_valid       any     1m;
        }

在后端建立不同的index.html,刷新访问页面,可查看页面变化。

 

08-nginx的反向代理、缓存功能