架构师之路(一)Nginx系列之负载均衡

1、反向代理负载均衡服务概述

反向代理:
外网主机---互联网---中介---内网主机


正向代理:
内网主机---互联网---中介---外网主机(翻墙)


反向代理:nginx, 类似中介,中介帮你处理。
负载均衡:lvs,数据转发,帮你转发请求。

2、反向代理负载均衡配置过程

# 在负载均衡服务器上进行测试
  [root@lb01 ~]# curl -H host:www.oldboy.com  10.0.0.7/oldboy.html
    web01 www.oldboy.com
    [root@lb01 ~]# curl -H host:www.oldboy.com  10.0.0.8/oldboy.html
    web02 www.oldboy.com
    [root@lb01 ~]# curl -H host:www.oldboy.com  10.0.0.9/oldboy.html
    web03 www.oldboy.com
# 负载均衡配置部署
upstream     --- 负载均衡模块
proxy_pass   --- 反向代理模块
[root@lb01 nginx]# cat nginx.conf
    user  www;
    worker_processes  2;
    error_log  /var/log/nginx/error.log warn;
    pid        /var/run/nginx.pid;
    events {
        worker_connections  1024;
    }
    http {
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;
        keepalive_timeout  0;
        upstream oldboy {              --- 定义可以进行负载的web节点信息           
            server  10.0.0.7:80;            
            server  10.0.0.8:80;            
            server  10.0.0.9:80;            
        } 
        server {
           listen         80;
           server_name    localhost;
           location / {
            proxy_pass http://oldboy;  --- 反向代理将请求发送给指定集群
           }
        }
    }

3、负载均衡 upstream 模块详细说明

1) weight:   权重参数
     可以实现权重轮训分配资源, 默认是轮训分配资源
     upstream oldboy {
        server  10.0.0.7:80 weight=3;
        server  10.0.0.8:80 weight=2;
        server  10.0.0.9:80 weight=1;
       }
     
    2) least_conn: 按照节点连接数分配资源
     upstream oldboy {
        least_conn;
        server  10.0.0.7:80;
        server  10.0.0.8:80;
        server  10.0.0.9:80;
       }


  3) ip_hash: 确保一个用户多次访问, 负载均衡都会分配给相同web节点 了解
     用户01(100人):   10.0.0.1    ---  001 (产生的哈希值是001)     web01 
     用户02:          11.0.0.1    ---  011     web02 
     用户03:          12.0.0.1    ---  112     web03 
     
     000 ~ 150  (总的哈希值范围)
     000 ~ 050   -->  web01   100
     051 ~ 100   -->  web02
     101 ~ 150   -->  web03
     会造成负载不均情况
     
     优选:
     用户01              --> web01(缓存客户端 memcache-php)   用户01登录信息
     用户02    ---> lb01 --> web02(缓存客户端 memcache-php)   用户02登录信息  -->  缓存服务器 memcached (会话记录)
     用户03              --> web03(缓存客户端 memcache-php)   用户03登录信息       session会话共享服务器
  
     upstream oldboy {
        ip_hash;
        server  10.0.0.7:80;
        server  10.0.0.8:80;
        server  10.0.0.9:80;
       }
  
  4) 负载均衡节点健康检查
     max_fails=3        --- 最大的失败次数   lb01  --- http请求 --- web02
     fail_timeout=30s   --- 失败超时时间
     
     请求   ---  web01  1次失败  2次失败  3次失败,连续失败3次后,会在30秒之后再给一次机会,1次失败后,又是马上30s,并将请求给web02
     请求   ---  web02  1次成功
      upstream oldboy {
           server  10.0.0.7:80 max_fails=10 fail_timeout=60s;
           server  10.0.0.8:80;
           server  10.0.0.9:80;
        }
  5) 节点备份功能
      upstream oldboy {
          server  10.0.0.7:80;
          server  10.0.0.8:80;
          server  10.0.0.9:80 backup;
        } 
 备胎式备份, 只要有好的, 就不会用;当10.0.0.7 和 10.0.0.8 都不行了,才会用10.0.0.9

4、负载均衡 proxy 反向代理模块详细说明

    proxy_pass:       反向代理指令
  proxy_set_header: 设置请求头信息  
    01. 访问负载均衡可以显示不同网站页面
  # 不设置的话,后端服务器看到请求头的 Host 信息是upstream模块定义的名字。
  proxy_set_header Host $host;
    02. 使网站节点日志可以记录真实IP地址
  # $remote_addr 客户端ip, 负载均衡为服务端,记录下客户端的ip,赋值给X-Forwarded-For。
  proxy_set_header X-Forwarded-For $remote_addr;
    03. 检查网站页面是否正确
  # 负载均衡拿到web读武器d的结果,如果遇到404的错误,不给用户,找upstream 定义的主机里的下一台,返回给用户。
  proxy_next_upstream error timeout http_404;
  location / {
        proxy_pass http://oldboy;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_next_upstream error timeout http_404;
    }

5、网站服务动静分离

[root@lb01 nginx]# cat nginx.conf
    user  www;
    worker_processes  2;
    error_log  /var/log/nginx/error.log warn;
    pid        /var/run/nginx.pid;
    events {
        worker_connections  1024;
    }
    http {
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;
        keepalive_timeout  0;
        upstream upload {
            server  10.0.0.7:80;
        }  
        upstream static {
            server  10.0.0.8:80;
        }  
        upstream default {
            server  10.0.0.9:80;
        }  
        server {
           listen         80;
           server_name    localhost;
           location / {
              proxy_pass http://default;
              proxy_set_header Host $host;
              proxy_set_header X-Forwarded-For $remote_addr;
              proxy_next_upstream error timeout http_404;
           }
           location /upload/ {
              proxy_pass http://upload;
              proxy_set_header Host $host;
              proxy_set_header X-Forwarded-For $remote_addr;
              proxy_next_upstream error timeout http_404;
           }
           location /static/ {
              proxy_pass http://static;
              proxy_set_header Host $host;
              proxy_set_header X-Forwarded-For $remote_addr;
              proxy_next_upstream error timeout http_404;
           }
        }
    }

6、网站服务根据客户端显示不同页面

[root@lb01 nginx]# cat nginx.conf
    user  www;
    worker_processes  2;
    error_log  /var/log/nginx/error.log warn;
    pid        /var/run/nginx.pid;
    events {
        worker_connections  1024;
    }
    http {
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;
        keepalive_timeout  0;
        upstream iphone {
            server  10.0.0.7:80;
        }  
        upstream chrome {
            server  10.0.0.8:80;
        }  
        upstream default {
            server  10.0.0.9:80;
        }  
        server {
           listen         80;
           server_name    localhost;
           location / {
              proxy_pass http://default;
              proxy_set_header Host $host;
              proxy_set_header X-Forwarded-For $remote_addr;
              proxy_next_upstream error timeout http_404;
              if ($http_user_agent ~* iphone) {
                  proxy_pass http://iphone;
              }
              if ($http_user_agent ~* Chrome) {
                 proxy_pass http://chrome;
              }
           }
        }
    }
发布了51 篇原创文章 · 获赞 0 · 访问量 476

猜你喜欢

转载自blog.csdn.net/qq_40902339/article/details/103501920
今日推荐