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