Nginx实现反向代理
nginx代理基于是ngx_http_proxy_module模块的功能,该模块有很多属性配置选项,如:
proxy_pass:指定将请求代理至server的URL路径;
proxy_set_header:将发送至 server的报文的某首部进行重写
proxy_send_timeout:在连接断开之前两次发送到server的最大间隔时长;过了这么长时间后端还是没有收到数据,连接会被关闭
proxy_read_timeout:是从后端读取数据的超时时间,两次读取操作的时间间隔如果大于这个值,和后端的连接会被关闭。
proxy_connect_timeout: 是和后端建立连接的超时时间
proxy_pass配置常见用法有三种:
1、location的/uri将被替换为/newuri,如下:
location /uri {
proxy_pass http://ip:port/newuri;
}
应用场合:页面很固定的时候(如淘宝双十一的主界面)
将/mobi 的请求跳转到新服务器上/mobile目录下
location /mobi/ {
proxy_pass http://172.16.100. 1/mobile/index.php;
}
应用场合:用于流量的分流,将特定的请求分流道特定的服务器上
2、如果location的URI是通过模式匹配定义的,其URI将直接被传递,而不能为其指定转换的另一个URI。
location ~ ^/mobile {
proxy_pass http://172.16.100.2;
}
3、如果在location中使用的URL重定向,那么nginx将使用重定向后的URI处理请求,而不再考虑之前定义的URI
location /youxi {
rewrite ^(.*)$ /index.html break;
proxy_pass http://172.16.100.1;
}
proxy_set_header
proxy_set_header可将发送至server的报文的某首部进行重写;常用于nginx做负载均衡时,获取客户端IP时,需要添加forward头部。
proxy_set_header Host $host;
proxy_set_header X-REMOTE-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
原有请求报文中如果存在X-Forwared-For首部,则将client_addr以逗号
分隔补原有值后,否则则直接添加此首部;
$proxy_add_x_forwarded_for; (从后端的服务器上能看到RS的真实IP)
日志查看:
"$remote_addr" $host "$http_x_forwarded_for"
nginx负载均衡是ngx_http_upstream_module模块的功能,需要在配置文件http块上下文中定义upstream块,指定一组负载均衡的后端服务器,然后在proxy_pass中引用,就可以反向代理时实现负载均衡了。
语法:server address [parameters];
paramerters:
weight:负载均衡策略权重,默认为1;
max_fails:在一定时间内(这个时间在fail_timeout参数中设置)检查这个服务器是否可用时产生的最多失败请求数
fail_timeout:在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用,进行对后端服务器的健康状态检查;
backup:当所有后端服务器都宕机时,可以指定代理服务器自身作为备份,对外提供维护提示页面;
down:永久不可用。
upstream块里可以用多个server选项配置多个后端服务器,同时还可配置对后端服务器的健康状态检查,可以在server后面加上max_file(proxy_next_upstream指定检查策略,默认为返回超时为失败)和fail_timeout参数实现;也可以用health_check选项来实现健康检测可以指定的参数较多,不过需要定义在location上下文中。
另外,可以指定代理服务器自身作为备份server,当所有后端服务器都宕机时,对外提供维护提示页面。还可以指定负载均衡策略:主要有round_robin(加权轮询,默认)、
hash、ip_hash、least_conn(最少连接)和least_time(最少响应时间,商业版本),策略定义在upstream上下文即可;
配置文件实例:
在http块定义upstream: upstream server-cluster { server 172.17.253.107:80 weight=4; server 172.17.253.157:80 weight=4; server 172.17.233.166:80; check interval=3000 rise=2 fall=5 timeout=1000 type=http; check_http_expect_alive http_2XX http_3XX; } upstream static-cluster { server 172.17.250.209:80; server 172.17.254.148:80; check interval=3000 rise=2 fall=5 timeout=1000 type=http; check_http_expect_alive http_2XX http_3XX; } 在server段引用 location ~* .jpg|.png|.gif|.jpeg$ { proxy_pass http://static-cluster; } location ~* .js|.css|.html|.xml$ { proxy_pass http://static-cluster; }
对real-server进行健康检测
在http段中 upstream basic_server { server 192.168.17.175:80 weight=2; server 192.168.17.176:80 weight=5; check interval=3000 rise=2 fall=5 timeout=2000 type=http; check_http_expect_alive http_2xx http_3xx; } 在server段中 server { location /status { check_status; } }