首页 > 代码库 > nginx 负载均衡(默认算法)
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 接口;
nginx 负载均衡(默认算法)