我们日常中最常见的三种nginx的负载均衡策略应当为(轮询、权重、ip绑定),这其中的区别体现在upstream代码块中,以下是upstream代码块示例(轮询)。
upstream alias {
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
upstream代码块中可以填服务部署的服务器列表,upstream后面的名称是自己填写,我个人倾向于称它为服务器别名,命名好之后可以直接在server代码块中调用。
轮询
顾名思义,轮询就是将请求轮流转发给所有的服务器。
upstream alias {
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://alias;
}
}
如上述代码所示,nginx要将请求转发至 127.0.0.1的8080和8081端口,第一次nginx随机选择一台服务器发送请求,第二次就会选择另外一台。ABABAB,如此循环。服务器性能服务相同时,通常都是采用此策略。
权重
将请求按照一定的比例转发给不同的服务器。
upstream alias {
server 127.0.0.1:8080 weight=3;
server 127.0.0.1:8081 weight=2;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://alias;
}
}
上述代码中,我们设置的权重是3和2,也就代表着请求将会以 3:2 的比例转发给两台服务器。值得一提的是,nginx的权重机制属于轮询权重,也就是先给A发3次请求,然后给B发2次请求。适用于性能不同的服务器,如A服务器性能较强,或者开启的服务较少,则可以将更多的请求转发给A服务器。
ip绑定
顾名思义,就是将请求方的ip和服务器进行绑定。
upstream alias {
server 127.0.0.1:8080;
server 127.0.0.1:8081;
ip_hash;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://alias;
}
}
在upstream代码块里加上 ip_hash; 代码,即代表使用ip绑定策略。举个例子,当用户使用某一ip访问服务器,nginx将请求转发至8080,则代表该请求ip的后续所有请求都将会被转发至8080服务进行处理。
这种策略多用于带会话请求的场景,如用户的登录信息保存在session当中,如果换服务器则拿不到对应的session,会需要重新登录,使用ip_hash能保证用户请求的时同一台服务器。
总结:nginx的上述三种策略基本可以满足绝大部分应用场景,还有一些扩展的策略需要引入三方的一些类似于插件的东西,此处就不一一赘述。