nginx 负载均衡(默认算法)
使用 nginx 的upstream模块只需要几步就可以实现一个负载均衡;在 nginx 配置文件中添加两个server
server {
listen
81;
server_name
192.168.1.129;
root
/var/www/html1;
}
server {
listen
82;
server_name
192.168.1.129;
root
/var/www/html2;
}
使用upstream把这两个 server 绑定到一个负载sever上提供统一入口;
upstream myservers {
server
192.168.1.129:81 weight=1 max_fails=2 fail_timeout=3;
server
192.168.1.129:82 weight=1 max_fails=2 fail_timeout=3;
}
weight是权重max_fails 请求多少次失败后把这台服务器标记为失效 fail_timeout请求超时时间更多参数可以通过nginx官方文档查看;
server {
listen
80;
server_name
192.168.1.129;
location
/ {
index index.html;
proxy_pass http:
//myservers;
}
}
在 /var/www/html1/和/var/www/html2下分别建立index.html 文件内容分别为 html111 ,html2222;
然后重启nginx,访问192.168.1.129 浏览器会显示html111和html222交替变换,两个内容的出现概率和权重有关;
这里有两个问题:
用户访问过程中是先到达 192.168.1.129:80 然后被均匀转发给 81和82端口,如果你在81端口中的php代码里面获取remote_addr会
发现是 192.168.1.129而不用户的地址,也就是说81和82就收到的远程信息是 81和82前面的代理服务器的,用户的真实信息被丢掉了;
解决办法:如果通过apt方式安装的nginx 在 /etc/nginx/proxy_params中会有几个例子参考;
通过proxy_set_header可以设置相关头信息
server {
listen
80;
server_name
192.168.1.129;
location
/ {
index index.html;
proxy_set_header Host $http_host;
proxy_set_header X
-Real-IP $remote_addr;
proxy_set_header X
-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X
-Forwarded-Proto $scheme;
proxy_pass http:
//myservers;
}
}
这样在81/82端口收到的remote就是我们设置真实ip地址了;
还有个问题:在处理带状态的情况下 这种方式是不可行的,比如用户发送登录请求到82端口,82
端口保存了用户的登录session数据,但是当用户请求主页时,又被随机转发到81端口去了,81端口的后台根本就没有用户的session状态;
于是告诉用户你没有登录;
目前想到有两个办法:
(1)改变nginx的负载均衡算法,改为一致性哈希,可以根据用户ip地址来决定 该去访问那个端口,只要用户ip地址不变,就始终会被转发到指定端口;
(2)服务器不保存用户状态,用户每次请求附带状态信息
第一种方式还存在一个缺陷,比如用户用手机流量登录了系统,然后进入wifi环境,ip地址就变了,状态又会失效。第二种方式更适应性更加广泛;而且更适合做
restful 接口;
页:
[1]