负载均衡是什么?

负载均衡,简单理解就是:按照一定的算法【权重、轮询】,将客户端请求转发到不同应用服务器上,减轻单个服务器压力,提高系统并发量。
实现负载均衡常用的Web服务器软件有Nginx、HAProxy、LVS、Apache,本文主要介绍Nginx的负载均衡策略。
提示:具体理论及详解在csdn等网站会有许多,本文不做详细讲解


一、nginx

Nginx是一个高性能的http和反向代理web服务器,是一款轻量级的web服务器·、反向代理服务器、及电子邮件(IMAP、POP3)代理服务器,具体简介百度一下有很多。
提示:nginx支持正向代理、反向代理、负载均衡、动静分离;后续理论再发;

二、简单的nginx负载均衡实现【轮循】

Nginx是通过反向代理实现的负载均衡。Nginx负载均衡是通过upstream模块来实现的,内置实现了三种负载策略:
1.轮循 : Nginx根据请求次数,将每个请求均匀分配到每台服务器;
2.最少连接:将请求分配给连接数最少的服务器;
3.ip-hash :绑定处理请求的服务器;即:第一次请求时,根据该客户端的IP将请求分配到某一台服务器上,后续该客户端的所有请求都将通过之前请求的服务器进行处理。
4.权重:在轮询的基础上指定权重参数,使其能根据权重分配而不是平均分配;(其实权重是在轮循里面的,为方便理解,这里作为第四点展开)

官网:http://nginx.org/en/docs/http/load_balancing.html

<1>实验环境

1.nginx负载均衡:centos7.4
2.web服务器:centos7.4
3.IP规划:
192.168.236.31 nginx
192.168.236.25 web1
192.168.236.26 web2

<2>nginx负载均衡搭建

1.添加网络源

提示:添加网络源是为了下载最新较稳定的nginx1.2.0

[root@nginx ~]# cd /etc/yum.repos.d  #进入yum源目录
[root@nginx yum.repos.d]# vi aliyun.repo #添加阿里源,如下:
[root@nginx yum.repos.d]# cat aliyun.repo
-----------------------分隔符----------------------------- 
[aliyun-os]
name=aliyun-os
baseurl=https://mirrors.aliyun.com/centos/7/os/x86_64/
enabled=1
gpgcheck=0

[aliyun-epel]
name=aliyun-epel
baseurl=https://mirrors.aliyun.com/epel/7/x86_64/
enabled=1
gpgcheck=0

[aliyun-extra]
name=aliyun-extra
baseurl=https://mirrors.aliyun.com/centos/7/extras/x86_64/
enabled=1
gpgcheck=0
---------------------分隔符--------------------------------
[root@nginx yum.repos.d]# yum clean all && yum makecache

2.web服务器

提示:为简便,web服务器直接用httpd生成静态网页做模拟

[root@web1 ~]# yum install -y httpd  #下载安装httpd
[root@web1 ~]# systemctl start httpd   #启动httpd
[root@web1 ~]# systemctl enable httpd   #设置开机启动httpd
[root@web1 ~]# systemctl status httpd   #查看httpd状态
[root@web1 ~]# echo 'this is 192.169.236.25' >> /var/www/html/index.html
#重新输入web前端显示内容
[root@web1 ~]# systemctl restart httpd  #重启httpd

两台服务器均执行上面操作,web1和web2区别在于写入的ip
用浏览器访问显示:
在这里插入图片描述
在这里插入图片描述

3.nginx负载均衡【轮循】

安装nginx

[root@nginx ~]# yum install -y nginx  #yum下载安装nginx
------------------------------------------------------------------------------------------------
......
Installed:
  nginx.x86_64 1:1.20.1-9.el7                                                                          

Dependency Installed:
  centos-indexhtml.noarch 0:7-9.el7.centos             gperftools-libs.x86_64 0:2.6.1-1.el7            
  nginx-filesystem.noarch 1:1.20.1-9.el7               openssl11-libs.x86_64 1:1.1.1k-3.el7            

Complete!
------------------------------------------------------------------------------------------------

启动nginx并检查

