• nginx实现负载均衡load balance


    nginx实现负载均衡load balance

    准备:3台服务器,一台做负载均衡器,另外两台做web服务器,建议编译安装nginx

    服务器IP
    LB192.168.232.161
    web1192.168.232.162
    web2192.168.232.163

    1、修改LB的配置文件

    用于cpu的核心是两个,所以可以修改配置文件中的进程数为2,并将应该worker的并发数修改为2048

    worker_processes  2;
    
    events {
        worker_connections  2048;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2、负载均衡器的配置

    http {
    	upstream chenapp1 {
            server 192.168.232.162;
            server 192.168.232.163;
        }
        server {
            listen       80;
            server_name  localhost;
    
            location / {
                proxy_pass http://chenapp1;
            }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    修改web1和web2的页面显示,然后在浏览器中输入LB服务器的网址,反复刷新可以看见不同的页面。
    这个时候web服务器的日志access.log中记录的IP就是负载均衡服务器的 IP

    相关算法

    	upstream chenapp1 {
    		ip_hash;    # 用户访问了某一个服务器的页面,就会一直访问那个页面
    		least_conn;    # 最小链接数(轮询),每次刷新会将web服务器的页面轮流展示
    		# 加上权重值,权重值大的那个就会访问的更多
            server 192.168.232.162 weight=5;
            server 192.168.232.163 weight=2;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    负载均衡https的访问

    server {
            listen       443 ssl;
            server_name  www.sanchuangedu.com;
                
            ssl_certificate      8905404_sanchuangedu.cn.pem ;    # pem文件和key文件都需要下载证书
            ssl_certificate_key  8905404_sanchuangedu.cn.key;
               
            ssl_session_cache    shared:SSL:1m;
            ssl_session_timeout  5m;
          
            ssl_ciphers  HIGH:!aNULL:!MD5;
            ssl_prefer_server_ciphers  on; 
        
            location / { 
                #root   html;
                #index  index.html index.htm;
                proxy_pass http://chenapp1;
            } 
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    后端的real server是否知道真正访问的用户的IP地址

    web服务器的日志access.log中记录的IP是负载均衡服务器的 IP,不知道用户的IP地址

    解决方法

    1. 后端real server不使用realip模块

      • 在负载均衡器上修改http请求报头部字段,添加一个X-Real-IP字段

        server {
                listen       80;
                server_name  localhost;
                
                location / {
                    proxy_pass http://chenapp1;
                    proxy_set_header X-Real-IP    $remote_addr;
                }
        
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
      • 在后端real server上使用这个X-Real-IP字段

        http {
            include       mime.types;
            default_type  application/octet-stream;
        
            log_format  main  '$remote_addr - $http_x_real_ip - $remote_user [$time_local] "$request" '
                              '$status $body_bytes_sent "$http_referer" '
                              '"$http_user_agent" "$http_x_forwarded_for"';
        
            access_log  logs/access.log  main;
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9

        现在就可以在/usr/local/scnginx99/logs/access.log文件中看到client的IP了

    2. 后端real server使用realip模块

      前提条件:在后端backend server上编译安装nginx的时候,--with http_realip_module开启相关功能

    backend server是如何知道前端client的IP地址的

    ​ 负载均衡器在应用层把要发送给bakend server的http协议添加新的IP存储字段x_real_ip

    健康检查

    查看web服务器是否还存活

    • 主动检查。负载均衡服务器主动检查web服务器,需要安装nginx plus

    • 被动检查。当client发请求给LB,然后LB再去转发请求给后端的real server,这个时候如果后端的服务器出现问题,LB就发现了。

      upstream backend {
      	server 192.168.232.162
      	server 192.168.232.163 max_files=3 fail_timeout=30s
      }
      
      • 1
      • 2
      • 3
      • 4

      fial_timeout:设置必须多次尝试失败才能将服务器标记为不可用时间,以及将服务器标记为不可用时间(默认10s)
      max_fails:设置在fail_timeout服务器标记为不可用的时间内必须发生的失败尝试次数(默认1次)
      backup:备份当其他的服务器都不提供服务的时候,再启用这台服务器提供服务
      slow_start:慢启动
      down:将上游的服务器标识为不可用,不会再发送任何请求给这台服务器

    提升负载均衡的并发数量

    1. 增加服务器数量

    2. 参数优化

      worker_processes 2;
      worker_connections 2048;
      
      在命令行允许一个进程可以打开的连接数量
      ulimit -n 1000000
      
      • 1
      • 2
      • 3
      • 4
      • 5

    七层负载均衡和四层负载均衡

    七层负载均衡

    nginx是根据http协议来做负载均衡的,http协议工作在应用层,是web服务的一部分,按照OSI七层网络模型来封装和解封装,属于第七层

    四层负载均衡

    在传输层完成所有的工作,根据端口号来区分不同的业务

    实现四层负载均衡:
    修改LB的nginx.conf

    stream {
    	upstream dns_servers {
    		least_conn;
    		server 192.168.136.130:53;
    		server 192.168.136.131:53;
    		server 192.168.136.132:53;
    	}
    	upstream web_servers {
    		server 192.168.232.162:80;
    		server 192.168.232.163:80;
    	}
    	server {
    		listen 53udp;
    		proxy_pass dns_servers;
    	}
    	server {
    		listen 80;
    		procy_pass web_servers;
    	}
    }
    events {
    	worker_connections 1024;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    四层和七层的区别

    七层负载均衡:
    1、基于应用层
    2、支持HTTP协议
    3、效率低
    4、可以实施应用层安全策略

    四层负载均衡:
    1、基于传输层,关注IP地址和端口号
    2、支持http、MySQL、DNS、ftp等协议
    3、效率高
    4、无法执行高级内容处理,如HTTP请求的URL路由或请求头修改

    502错误

    原因:所有的backend server都挂掉了

  • 相关阅读:
    【springboot】你了解@Autowired 和 @Resource吗?@Autowired 和 @Resource深入分析
    Solidity学习-投票合约示例
    LLVM系列第十八章:写一个简单的IR处理流程Pass
    PHP 电竞网站系统mysql数据库web结构apache计算机软件工程网页wamp
    [Linux]基础IO上(C文件操作 | 系统文件IO | 文件描述符fd | 缓冲区概念)
    C++算法前缀和的应用:得分最高的最小轮调的原理、源码及测试用例
    Hadoop知识点全面总结
    微服务基础---Eureka注册中心
    制作手机IOS苹果ipa应用的重签名工具
    [USACO2012-Mar-Silver] Flowerpot 题解(单调队列 c++)
  • 原文地址:https://blog.csdn.net/qq_45742976/article/details/132645253