Nginx的负载均衡

一、概述

Nginx负载均衡是一种通过将客户端请求分发到多个后端服务器的技术,旨在提高系统的吞吐量、可用性和容错性。

二、Nginx负载均衡工作原理

Nginx作为反向代理服务器,接收客户端的请求,并根据配置的负载均衡算法将请求转发到后端服务器。其工作流程如下:

  1. 客户端请求到达Nginx。

  2. Nginx根据配置的负载均衡策略选择后端服务器。

  3. Nginx将请求转发到选定的后端服务器。

  4. 后端服务器处理请求并返回响应。

  5. Nginx将响应返回给客户端。

三、负载均衡可以实现的场景 

3.1、四层负载均衡 

所谓四层负载均衡指的是OSI七层模型中的传输层,那么传输层Nginx已经能够支持TCP/IP的控制,所以只需要对客户端的请求进行TCP/IP协议包的转发就可以实现负载均衡,它的好处就是性能非常快、只需要底层进行应用处理,而不需要一些复杂的逻辑。

3.2、七层负载均衡 

七层负载均衡是在应用层,它可以完成很多方面的协议请求,比如我们所说的http的负载均衡,它可以实现http信息的改写、头信息的改写、安全应用规则控制、URL匹配规则控制,以及转发、rewrite等等的规则。Nginx是一个典型的七层负载均衡SLB。

 3.3、四层负载均衡与七层负载均衡的区别

四层负载均衡数据包在底层就进行了分发,而七层负载均衡数据包要在第七层才进行分发,所以,七层负载均衡的效率没有四层负载均衡效率高。
七层负载就均衡更贴近于服务,http协议就是在七层,我们可以通过Nginx做会话保持,URL路径规则匹配、Head头改写等等,这些都是四层负载均衡无法实现的。
四层负载均衡可以解决七层负载均衡的端口限制问题。
四层负载均衡可以解决七层负载均衡高可用问题。

四、Nginx负载均衡调度算法

调度算法

概述

轮循

按时间顺序逐一分配到不同的后端服务器

Weight(加权轮循)

Weight的值越大,分配到的访问几率就越高

Ip_hash

每个请求按访问的IPhash值结果进行分配,来自同一个IP的客户端会访问固定的服务器

url_hash

按照访问的URLhash值结果进行分配,每个URL定向到同一个后端服务器

Least_conn

最少链接数,哪个服务器链接数少就发给哪个

五、负载均衡后端状态 

状态

概述

down

当前的server不参与负载均衡

backup

预留的备份服务器

Max_fails

允许请求失败的次数

Fail_timeout

经过max_fails失败后,服务暂停时间

Max_conns

限制最大的连接接受数

5.1、down状态 

5.1.1、实验虚拟机配置

服务器:web01 10.0.0.7   172.16.1.7                  #安装Nginx、PHP、MuSQL

服务器:web02 10.0.0.8   172.16.1.8                  #安装Nginx、PHP、MuSQL

负载均衡服务器: lb  10.0.0.6  172.16.1.6           #安装Nginx

5.1.2、在负载均衡服务器上配置服务文件