[root@nginx ~]# rpm -q nginx  #检查nginx版本
nginx-1.20.1-9.el7.x86_64
[root@nginx ~]# systemctl start nginx  #启动nginx
[root@nginx ~]# systemctl enable nginx  #设置开机启动nginx
[root@nginx ~]# systemctl status nginx   #查看nginx运行状态
● nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2022-05-03 06:44:54 EDT; 19s ago
 Main PID: 1525 (nginx)
   CGroup: /system.slice/nginx.service
           ├─1525 nginx: master process /usr/sbin/nginx
           └─1526 nginx: worker process
            
[root@nginx ~]# nginx -t  #检查nginx配置
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

浏览器访问nginx
在这里插入图片描述
修改nginx配置文件

[root@nginx ~]# cp /etc/nginx/nginx.conf  /etc/nginx/nginx.conf.bak
#为防止配置文件修改后不可用,先做个备份文件
[root@nginx ~]# vi /etc/nginx/nginx.conf    #修改nginx配置文件
----------------------------------------------
.......
http{
     ......
     #在server前面添加如下内容:
	 upstream webserver {
        server 192.168.236.25;
        server 192.168.236.26;
    }
    
	#在server中修改成如下内容:
	server {
        listen 80;

        location / {
            proxy_pass http://webserver;
        }
    }
}

----------------------------------------------
[root@nginx ~]# nginx -t  #检查nginx配置
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@nginx ~]# systemctl restart nginx #重启nginx

用浏览器多次访问nginx
在这里插入图片描述
在这里插入图片描述
可以看到,当我们多次访问nginx时,它会轮循每个服务器


三、nginx负载均衡的轮循、最少连接、ip_hash、权重的配置

1.轮询

Nginx根据请求次数,将每个请求均匀分配到每台服务器;

[root@web1 ~]# cat /etc/nginx/nginx.conf
-----------------------------------------------------
.......
http {
    .......
    upstream webserver {
        server 192.168.236.25;
        server 192.168.236.26;
    }

    server {
        listen 80;
        location / {
            proxy_pass http://webserver;
        }
    }
}
-------------------------------

2.权重

在轮询的基础上指定权重参数,使其能根据权重分配而不是平均分配;

[root@web1 ~]# cat /etc/nginx/nginx.conf
-----------------------------------------------------
.......
http {
    .......
    upstream webserver {
        server 192.168.236.25 weight=2;  # 2/3;
        server 192.168.236.26 weight=1;  # 1/3;
    }

    server {
        listen 80;
        location / {
            proxy_pass http://webserver;
        }
    }
}

3.最少连接

将请求分配给连接数最少的服务器;

[root@web1 ~]# cat /etc/nginx/nginx.conf
-----------------------------------------------------
.......
http {
    .......
    upstream webserver {
    	least_conn;
        server 192.168.236.25;
        server 192.168.236.26;
    }

    server {
        listen 80;
        location / {
            proxy_pass http://webserver;
        }
    }
}

4.ip_hash

绑定处理请求的服务器;即:第一次请求时,根据该客户端的IP将请求分配到某一台服务器上,后续该客户端的所有请求都将通过之前请求的服务器进行处理

[root@web1 ~]# cat /etc/nginx/nginx.conf
-----------------------------------------------------
.......
http {
    .......
    upstream webserver {
    	ip_hash;
        server 192.168.236.25 ;
        server 192.168.236.26 ;
    }

    server {
        listen 80;
        location / {
            proxy_pass http://webserver;
        }
    }
}

总结

以上就是简单的nginx负载均衡搭建,通过负载均衡,我们可以看到我们每次请求都是访问不同服务器,这样就避免的某单一服务器的访问过多过载。

官网文档:http://nginx.org/en/docs/

补充:正向代理与反向代理

正向代理

正向代理是客户端的代理
隐藏真实的客户端,使真实客户端对服务器不可见。

流程:

用户发送请求到代理服务器→代理服务器发送请求到服务器→
服务器将数据返回到代理服务器→代理服务器将数据返回给用户

反向代理

反向代理是服务器的代理
隐藏真实的服务器,使真实服务器对客户端不可见。

流程:

用户发送请求到服务器(实为反向代理服务器)→反向代理服务器发送请求到真实服务器→
真实服务器将数据返回给反向代理服务器→反向代理服务器将数据返回给用户

Logo

更多推荐