首页 > 代码库 > 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的反向代理、缓存功能