nginx反向代理+负载均衡

2016-04-16 18:32:00

1. nginx反向代理配置

1.1 反向代理示意图

1.2 反向代理配置

http {
upstream backend {
server localhost:8080;
}
server {
listen 80;
server_name www.test.com;
proxy_connect_timeout 600; #连接后端超时时间
proxy_read_timeout 600; #后端服务器响应时间
proxy_send_timeout 6000; #代理发送超时
proxy_buffer_size 16k; #代理保存用户头信息的缓冲区大小
proxy_buffers 8 32k; #proxy_buffers缓冲区,网页平均在32k以下的设置
proxy_busy_buffers_size 64k; #最繁忙时缓冲大小
proxy_temp_file_write_size 64k; #代理临时文件大小,先写内存
location / {
proxy_pass http://backend;
proxy_redirect off; #如是重定向,保持location值不变
proxy_set_header Host $host; #主机名,如客户端未发,用该server的host
proxy_set_header X-Real-IP $remote_addr;
#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}
}
}

2. nginx负载均衡配置

2.1 负载均衡架构图

nginx负载均衡通过upstream模块支持,这是画的一个比较简单的模型图,通过nginx反向代理结合负载策略,选中后端tomcat集群中的一台进行实际业务请求处理。这里集群有一个session共享的问题,此处是采用外部缓存组件redis或memcache来解决,也有其他方案,例如,三方模块nginx-sticky-module(这个模块的作用是通过cookie黏贴的方式将来自同一个客户端(浏览器)的请求智能分发到同一个后端服务器上处理),或三方模块nginx_upstream_jvm_route(第一次请求分发到某个后端服务,以后的请求都会固定到该后端)

2.2 负载均衡配置

普通ip_hash和权重配置
upstream backend {
ip_hash;
server 192.168.1.1:8080 weight 2;
server 192.168.1.2:8080 weight=1 max_fails=2 fail_timeout=30s ;
server 192.168.1.3:8080 backup;
}
server {
location / {
proxy_pass http://backend;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
}
fair实现负载均衡配置
upstream backend {
server 192.168.1.1:8080;
server 192.168.1.2:8080;
fair;
}
sticky实现session共享配置
upstream backend {
server 192.168.1.1:8080;
server 192.168.1.2:8080;
sticky;
}
jvm_route实现session共享配置
upstream backend {
server 192.168.1.1:8080 srun_id=p1;
server 192.168.1.2:8080 srun_id=p2;
jvm_route $cookie_JSESSIONID|sessionid reverse;
}
修改tomcat的server.xml配置,jvmRoute值与nginx配置里的srun_id值一致
<Engine name="Catalina" defaultHost="localhost" jvmRoute="p1">

weight : 轮询权值可用在ip_hash,默认值为1,和命中率成正比
max_fails : 允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误
fail_timeout : 有两层含义,一是在 30s 时间内最多容许 2 次失败;二是在经历了 2 次失败以后,30s时间内不分配请求到这台服务器。
backup:预留的备份机器。当其他所有的非backup机器出现故障的时候,才会请求backup机器,因此这台机器的压力最轻
max_conns: 限制同时连接到某台后端服务器的连接数,默认为0即无限制。因为queue指令是commercial,所以还是保持默认吧。
proxy_next_upstream : 这个指令属于 http_proxy模块的,指定后端返回什么样的异常响应时,使用另一个realserver

2.3 负载均衡策略

轮询(default): 每个请求按时间顺序逐一分配到不同的后端服务器

权重(weight): Weight 指定轮询权值,Weight值越大,分配到的访问机率越高

ip_hash: 每个请求按访问IP的hash结果分配

HttpUpstreamFairModule:将请求转发到响应最快的后端服务器,fair是三方模块,需编译进nginx