一, 实现nginx反代理功能

所谓反代理功能就是将用户的请求转发至后端的某一台web服务器,而nginx不仅可以转发用户请求,并且还可以根据用户请求的URL来决定转发至那一台后端服务器。

相关模块ngx_http_proxy_module

1,设置反代理功能

指令

    语法:proxy_pass URL;
    可用在:location, if in location, limit_except 

注意事项

    示例:
        server {   
                listen 80;
                root /nginx/html;
                server_name www.b.com;   
                location /bbs {    
                        proxy_pass http://www.a.com; "最后没有/"
                }   
                ...  
        } 
    "什么是URL,就是域名后面的第一个/开始往后的才算URL,例如:http://www.a.com/bbs 这网址的URL就是/bbs"
    上面示例:如果proxy_pass没有跟URL 那么访问此网页http://www.b.com/bbs 将访问的是后端服务器的此网页--> http://www.a.com/bbs  
    如果上面示例中有"/",即:http://www.a.com/   意味着置换:当访问此网页http://www.b.com/bbs 将置换为,也就是访问后端服务器的主网页--> http://www.a.com/   
    
    
proxy_pass后面的路径是一个uri时,其会将location的uri替 换为proxy_pass的uri 
    server {  
            ...  
            server_name HOSTNAME;  
            location /uri/ {   
                proxy_pass http://host/new_uri/;  
                
            }  
            ... 
        
    } 
        即:http://HOSTNAME/uri/ --> http://host/new_uri/
    
如果location定义其uri时使用了正则表达式的模式,则 proxy_pass之后必须不能使用uri; 用户请求时传递的uri将直 接附加至后端服务器之后     
    server {  
            ...  
            server_name HOSTNAME;  
            location ~|~* /uri/ {   
                proxy_pass http://host; "不能加/" 
                
            }  
            ... 
        
    } 
        即:http://HOSTNAME/uri/ --> http://host/uri/ 

示例:实现nginx反向调度服务器,动,静分离调度

server {
        listen 80;
        root /nginx/html/;
        index index.html
        server_name www.a.com;
        location /bbs {
                proxy_pass http://www.b.com/index.html;
        }
        location ~* .*\.php$ {
                proxy_pass http://www.c.com;
        }
}

上面的例子就是:
    1,当用户访问www.a.com时将返回调度器本机的index.html文件
    2,当用户访问www.a.com/bbs时将被调度之后端的www.b.com主机并将URL替换至http://www.b.com/index.html,也就是间接的访问了www.b.com主机的index.html页面了。
    3,当用户访问www.a.com/index.php动态程序时将被调度至后端的www.c.com主机中的php动态程序,

日志
    www.b.com主机的日志
        192.168.68.7 - - [24/Mar/2018:12:22:51 +0800] "GET /index.php HTTP/1.0" 200 5 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"
    www.c.com主机的日志
        192.168.68.7 - - [23/Mar/2018:23:08:02 +0800] "GET / HTTP/1.0" 200 25 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.168 Safari/537.36"
        
    "注意:为什么两个web服务器显示客户端IP都是一个,因为是nginx代理客户端访问数据再将数据转给客户端"


2,设定发往后端主机的请求报文的请求首部和值

    语法:proxy_set_header field value;
    可用在:http, server, location 
    相关参数:
        field:可以是任意字符串,该字符串必须与后端的web的日志记录格式中的字符串一样,否则将不会记录该请求报文的首部信息
    value变量
        $remote_addr:
            表示客户端的IP地址
        $proxy_add_x_forwarded_for:
            带有$remote_addr变量的“X-Forwarded-For”客户机请求标头字段,用逗号分隔。如果“X-Forwarded-For”字段在客户机请求头中不存在,则该$proxy_add_x_forwarded_for变量等于该$remote_addr变量。
        $proxy_port
            proxy_pass指令中指定的代理服务器 的端口或协议的默认端口;
        $proxy_host
            proxy_pass指令中指定的代理服务器的名称和端口 ;

示例:修改发往后端服务器的请求报文,设定后端主机的日志记录,实际客户端IP地址

