Nginx:反向代理(负载均衡)
Nginx通过反向代理功能实现负载均衡
Nginx做为负载均衡很大的优势,并发优势就不用说了,支持的负载均衡的功能比较强大
upstream
(上游)通过 upstream
可以设定后端服务器,指定的方式可以是 IP 地址与端口、域名、UNIX 套接字(socket)。
upstream name{ server xxxxxxx;#xxxxxx可以是IP地址与端口、域名、UNIX套接字(socket) } server{ proxy_pass http://name;#该name就是设定好的均衡负载配置 #代理设置 proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr;#保留用户IP信息 #location 对URL进行匹配.可以进行重定向或者进行新的代理 负载均衡 local / { proxy_pass http://name2;#该name就是设定好的均衡负载配置 #代理设置 proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr;#保留用户IP信息 } #因为是放置在server配置中,可以进行url的重定向或其他代理设置,相当灵活 }
代理缓存
当网站内的图片及JS用cache服务器的时候,就需要在此处进行代理设置
- 因为Nginx的并发能力高于大多数的cache服务器,由Nginx在前端做负载均衡
- 将图片及JS请求转发到cache服务器,再由cache服务器去请求真实的web服务器(也是Nginx服务器)
- 注意,不要照成环路访问,真实web服务器和负载均衡服务器都是用Nginx,需要分为2个服务
有5种均衡负载的方式
1.轮询:每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
2.权重(weight):指定轮询几率,weight
和访问比率成正比,用于后端服务器性能不均的情况。
upstream name{ server 192.168.0.14 weight=10; server 192.168.0.15 weight=10; }
3.用户IP哈希(client IP):每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
upstream name{ ip_hash; server 192.168.0.1; server 192.168.0.2; #和 ip_hash 配合使用的关键字:down。当某个一个 server 暂时性的宕机(down)时,你可以使用“down”来标示出来,并且这样被标示的 server 就不会接受请求去处理。 server 192.168.0.3 down; #当然,如果所 hash 到的服务当前不可用,则请求会被转移到其他服务。 }
#注意的是
weight
与ip_hash
是不能同时使用的,原因很简单,他们是不同且彼此冲突的策略
4.相应时间(fair):按后端服务器的响应时间来分配请求,响应时间短的优先分配。需要安装Upstream Fair Balancer Module
upstream test{ server 192.168.0.1; server 192.168.0.2; fair; }
5.自定义hash(hash):这种模式可以根据给定的字符串进行Hash分配,和ip_hash
概念一致。需要安装Upstream Hash Module
upstream test{ server 192.168.0.1; server 192.168.0.2; #按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。 hash $request_uri; #hash算法 hash_method crc32; }
以上方式还支持与另外2种策略组合
1.重试策略:可以为每个 backend
指定最大的重试次数,和重试时间间隔。所使用的关键字是 max_fails
和 fail_timeout
。
upstream backend { server backend1.example.com weight=5; server 54.244.56.3:8081 max_fails=3 fail_timeout=30s; #失败的情形,由 proxy_next_upstream 或 fastcgi_next_upstream 指定 #可以使用 proxy_connect_timeout 和 proxy_read_timeout 控制 upstream 响应时间。 }
#有一种情况需要注意,就是 upstream
中只有一个 server
时,max_fails
和 fail_timeout
参数可能不会起作用。导致的问题就是 nginx
只会尝试一次 upstream
请求,如果失败这个请求就被抛弃了 : ( ……解决的方法,比较取巧,就是在 upstream
中将唯一 server 多写几次
2.备机策略
(Nginx0.6.7以后):使用“backup
”关键字。当所有的非备机non-backup
都宕机down
或者繁忙busy
的时候,就只使用由 backup 标注的备机。
必须要注意的是,backup
不能和 ip_hash
关键字一起使用。
upstream backend { server backend1.example.com; server backend2.example.com backup; server backend3.example.com; }