upstream webs {

        server 172.16.1.7  down;          #表示web01服务器不参与负载均衡服务

        server 172.16.1.8;

server {

       listen 80;

       server_name www.lv.com;

    location / {

       proxy_pass http://webs;

       include proxy_params;

    }

}

5.2、backup状态 

5.2.1实验虚拟机配置

服务器:web01 10.0.0.7   172.16.1.7                  #安装Nginx、PHP、MuSQL

服务器:web02 10.0.0.8   172.16.1.8                  #安装Nginx、PHP、MuSQL

负载均衡服务器: lb  10.0.0.6  172.16.1.6           #安装Nginx

5.2.2、 在负载均衡服务器上配置服务文件

upstream webs {

         server 172.16.1.7  backup;                  #预留的备份服务器

         server 172.16.1.8;

server {

        listen 80;

        server_name www.lv.com;

    location / {

        proxy_pass http://webs;

        include proxy_params;

       }

}

 六、实验演示案例(PhpMyadmin)

6.1、实验虚拟机配置

服务器:web01 10.0.0.7   172.16.1.7                  #安装Nginx、PHP、MuSQL

服务器:web02 10.0.0.8   172.16.1.8                  #安装Nginx、PHP、MuSQL

数据库:mysql  10.0.0.51 172.16.1.51                #安装mariadb-server

负载均衡服务器: lb  10.0.0.6  172.16.1.6           #安装Nginx

6.2、服务器web01配置

6.2.1、安装Nginx服务 

6.2.1.1、配置Nginx官方扩展仓库

 vim /etc/yum.repos.d/nginx.repo

 [nginx-stable]
 name=nginx stable repo
 baseurl=http://nginx.org/packages/centos/7/$basearch/
 gpgcheck=0
 enabled=1
 gpgkey=https://nginx.org/keys/nginx_signing.key
 module_hotfixes=true

6.2.1.2、安装Nginx服务

 yum -y install nginx

 6.2.1.3、创建启动用户www

groupadd -g 666 www

useradd -u666 -g 666 -M -s /sbin/nologin www 

6.2.1.4、修改Nginx配置文件 

vim /etc/nginx/nginx.conf

user  www;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;

6.2.1.5、编辑PhpMyadmin配置文件

 vim /etc/nginx/conf.d/admin.conf

server {

     listen 80;

     server_name www.admin.com;

     root /app/admin;

  location / {

     index index.html index.php;

   }

  location ~ \.php$ {

    fastcgi_pass 127.0.0.1:9000;

    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

    include fastcgi_params;

   }

}

6.2.1.6、检查配置文件语法正确性 

nginx -t 

6.2.1.7、启动Nginx并加入开机自启动 

systemctl  start nginx

systemctl enable nginx 

6.2.1.8、创建PhpMyadmin代码目录

 mkdir -p /app/admin

6.2.1.9、将PhpMyadmin代码拷贝到PhpMyadmin代码目录

lz /app/phpMyAdmin-5.2.1-all-languages.zip

 6.2.1.10、解压PhpMyadmin代码

tar zxf phpMyAdmin-5.2.1-all-languages.zip

 6.2.1.10、将PhpMyadmin目录下的代码移到/app/admin

mv /app/admin/phpMyAdmin-5.2.1-all-languages/*  /app/admin/

6.2.2、安装PHP服务 

6.2.2.1、安装PHP应用软件组 

yum -y install php php-bcmath php-cli php-common php-devel php-embedded php-fpm php-gd php-intl php-mbstring php-mysqlnd php-opcache php-pdo php-process php-xml php-json 

6.2.2.2、修改PHP配置文件 

vim /etc/php-fpm.d/www.conf

同步启动用户与Nginx保持一致 www用户
       24:user = www
       26:group = www
修改监听方式
       38:listen = 127.0.0.1:9000

 6.2.2.3、启动PHP服务并加入开机自启动

systemctl start php-fpm

syatemctl enable php-fpm

6.3、在mysql服务器上安装mariadb服务 

6.3.1 、安装mariadb

yum -y install mariadb-server 

6.3.2、开启数据库并加入开机自启动 

systemctl start mariadb

systemctl enable mariadb 

6.3.3、创建数据库登录秘密 

mysqladmin password 'lyx123.com' 

 6.3.4、登录数据库

mysql -uroot -plyx123.com 

6.3.5、创建数据库远程登录用户 

grant all on *.* to lyx@'%' identified by 'lyx123.com';

6.3.6、创建admin数据库 

create database admin; 

6.3.7、检查数据库 

show databases; 

 6.4、本地hosts解析

10.0.0.7  www.admin.com 

6.5、浏览器访问 

6.6、服务器web02配置 

6.6.1、安装Nginx服务与PHP服务同web01服务器一样
6.6.2、创建代码目录文件 

mkdir -p /app/admin 

6.6.3、同步web01的admin代码到web02下 (当前在web02服务器/app/admin)

rsync -avz --delete root@10.0.0.7:/app/admin/*   ./

6.7、本地hosts解析 

10.0.0.8 www.admin.com 

6.9、浏览器访问 

6.10、在mysql服务器安装会话保持

 6.10.1、安装redis服务

yum -y install redis 

6.10.2、 配置redis的监听端口

vim /etc/redis/redis.conf

75:bind 127.0.0.1 172.16.1.51

6.10.3、启动redis服务并加入开机自启动

systemctl start redis

systemctl enable redis 

6.10.4、查看登录 

redis -cli

127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> quit 

6.11、将两台web服务写入到redis (两台服务器都做如下操作)

6.11.1、安装redis插件 

yum -y install  gcc glibc gcc-c++ pcre-devel openssl-devel patch

6.11.2、下载redis源码包到/root

 wget http://pecl.php.net/get/redis-4.0.1.tgz

6.11.3、在/root目录下解压redis源码包 

tar zxf  redis-4.0.1.tgz

6.11.4、配置初始化 

cd  redis-4.0.1

phpize

./configure

6.11.5、编译安装 

make && make install 

6.11.6、开启redis插件功能 

vim /etc/php.ini

1357:extension=redis.so     #添加此内容

1222:session.save_handler = redis
1255:session.save_path = "tcp://172.16.1.51:6379"

6.11.7、修改 配置文件

vim /etc/php-fpm.d/www.conf

;php_value[session.save_handler] = files
;php_value[session.save_path]    = /var/lib/php/session
php_value[soap.wsdl_cache_dir]  = /var/lib/php/wsdlcache
;php_value[opcache.file_cache]  = /var/lib/php/opcache

6.11.8、重启PHP服务 

systemctl restart php-fpm 

6.12、搭建负载均衡 

6.12.1、 负载均衡服务器配置Nginx官方仓库

 vim /etc/yum.repos.d/nginx.repo

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

6.12.2、安装Nginx服务 

yum -y install nginx 

6.12.3、编辑负载均衡配置文件 

vim /etc/nginx/conf.d/lb.conf

upstream lb {

       server 172.16.1.7:80;

       server 172.16.1.8:80;

server {

      listen 80;

      server_ name www.admin.com;

  location / {

      proxy_pass http://lb;

      proxy_set_header HOST $host;

      proxy_buffers 256 4k;                        
      proxy_max_temp_file_size 0k;
      proxy_connect_timeout 60;                  
      proxy_send_timeout 60;                   
      proxy_read_timeout 60;                     
      proxy_next_upstream error timeout invalid_header http_502 http_500 http_503 http_504;
      proxy_set_header X-Forwarded-For $proxy_add__x_forwarded_for;

}

}

6.12.4、启动Nginx并加入开机自启动 

systemctl start nginx

systemctl enable nginx 

6.13、本地hosts解析 

10.0.0.6    www.admin.com 

6.14、浏览器访问测试 

七、总结

通过合理配置负载均衡策略,Nginx能够有效提升系统性能、容错能力和扩展性,是现代互联网架构中不可或缺的一部分。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/8099.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Python和Qt6创建GUI应用程序---GUI的一个非常简短的历史

GUI的一个非常简短的历史 图形用户界面有着悠久而可敬的历史,可以追溯到20世纪60年代。斯坦福大学的NLS(在线系统)引入了鼠标和Windows概念于1968年首次公开展示。接下来是施乐PARC的Smalltalk系统GUI 1973,这是最现代的基础通用g…

如何建设一个企业级的数据湖

建设一个企业级的数据湖是一项复杂且系统化的工程,需要从需求分析、技术选型、架构设计到实施运维等多个方面进行综合规划和实施。以下是基于我搜索到的资料,详细阐述如何建设企业级数据湖的步骤和关键要点: 一、需求分析与规划 明确业务需…

xxl-job分布式定时任务

1 前言 1.1 业务场景 业务数据同步 ( 线上数据同步到线下,新平台老平台数据的同步 ) ,消息通知,业务数据的补偿。 1.2 什么是定时任务 定时任务是指基于给定的时间点,给定的时间间隔或者给定执行次数自动的执行程序。 任务调度…

FLTK - FLTK1.4.1 - demo - adjuster.exe

文章目录 FLTK - FLTK1.4.1 - demo - adjuster.exe概述笔记根据代码,用fluid重建一个adjuster.fl 备注 - fluid生成的代码作为参考代码好了修改后可用的代码END FLTK - FLTK1.4.1 - demo - adjuster.exe 概述 想过一遍 FLTK1.4.1的demo和测试工程,工程…

Cursor的简单使用

目录 一、下载与配置 1.1、下载 1.2、汉化 1.3、模型选择 1.4、规则设置 二、Chat(聊天)和Composer(编写助手) 三、快捷键 3.1、tab(代码自动补全) 3.2、CtrlL、CtrlI 3.3、系列 3.4、预防、检测、回滚 四、无限登录 …

剥离情绪的内耗

情绪的内耗,指的是我们内心对于某些情绪的过度反应、反复纠结,或者对情感的压抑所产生的心理消耗。这种内耗通常会让我们感到疲惫、焦虑、无力,甚至影响到我们的行为和决策。要真正剥离情绪的内耗,核心在于如何认识、接受并合理处…

android的gradle

资料: GitHub - ChenSWD/CopyGradleInAction: 备份《Gradle IN Action》书中的源码,添加了部分注释 //github上一个开源项目,外加pdf书 Gradle User Manual gradle官网 讲的挺好的博客 Gradle之重新认识Gradle(项目结构、命令行、tas…

Python 之 Excel 表格常用操作

示例文件 test.xlsx 将各个表单拆分成单独的 Excel 文件 import os.pathimport openpyxl import pandasdef handle_excel(file_path):dirname os.path.dirname(file_path)basename os.path.basename(file_path).split(".")[0]wb openpyxl.load_workbook(file_pat…

【C语言系列】深入理解指针(4)

深入理解指针(4) 一、回调函数是什么?二、qsort使用举例2.1使用qsort函数排序整型数据2.2使用qsort排序结构数据 三、qsort函数的模拟实现四、总结 一、回调函数是什么? 回调函数就是一个通过函数指针调用的函数。 如果你把函数的…

计算机网络 (56)交互式音频/视频

一、定义与特点 定义:交互式音频/视频是指用户使用互联网和其他人进行实时交互式通信的技术,包括语音、视频图像等多媒体实时通信。 特点: 实时性:音频和视频数据是实时传输和播放的,用户之间可以进行即时的交流。交互…

FFmpeg 头文件完美翻译之 libavcodec 模块

前言 众所周知,FFmpeg 的代码开发上手难度较高,源于官方提供的文档很少有包含代码教程相关的。要想熟练掌握 FFmpeg 的代码库开发,需要借助它的头文件,FFmpeg 把很多代码库教程都写在头文件里面。因此,熟读头文件的内…

组件框架漏洞

一.基础概念 1.组件 定义:组件是软件开发中具有特定功能或特性的可重用部件或模块,能独立使用或集成到更大系统。 类型 前端 UI 组件:像按钮、下拉菜单、导航栏等,负责构建用户界面,提升用户交互体验。例如在电商 AP…

【C++图论】1761. 一个图中连通三元组的最小度数|2005

本文涉及知识点 C图论 LeetCode1761. 一个图中连通三元组的最小度数 给你一个无向图,整数 n 表示图中节点的数目,edges 数组表示图中的边,其中 edges[i] [ui, vi] ,表示 ui 和 vi 之间有一条无向边。 一个 连通三元组 指的是 …

C语言编译过程全面解析

今天是2025年1月26日,农历腊月二十七,一个距离新春佳节仅一步之遥的日子。城市的喧嚣中,年味已悄然弥漫——能在这个时候坚持上班的人,真可称为“牛人”了吧,哈哈。。。。 此刻,我在重新审视那些曾被遗忘的…

【橘子Kibana】Kibana的分析能力Analytics简易分析

一、kibana是啥,能干嘛 我们经常会用es来实现一些关于检索,关于分析的业务。但是es本身并没有UI,我们只能通过调用api来完成一些能力。而kibana就是他的一个外置UI,你完全可以这么理解。 当我们进入kibana的主页的时候你可以看到这样的布局。…

生信软件管家——conda vs pip

pip vs conda: 安装过python包的人自然两种管理软件都用过, Pip install和Conda install在Python环境中用于安装第三方库和软件包,但它们在多个方面存在显著的区别 总的来说: pip是包管理软件,conda既是包管理软件&…

代码随想录——二叉树(二)

文章目录 前言二叉树最大深度二叉树的最小深度翻转二叉树对称二叉树完全二叉树的节点个数平衡二叉树二叉树的所有路径左叶子之和找左下角的值路径总和从中序与后序序列构造二叉树最大二叉树合并二叉树二叉搜索树中的搜索验证二叉搜索树二叉搜索树的最小绝对差二叉树中的众数二叉…

深入剖析 Adam 优化器:原理、优势与应用

在深度学习领域,优化器的选择对模型的训练效率和性能起着决定性作用。Adam优化器作为一种自适应优化算法,凭借其根据历史梯度信息动态调整学习率的特性,备受研究者和工程师的青睐。它巧妙融合了RMSProp和Momentum两种优化算法的理念&#xff…

Mybatis入门

Mybatis入门 一、mybatis的快速入门 1、创建springboot项目 直接选择必须的依赖:MyBatis Framework和MySQL Driver在项目下创建pojo包,用来存放数据库表对应的实体类 2、配置连接信息 在springboot项目的配置文件中application.properties写入一下信…

消息队列篇--通信协议篇--MQTT(通配式主题,消息服务质量Qos,EMQX的Broker,MqttClient示例,MQTT报文等)

MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息协议。它基于发布/订阅模式,专为低带宽、高延迟或不可靠网络设计。它主要用于物联网(IoT)设备之间的通信,但也广泛应用于其他需要高效消息传递…