实现步骤:

    客户端IP:192.168.68.16
    调度器IP:192.168.68.7
    
    1,修改调度器的主配置文件添加如下内容
        server {
            listen 80;
            root /nginx/html/;
            server_name www.a.com;
            index index.html;
            location /bbs {
                    proxy_pass http://www.c.com/;
                    proxy_set_header client_ip $remote_addr;
            }
            location ~* .*\.php$ {
                    proxy_pass http://www.b.com;
                    proxy_set_header client_ip $remote_addr;
            }
        }
    2,启动调度器服务
        systemctl restart nginx
    3,在后端的web服务器修改http主配置文件中的计入日志的配置段
        原:LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
        
        修改后:LogFormat "%{client_ip}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
            "注意:%h表示客户端的IP地址,%{client_ip}i就是在调度器中定义的请求报文首部,注意格式请求报文首部必须用{}i,至于没什么,因为没有为什么,这么写就对了"
    4,确认日志记录是调用该格式
        CustomLog "logs/access_log" combined
            注意:CustomLog配置段最后的"combined"表示调用的那个日志记录格式
    5,启动后端web服务器服务
        systemctl restart httpd
    
    6,查看后端服务器的访问日志
        没有配置前的访问日志
            192.168.68.7 - - [24/Mar/2018:12:16:07 +0800] "GET /index.php HTTP/1.0" 200 5 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.168 Safari/537.36"
        "配置后"
            192.168.68.16 - - [24/Mar/2018:16:24:15 +0800] "GET /index.php HTTP/1.0" 200 10 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.21 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"
    

3,开启代理缓存存功能,加快用户访问速度

定义缓存


    语法:proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time]; 
		 "注意【】中括号里的表示可选值"
     "可用在的:http语句块中"
    
    指令解析:
        path:
            指定缓存临时存放目录路径
        
        levels=levels:
            设置缓存的路径和其他参数。缓存数据存储在文件中。缓存中的文件名是将MD5函数应用于 缓存键的结果。该levels参数定义了缓存的层次结构级别:从1到3,每个级别接受值1或2.例如,在以下配置中
                proxy_cache_path / data / nginx / cache levels = 1:2 keys_zone = 1:10m;
            缓存中的文件名将如下所示:"一级目录是URL哈希值16进制的最后一位,二级目录是哈希值最后一位的前两位"
                / data / nginx / cache / c / 29 / b7f54b2df7773722d382f4809d650 29c
        
        use_temp_path=on|off:
            临时文件的目录根据use_temp_path参数设置,如果省略此参数或将其设置为该值on,则将使用proxy_temp_path指令为给定位置设置的目录。如果该值设置为off,临时文件将直接放入缓存目录中
        
        "keys_zone=name:size:
            注意此指令必须定义,该值是定义缓存的名字也就是之后在其他配置段中方便调用,给多大内存用来做缓存用户请求的页面内容,例如:keys_zone=1:1g"
        
        inactive=time(s|m|h|d):
            在inactive参数指定的时间内未访问的缓存数据将从缓存中删除,而不管其新鲜度如何。默认情况下,inactive设置为10分钟
        
        max_size=10g:
            表示这个zone的硬盘容量为10GB
        
        purger= on|off
            指示缓存 清除程序是否将从磁盘中删除与通配符键匹配的缓存条目 。将参数设置为on(默认为off)将激活“缓存清除器”进程,该进程永久遍历所有缓存条目并删除与通配符键匹配的条目。
         
        purger_files=number
            设置在一次迭代期间将被扫描的项目数量。默认情况下,purger_files设置为10
        
        purger_threshold=number
            设置一次迭代的持续时间。默认情况下,purger_threshold设置为50毫秒。
            
        purger_sleep=number
            在迭代之间设置暂停。默认情况下,purger_sleep设置为50毫秒。

2,调用缓存

   调用缓存功能,需要定义在相应的配置段,如server{...}; 
        在被代理的后端服务器出现哪种情况下,可以真接使用过 期的缓存响应客户端 
            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 ... 
        
        对哪些客户端请求方法对应的响应进行缓存,GET和 HEAD方法总是被缓存 
            proxy_cache_methods GET | HEAD | POST ...;
        
        默认nginx在响应报文不传递后端服务器的首部字段Date, Server, X-Pad,X-Accel-等,用于隐藏后端服务器特定的响 应首部
            proxy_hide_header field; 
        
        定义与后端服务器建立连接的超时时长,如超时会出现 502错误,默认为60s,一般不建议超出75s
            proxy_connect_timeout time; 
        
        将请求发送给后端服务器的超时时长;默认为60s 
            proxy_send_timeout time;
        
        等待后端服务器发送响应报文的超时时长,默认为60s 
            proxy_read_timeout time;

