nginx实现负载均衡load balance

news/2024/7/10 2:08:31 标签: nginx, 负载均衡, 运维

目录

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

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


http://www.niftyadmin.cn/n/5003030.html

相关文章

Springboot - 13.spring-boot-starter-security集成

👀Spring Boot Starter Security 中文文档 Spring Security中文文档 👀Spring Boot Starter Security 运行流程 当然可以。首先,我们会将用户存储和认证的流程融入整个Spring Boot Starter Security的使用流程中。以下是当你使用Spring Bo…

uniapp 解决跨域的问题

uniapp 解决跨域的问题 我真的是个 沙雕 找对了解决办法 写错了地方 "h5" : {"devServer" : {"disableHostCheck" : true,"https": false,"proxy" : {"/app" : {"target" : "https://192.16…

php常用加密算法大全aes、3des、rsa等

目录 一、可解密加解密算法 1、aes 加解密算法 2、旧3des加解密方法 3、新3des加解密方法 4、rsa公私钥加解密、签名验签方法 5、自定义加密算法1 6、自定义加密算法2 7、自定义加密算法3 二、不可解密加密算法 1、md5算法 2、crypt算法 3、sha1算法 5、hash 算…

Git—版本控制系统

git版本控制系统 1、什么是版本控制2、常见的版本控制工具3、版本控制分类3.1、本地版本控制3.2、集中版本控制 SVN3.3、分布式版本控制 Git 4、Git与SVN的主要区别5、Git环境配置6、启动Git7、常用的Linux命令8、Git配置9、设置用户名与邮箱(用户标识,必…

Mendix如何实现导出文件

刚刚接触Mendix低代码两周,花了一周在b站看初级视频然后考完初级,第二周开始做个列表查询感觉照葫芦画瓢没啥难度。但最近要求写个导出列表数据,在mendix社区翻了翻,这个功能算是常见的。找了mendix官方提供的Docs磕磕盼盼才实现了…

简单便捷的行为验证码,让登录更轻松

前言 在当今数字化的世界里,登录账户已成为我们日常生活中不可或缺的一部分。然而,传统的输入验证码方式却常常给用户带来不必要的繁琐和麻烦。为了解决这一问题,简单便捷的行为验证码应运而生,让登录变得更加轻松。 行为验证码…

Linux命令200例:xargs标准输入的数据作为参数传递使用

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌。CSDN专家博主,阿里云社区专家博主,2023年6月csdn上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师&#xff0…

华纳云:linux服务器查看端口的办法

在Linux服务器上查看端口的状态和监听情况,您可以使用一些命令。以下是几种常用的方法: netstat命令: 使用netstat命令可以查看服务器上的端口情况。要查看所有活动连接和监听端口,可以运行以下命令: netstat -tuln …