nginx实现负载均衡load balance

目录

nginx实现负载均衡load balance

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

服务器 IP
LB 192.168.232.161
web1 192.168.232.162
web2 192.168.232.163

1、修改LB的配置文件

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

worker_processes  2;

events {
    worker_connections  2048;
}

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;
        }
}

修改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;
    }

负载均衡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;
        } 
    }

后端的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;
              }
      
    • 在后端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;
      

      现在就可以在/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
    }
    

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

提升负载均衡的并发数量

  1. 增加服务器数量

  2. 参数优化

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

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

七层负载均衡

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、支持HTTP协议

3、效率低

4、可以实施应用层安全策略

四层负载均衡:

1、基于传输层,关注IP地址和端口号

2、支持http、MySQL、DNS、ftp等协议

3、效率高

4、无法执行高级内容处理,如HTTP请求的URL路由或请求头修改

502错误

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

相关推荐
热爱嵌入式的小许3 小时前
Linux基础项目开发1:量产工具——显示系统
linux·运维·服务器·韦东山量产工具
Pythonliu77 小时前
茴香豆 + Qwen-7B-Chat-Int8
linux·运维·服务器
你疯了抱抱我7 小时前
【RockyLinux 9.4】安装 NVIDIA 驱动,改变分辨率,避坑版本。(CentOS 系列也能用)
linux·运维·centos
小O_好好学9 小时前
CentOS 7文件系统
linux·运维·centos
哲伦贼稳妥9 小时前
一天认识一个硬件之机房地板
运维·网络·经验分享·其他
苹果醋39 小时前
快速玩转 Mixtral 8x7B MOE大模型!阿里云机器学习 PAI 推出最佳实践
spring boot·nginx·毕业设计·layui·课程设计
john_hjy10 小时前
11. 异步编程
运维·服务器·javascript
x晕x10 小时前
Linux dlsym符号查找疑惑分析
linux·运维·服务器
活跃的煤矿打工人10 小时前
【星海saul随笔】Ubuntu基础知识
linux·运维·ubuntu
tangdou36909865511 小时前
两种方案手把手教你多种服务器使用tinyproxy搭建http代理
运维·后端·自动化运维