示例:实现代理缓存存功能步骤:

1,定义缓存方法,注意只能在http语句块中定义

http {
        ...
        
        proxy_cache_path /var/nginx/cache/proxy_cache  levels=1:2:2 keys_zone=proxycache:20minactive=120s max_size=1g;
        
        ...
    }
    

2,创建定义好的缓存存放路径目录

    mkdir /var/nginx/cache/proxy_cache 

3,调用

    server {
            listen 80;
            root /nginx/html/;
            server_name www.a.com;
            index index.html;
            "proxy_cache proxycache;        #调用keys_zone
            proxy_cache_key $request_uri;   #对什么进行hash运算,这里指的是客户端请求的URL
            proxy_cache_valid 200 302 301 1h; #缓存那些状态码的内容,缓存多长时间,1h表示1小时
            proxy_cache_valid any 1m;" #这里指的是其他的状态码的内容,只缓存1分钟
            location /bbs {
                    proxy_pass http://www.c.com/;
                    proxy_set_header client_ip $proxy_port-$remote_addr;
            }
            location ~* .*\.php$ {
                    proxy_pass http://www.b.com;
                    proxy_set_header client_ip $remote_addr;
            }
    }

**4, 启动调度服务器

    systemctl restart nginx

5, 测试

    ab -c 10 -n 2000 http://www.a.com/bbs
    ab -c 10 -n 2000 http://www.a.com/index.php

6,这时候在调度服务器会出现这样一些目录,这就表示已经开始有缓存了

    [root@centos7 ~]# tree /var/nginx/cache/proxy_cache/
    /var/nginx/cache/proxy_cache/
    └── d
        └── 4d
            └── f8
                └── d3a08c68a64dfb2a23b30dae88a f8 4d d #这个文件就是hash客户端请求得出来的哈希值
    
    3 directories, 1 file

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

相关模块ngx_http_headers_module

    1、添加响应报文首部
        语法:add_header name value [always];    
        可用在:http, server, location, if in location
        
        例如:
            add_header X-Via  $server_addr;  #后端服务器地址
            add_header X-Cache $upstream_cache_status;  #是否命中缓存,命中就显示"HIT",未命中显示"MISS",或者 REVALIDATED,UPDATIN,GSTALE,EXPIRED,BYPASS
            add_header X-Accel $server_name;    #后端服务器域名
    
    2,添加自定义响应信息的尾部 
        语法:add_trailer name value [always];

示例:
    server {
        listen 80;
        root /nginx/html/;
        server_name www.a.com;
        index index.html;
        proxy_cache proxycache;
        proxy_cache_key $request_uri;
        proxy_cache_valid 200 302 301 1h;
        proxy_cache_valid any 1m;
        "add_header X-Via  $server_addr;   
        add_header X-Cache $upstream_cache_status;  
        add_header X-Accel $server_name;"
        location /bbs {
                proxy_pass http://www.c.com/;
                proxy_set_header client_ip $proxy_port-$remote_addr;
        }
        location ~* .*\.php$ {
                proxy_pass http://www.b.com;
                proxy_set_header client_ip $remote_addr;
        }
    }

测试:
"未命中缓存:"
    [root@centos6 ~]# curl -I http://www.a.com/bbs
    HTTP/1.1 200 OK
    Server: nginx/1.12.2
    Date: Sat, 24 Mar 2018 12:28:34 GMT
    Content-Type: text/html; charset=UTF-8
    Content-Length: 2097152
    Connection: keep-alive
    Last-Modified: Fri, 23 Mar 2018 20:17:39 GMT
    ETag: "12092f-200000-5681a1dadad02"
    X-Via: 192.168.68.7
    X-Cache: MISS
    X-Accel: www.a.com
    Accept-Ranges: bytes
    
"命中缓存:"
    [root@centos6 ~]# curl -I http://www.a.com/bbs
    HTTP/1.1 200 OK
    Server: nginx/1.12.2
    Date: Sat, 24 Mar 2018 12:29:28 GMT
    Content-Type: text/html; charset=UTF-8
    Content-Length: 2097152
    Connection: keep-alive
    Last-Modified: Fri, 23 Mar 2018 20:17:39 GMT
    ETag: "12092f-200000-5681a1dadad02"
    X-Via: 192.168.68.7
    X-Cache: HIT
    X-Accel: www.a.com
    Accept-Ranges: bytes