Nginx反向代理及缓存等应用

反向代理

    客户端将HTTP请求发往反向代理服务器,由反向代理服务器重新将数据包封装发往对应的与其关联的后端服务器。反向代理可以将用户不同请求送往不同服务器,此时的后端服务器可以部署在局域网内,因此也可以在一定程度上减小后端服务器的安全威胁。
反向代理配置:
反向代理服务器IP:172.27.100.1
后端web服务器IP:172.27.100.2
注:实际上反向代理服务器对外应该为公网IP,请求由对内的网卡转发给后端服务器

配置文件:/etc/nginx/nginx.conf

例 1:
http {
    注:此处仅说明反向代理相关的关键配置信息,其他一些配置省略
    server {
        listen 80;
        server_name proxy.test.com;
        location /doc1/ {
            index index.html;
            proxy_pass http://172.27.100.2:8080/doc2/;
        }
    }
}
释:一个简单的代理配置,输入 http://172.27.100.1:80/doc1/
     实际访问的是 http://172.27.100.2:8080/doc2/index.html
   如果输入 http://172.27.100.1:80/doc1/test.txt
     实际访问内容为 http://172.27.100.2:8080/doc2/test.txt
注:如果location与proxy_pass处URI一致,只是看起来URI没有变化,实际两者只是类似于alias的映射关系


例 2:
http {
    server {
        listen 80;
        server_name proxy.test.com;
        location ~* (\.txt)$ {
            proxy_pass http://172.27.100.2:8080;
        }
    }
}
释:输入 http://172.27.100.1:80/test.txt
     实际访问 http://172.27.100.2:8080/test.txt
   输入 http://172.27.100.1:80/doc/test.txt
     实际访问 http://172.27.100.1:8080/doc/test.txt
注:location处URI为模式匹配时,则服务会将此处URI补在proxy_pass的URI处,原proxy_pass处不能写URI


例 3:
代理服务器虽能代理用户访问后端服务器,但在后端服务器看来,客户端永远只有一个,即代理服务器。
因此为了便于后端服务器的日志记录及分析,应该获取并记录真正客户端的IP。
于是可以通过在代理服务器上设置变量,将获取的客户端信息传递给后端服务器,后端服务器通过在日志格式中引用设置的变量即可记录客户端信息。
http {
    server {
 	   listen 80;
 	   server_name proxy.test.com;
 	   location / {
  	      proxy_pass http://172.27.100.2:8080/;
  	      proxy_set_header X-Real-IP $remote-addr;    #将实际客户端IP记录于变量X-Real-IP中
	    }
    }
}

后端服务器LogFormat:
LogFormat "%{X-Real-IP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
注:主要是将%h便用更改为自己定义的变量引用:%{X-Real-IP}i

注:更多代理相关指令查询官方文档

http://nginx.org/en/docs/http/ngx_http_proxy_module.html


缓存服务器

    代理服务器除代理外,亦可作为缓存服务器。缓存服务器不仅能加速响应用户请求,也能大幅降低后端服务器的压力。使用Nginx作为代理缓存服务器,通过指定缓存目录(磁盘),以及配置缓存条件等指令,Nginx将符合要求的内容以键值对应关系(内存中存放键,磁盘中存放值)存储在缓存服务器。
定义方式:

http {
     proxy_cache_path /data/nginx-cache/ levels=1:2 keys_zone=nginxCache:32m;
     选项说明:
         /data/nginx-cache/    磁盘存放内容的目录,需手动创建,目录属主属组为worker进程的属主属组
         levels=1:2    两个字段表示缓存目录下内容由两级目录,一级目录名称长度1字符,二级目录名称长度2字符
         keys_zone=nginxCache:32m    定义缓存调用名称,大小为32MB(内存)
   
    server {
    	listen 80;
    	server_name proxy.test.com;
    	location / {
    	    proxy_pass http://172.27.100.2:8080/;
    	    proxy_cache nginxCache;    # 启用http上下文定义的缓存
    	    
    	    # 以下为完善缓存条件、方式等相关的指令,可定义在http、server、location中
    	    proxy_cache_methods GET HEAD;    # 当客户端以GET HEAD方法请求时则缓存内容
    	    proxy_cache_min_uses 3;    # 某同一请求被请求3次后被缓存
    	    proxy_cache_revalidate on;    # 缓存服务器的内容过期后做重新有效性校验。
    	                                    # 若资源未变更则刷新过期时间
    	    proxy_cache_use_stale error timeout;    # 当缓存内容过期后,向后端服务器重新请求出现error timout错误时
    	                                              # 依然将过期内容发送给客户端,使用off禁用此项(默认未off)
    	                                              # 其他可用值有:invalid_header updating http_500 http_502等
    	    proxy_cache_valid 200 1h;    # 返回响应码为200的资源缓存有效期为1小时,
    	                                   # 可同时定义多个响应码,空格隔开此项必须指定,否则无缓存内容
    	}
    }
}

注:就目前试验来看,如果客户所请求的资源在缓存服务器中没有相应缓存内容,且后端服务器联系不上,客户端会收到对应的报错页面。但是请求次数依然会记录一次,当请求次数达到一定值(proxy_cache_min_uses定义的值)后,服务器重新上线后,再次收到同一资源请求时则会缓存内容值缓存服务器,即未成功的请求依然会记录于访问次数。


upstream模块

    模块:ngx_http_upstream_module 可以定义一个包含多个服务器的组,在使用反向代理时通过引用该组名对组内服务器进行轮询相应。可以实现一定的负载均衡,也可通过根据需要定义不同的组,并在location上下文中根据不同资源调用不同组。
定义方式:

http {
    upstream servers_group {
        ip_hash;    # 使用ip_hash算法进行调度,对同一客户端绑定在某一服务器响应
                    # ip_hash由于基于ip区分不同用户,所以对于大量用户使用SNAT方式上网的请求,都被绑定在一个服务器,破坏了负载均衡效果
        # 定义格式:server address [parameters];
    	server 172.27.100.2:8080 weight=2;    # weight设置权重值,默认为1
    	server 172.27.100.3;
    	其他参数:
    	    max_fails=    服务器健康状态监测错误次数达到多少次后标记为不可用
    	    fail_timout=    服务器健康状态监测超时多久标记为一次错误
    	    down    标记为不可用状态,可用于服务器分批次升级
    	    backup    标记为备用服务器
    }

    server {
    	listen 80;
    	server_name proxy.test.com;
    	location / {
    	    proxy_pass http://servers_group/;
    	    proxy_set_header X-Real-IP $remote_addr;
    	}
    }
}

你可能感兴趣的:(Linux笔记)