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都挂掉了

相关推荐
EMTime10 小时前
Docker运行OpenWRT
运维·docker·容器
lolo大魔王11 小时前
Linux 文件系统超全面详解(原理、结构、挂载、分区、inode、日志、管理命令)
linux·运维·服务器
zyl8372113 小时前
Docker 使用手册
运维·docker·容器
古月方枘Fry14 小时前
MGRE实验
运维·服务器
stolentime14 小时前
FreeDomain 本地开发环境快速搭建指南
运维·服务器·网络
bush415 小时前
嵌入式linux学习记录四
linux·运维·学习
lihao lihao17 小时前
软硬链接
linux·运维·服务器
TOWE technology17 小时前
智能安防监控系统如何做好防雷?——视频信号SPD综合应用方案解析
运维·服务器·防雷产品·信号保护·信号防雷·spd
楼田莉子17 小时前
Docker学习:Docker介绍及其架构介绍
运维·后端·学习·docker·容器·架构
大明者省17 小时前
IIS 端口绑定正常访问的原理说明与常见误区澄清
运维·服务器·笔记