美文网首页
Nginx 实现负载均衡

Nginx 实现负载均衡

作者: 小屁孩云熙 | 来源:发表于2021-12-31 19:16 被阅读0次

    1. 负载均衡概念说明

    1.1 什么是负载均衡

    1. 实现用户访问请求进行调度分配
    2. 实现用户访问压力分担

    1.2 什么是反向代理

    1.2.1 反向代理

    外网(用户) ===> (外网网卡)代理服务器(内网网卡)===> 公司网站服务器Web(内网)

    1.2.2 正向代理(翻墙)

    内网(局域网主机) ===> (内网网卡)代理服务器(外网网卡) ===> 互联网 Web服务器

    1.3 集群

    1.3.1 什么是集群

    完成相同任务或工作的一组服务器

    1.3.2 特点

    1. 高性能
    2. 价格有效性
    3. 可伸缩性
    4. 高可用性
    5. 透明性

    2. 负载均衡环境搭建

    2.1 集群服务器部署

    集群中每台服务器的配置 一模一样

    1. 企业中,先部署好一台 LNMP 服务器,上传代码信息
    2. 进行访问测试
    3. 批量部署多台 Web 服务器
    4. 将 Nginx 配置文件批量分发
    5. 将站点目录分发给所有主机

    2.2 负载均衡服务器部署

    2.2.1 安装 Nginx 软件

    2.2.2 编写 Nginx 负载服务配置文件

    • Nginx 模块
    # 模块01 
    ngx_http_upstream_module
    指令: upstream    -- 负载均衡 
    
    # 模块02 
    ngx_http_proxy_module
    指令: proxy_pass  -- 反向代理
    
    • 编写配置文件 (lb.conf)
    # 定义可将请求分配给哪些服务器 (upstream 配置在 http 区域)
    upstream yunxuanedu {
        server 10.1.1.7:80;
        server 10.1.1.8:80;
        server 10.1.1.9:80;
    }
    # 将请求分配给指定的集群
    server {
        listen  80;
        server_name www.yunxuanedu.com;
        location / {
            proxy_pass http://yunxuanedu;
        }
    }
    

    2.2.3 实现负载功能测试

    2.2.4 抓包

    image-20211230162632129.png

    3. 负载均衡访问网站异常排错思路

    1. 在负载均衡服务器上,测试 Web 节点服务器访问是否正常
    # 在命令行 指定 映射关系测试
    [root@lb01 ~]# curl -H host:www.yunxuanedu.com 10.1.1.7/test001.html
    www 172.16.1.7
    [root@lb01 ~]# curl -H host:www.yunxuanedu.com 10.1.1.8/test001.html
    www 172.16.1.8
    [root@lb01 ~]# curl -H host:www.yunxuanedu.com 10.1.1.9/test001.html
    www 172.16.1.9
    
    1. 在负载均衡服务器上,利用 curl 访问负载均衡服务器 是否正常

    2. 在本地测试 访问 负载均衡服务器是否正常

    image-20211230163416629.png

    4. 负载均衡配置模块详细说明

    4.1 ngx_http_upstream_module (upstream)

    4.1.1 实现不同调度功能

    1. 轮询分配请求(平均)
    2. 权重分配请求(能力越强责任越重)
    upstream yunxuanedu {
        server 10.1.1.7:80  weight=3;
        server 10.1.1.8:80  weight=2;
        server 10.1.1.9:80  weight=1;
    }
    
    1. 实现热备功能
    # 9为热备,所有请求分发给7和8,只有7和8均无法提供服务,才使用9
    upstream yunxuanedu {
        server 10.1.1.7:80;
        server 10.1.1.8:80;
        server 10.1.1.9:80  backup;
    }
    
    1. 定义最大失败次数(健康检查参数)
    # 默认次数为 1
    upstream yunxuanedu {
        server 10.1.1.7:80  max_fails=5;
        server 10.1.1.8:80;
        server 10.1.1.9:80;
    }
    
    1. 定义失败之后重发的间隔时间(健康检查参数)
    upstream yunxuanedu {
        server 10.1.1.7:80  fail_timeout=10s;
        server 10.1.1.8:80;
        server 10.1.1.9:80;
    }
    

    4.1.2 实现不同调度算法

    1. rr 轮询调度算法

    2. wrr 权重调度算法

    3. ip_hash 算法(可避免 cookie 分发问题,导致闪退)

      ip_hash 会出现负载不均衡问题

      cookie 不一致,闪退。此外还可以使用缓存服务器保存 会话记录,使用 memcache

    upstream yunxuanedu {
        ip_hash;
        server 10.1.1.7:80;
        server 10.1.1.8:80;
        server 10.1.1.9:80;
    }
    
    1. least_conn (最小连接数)

      那台服务器 连接数较少,分配给谁

    4.2 ngx_http_proxy_module (proxy_pass)

    4.2.1 访问不同的网站地址,不能显示不同的网站页面(有旁站)

    • 问题现状
    [root@lb01 conf.d]# curl -H host:www.yunxuanedu.com 10.1.1.7/test001.html
    www 172.16.1.7
    [root@lb01 conf.d]# curl -H host:www.yunxuanedu.com 10.1.1.8/test001.html
    www 172.16.1.8
    [root@lb01 conf.d]# curl -H host:www.yunxuanedu.com 10.1.1.9/test001.html
    www 172.16.1.9
    [root@lb01 conf.d]# curl -H host:www.yunxuanedu.com 10.1.1.5/test001.html
    bbs 172.16.1.7
    [root@lb01 conf.d]# curl -H host:www.yunxuanedu.com 10.1.1.5/test001.html
    bbs 172.16.1.8
    [root@lb01 conf.d]# curl -H host:www.yunxuanedu.com 10.1.1.5/test001.html
    bbs 172.16.1.9
    
    • 解决方法
    location / {
        proxy_pass http://yunxuanedu;
        proxy_set_header Host $host;
    }
    

    4.2.2 访问网站用户地址信息无法进行分析统计

    • 问题如下,日志记录全部为负载服务器地址
    [root@web01 ~]# tail /var/log/nginx/access.log
    ……
    10.1.1.5 - - [30/Dec/2021:16:20:22 +0800] "GET /test001.html HTTP/1.0" 200 15 "-" "curl/7.29.0" "-"
    10.1.1.5 - - [30/Dec/2021:16:20:25 +0800] "GET /test001.html HTTP/1.0" 200 15 "-" "curl/7.29.0" "-"
    10.1.1.5 - - [30/Dec/2021:16:25:28 +0800] "GET / HTTP/1.0" 200 28 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36 SLBrowser/7.0.0.6241 SLBChan/27" "-"
    10.1.1.5 - - [30/Dec/2021:16:36:53 +0800] "GET /test001.html HTTP/1.1" 200 15 "-" "curl/7.29.0" "-"
    
    • 解决
    location / {
        proxy_pass http://yunxuanedu;
        proxy_set_header X-Forwarded-For $remote_addr;
    }
    

    4.2.3 访问负载均衡,出现错误页面,影响用户体验

    location / {
        proxy_pass http://yunxuanedu;
        proxy_next_upstream error timeout http_404 http_502 http_403;
    }
    

    4.3 lb.conf 文件内容

    [root@lb01 conf.d]# cat lb.conf 
    upstream yunxuanedu {
        server 10.1.1.7:80;
        server 10.1.1.8:80;
        server 10.1.1.9:80;
    }
    server {
        listen  80;
        server_name www.yunxuanedu.com;
        location / {
            proxy_pass http://yunxuanedu;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_next_upstream error timeout http_404 http_502 http_403;
        }
    }
    server {
        listen  80;
        server_name bbs.yunxuanedu.com;
        location / {
            proxy_pass http://yunxuanedu;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_next_upstream error timeout http_404 http_502 http_403;
        }
    }
    server {
        listen  80;
        server_name blog.yunxuanedu.com;
        location / {
            proxy_pass http://yunxuanedu;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_next_upstream error timeout http_404 http_502 http_403;
        }
    }
    

    5. 负载均衡企业实践应用

    5.1 根据用户访问的uri信息进行负载均衡 (动静分离)

    5.1.1 环境规划

    用户请求(URI) 处理请求服务器 站点目录 功能
    /upload 10.1.1.8:80 /html/www/upload upload 服务器集群
    /static 10.1.1.7:80 /html/www/static static 静态服务器 集群
    / 10.1.1.9:80 /html/www 默认
    • 访问 URL 信息
    www.yunxuanedu.com/test.html
    www.yunxuanedu.com/upload/test.html
    www.yunxuanedu.com/static/test.html
    

    5.1.2 环境部署

    • 10.1.1.7
    [root@web01 conf.d]# cat www.conf 
    server {
        listen  80;
        server_name www.yunxuanedu.com yx.com;
        location / {
          root  /html/www;
          index test.html;
        }
    }
    [root@web01 ~]# systemctl reload nginx
    [root@web01 ~]# cd /html/www/
    [root@web01 www]# mkdir static
    [root@web01 www]# cd static/
    [root@web01 static]# echo "static-RAC-10.1.1.7" > test.html
    [root@web01 static]# cat test.html 
    static-RAC-10.1.1.7
    
    • 10.1.1.8
    [root@web02 conf.d]# cat www.conf 
    server {
        listen  80;
        server_name www.yunxuanedu.com yx.com;
        location / {
          root  /html/www;
          index test.html;
        }
    }
    [root@web02 ~]# systemctl reload nginx
    [root@web02 ~]# cd /html/www
    [root@web02 www]# mkdir upload
    [root@web02 www]# cd upload/
    [root@web02 upload]# echo "upload-RAC-10.1.1.8" > test.html
    [root@web02 upload]# cat test.html 
    upload-RAC-10.1.1.8
    
    • 10.1.1.9
    [root@web03 conf.d]# cat www.conf 
    server {
        listen  80;
        server_name www.yunxuanedu.com yx.com;
        location / {
          root  /html/www;
          index test.html;
        }
    }
    [root@web03 ~]# systemctl reload nginx
    [root@web03 ~]# cd /html/www/
    [root@web03 www]# echo "default-RAC-10.1.1.9" > test.html
    [root@web03 www]# cat test.html 
    default-RAC-10.1.1.9
    
    • 10.1.1.5 (负载均衡服务器)
    [root@lb01 ~]# cd /etc/nginx/conf.d/
    [root@lb01 conf.d]# ll
    total 8
    -rw-r--r-- 1 root root 1072 Nov 16 23:02 default.conf
    -rw-r--r-- 1 root root  746 Dec 30 18:52 lb.conf
    [root@lb01 conf.d]# cp lb.conf{,.bak01}
    [root@lb01 conf.d]# vim lb.conf
    [root@lb01 conf.d]# nginx -t
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
    [root@lb01 conf.d]# cat lb.conf
    upstream default {
        server 10.1.1.9:80;
    }
    
    upstream static {
        server 10.1.1.7:80;
    }
    
    upstream upload {
        server 10.1.1.8:80;
    }
    server {
        listen  80;
        server_name www.yunxuanedu.com;
        location / {
            proxy_pass http://default;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $remote_addr;
        }
        location /upload {
            proxy_pass http://upload;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $remote_addr;
        }
        location /static {
            proxy_pass http://static;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $remote_addr;
        }
    }
    [root@lb01 conf.d]# systemctl reload nginx
    

    5.1.3 访问测试

    5.1.4 总结 - 实现网站集群动静分离

    1. 提高网站服务的安全性
    2. 简化运维管理操作
    3. 可以划分不同人员管理不同的集群服务器

    5.2 根据用户访问的终端信息进行负载均衡

    5.2.1 环境规划

    用户请求 处理请求服务器 站点目录 功能
    iphone 10.1.1.7:80 /html/www 移动端 集群
    google 浏览器 10.1.1.8:80 /html/www google 端访问集群
    其他浏览器 10.1.1.9:80 /html/www default 集群

    5.2.2 环境部署

    • 10.1.1.7
    [root@web01 ~]# echo "Mobile-RAC-10.1.1.7" > /html/www/test.html
    [root@web01 ~]# cat /html/www/test.html
    Mobile-RAC-10.1.1.7
    
    • 10.1.1.8
    [root@web02 ~]# echo "Google-RAC-10.1.1.8" > /html/www/test.html
    [root@web02 ~]# cat /html/www/test.html
    Google-RAC-10.1.1.8
    
    • 10.1.1.9
    [root@web03 ~]# echo "Default-RAC-10.1.1.9" > /html/www/test.html
    [root@web03 ~]# cat /html/www/test.html
    Default-RAC-10.1.1.9
    
    • 10.1.1.5 (负载均衡服务器)
    [root@lb01 conf.d]# vim lb.conf
    [root@lb01 conf.d]# nginx -t
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
    [root@lb01 conf.d]# systemctl reload nginx
    [root@lb01 conf.d]# cat lb.conf
    upstream mobile {
        server 10.1.1.7:80;
    }
    
    upstream google {
        server 10.1.1.8:80;
    }
    
    upstream default {
        server 10.1.1.9:80;
    }
    
    server {
        listen  80;
        server_name www.yunxuanedu.com;
        location / {
            if ($http_user_agent ~* iphone) {
                proxy_pass  http://mobile;
            }
            if ($http_user_agent ~* Chrome) {
                proxy_pass  http://google;
            }
            proxy_pass http://default;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $remote_addr;
        }
    }
    

    5.2.3 访问测试

    相关文章

      网友评论

          本文标题:Nginx 实现负载均衡

          本文链接:https://www.haomeiwen.com/subject/xhhnqrtx.html