Linux——nginx 负载均衡

常规的web服务器一般提供对于静态资源的访问,比如说:图片、web样式

网站提供的大部分交互功能都需要web编程语言的支持,而web服务对于程序的调用,不管编译型语言还是解释型语言,web服务同将对于应用程序的调用递交给通用网关接口(CGI)。CGI 服务完成对于程序的调用和运行,并将运行结构通过CGI接口返回给web服务,由web服务生成响应报文。

此时在web服务的领域内,引入了LAMP等较为知名的web架构,使web页面提供应用服务成为一种可能,

随着web网站的发展,基本的web服务器容易出现性能瓶颈、响应缓慢等问题,为了解决这些问题,人们尝试通过一些技术手段解决这个问题,这一类技术都属于负载均衡技术,常用于进行负载均衡的服务有:HAProxy、Nginx、lvs等。除此之外,还可以结合dns负载均衡等技术,即一个域名映射多个IP地址等方式。

一、nginx 负载均衡实验

nginx 负载均衡实验过程整理如下:

[root@bogon ~]# systemctl disable --now httpd			// 确保80端口未被httpd 占用
[root@bogon ~]# systemctl start nginx.service 			// 启动nginx 服务
[root@bogon ~]# ps -elf | grep nginx 	
1 S root        5825       1  0  80   0 -  2875 sigsus 14:47 ?        00:00:00 nginx: master process /usr/sbin/nginx
5 S nginx       5826    5825  0  80   0 -  3964 ep_pol 14:47 ?        00:00:00 nginx: worker process
5 S nginx       5827    5825  0  80   0 -  3964 ep_pol 14:47 ?        00:00:00 nginx: worker process
0 S root        5833    2362  0  80   0 - 55417 pipe_r 14:47 pts/0    00:00:00 grep --color=auto nginx
// 恢复成默认的主配置文件,如果之前没有备份,可以使用在/etc/nginx/nginx.default 来恢复,略有不同,影响不大
[root@bogon ~]# cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf_$(date +%s)		//备份当前配置文件
[root@bogon ~]# cp /etc/nginx/nginx.conf_1724661958 /etc/nginx/nginx.conf  // 恢复默认配置0
cp: overwrite '/etc/nginx/nginx.conf'? y
[root@bogon ~]# vim /etc/nginx/nginx.conf			// 暂时无需修改,额外的配置放在conf.d 目录下
[root@bogon ~]# ls /etc/nginx/conf.d/
[root@bogon ~]# vim /etc/nginx/conf.d/real_web.conf   // 这是一个新文件,全部内容如下:
server {listen  81;server_name     web1;root    /usr/share/nginx/real1;index index.html;
}
server {listen  82;server_name     web2;root    /usr/share/nginx/real2;index index.html;
}
server {listen  83;server_name     web3;root    /usr/share/nginx/real3;index index.html;
}[root@bogon ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@bogon ~]# systemctl reload nginx.service 
[root@bogon ~]# ss -anput | grep nginx 
tcp   LISTEN 0      511                   0.0.0.0:81            0.0.0.0:*    users:(("nginx",pid=6045,fd=16),("nginx",pid=6044,fd=16),("nginx",pid=5825,fd=16))
tcp   LISTEN 0      511                   0.0.0.0:80            0.0.0.0:*    users:(("nginx",pid=6045,fd=8),("nginx",pid=6044,fd=8),("nginx",pid=5825,fd=8))   
tcp   LISTEN 0      511                   0.0.0.0:83            0.0.0.0:*    users:(("nginx",pid=6045,fd=18),("nginx",pid=6044,fd=18),("nginx",pid=5825,fd=18))
tcp   LISTEN 0      511                   0.0.0.0:82            0.0.0.0:*    users:(("nginx",pid=6045,fd=17),("nginx",pid=6044,fd=17),("nginx",pid=5825,fd=17))
tcp   LISTEN 0      511                      [::]:80               [::]:*    users:(("nginx",pid=6045,fd=9),("nginx",pid=6044,fd=9),("nginx",pid=5825,fd=9))   
[root@bogon ~]# mkdir /usr/share/nginx/real{1,2,3}
[root@bogon ~]# ls /usr/share/nginx/
html  modules  real1  real2  real3
// 定义81-83 端口的index文件
[root@bogon ~]# echo "81 port real webserver " > /usr/share/nginx/real1/index.html
[root@bogon ~]# echo "82222 port real webserver " > /usr/share/nginx/real2/index.html
[root@bogon ~]# echo "33333 port real webserver " > /usr/share/nginx/real3/index.html
[root@bogon ~]# cat /usr/share/nginx/real1/index.html 
81 port real webserver 
[root@bogon ~]# cat /usr/share/nginx/real2/index.html 
82222 port real webserver 
[root@bogon ~]# cat /usr/share/nginx/real3/index.html 
33333 port real webserver 
// 访问测试
[root@bogon ~]# curl http://127.0.0.1:81
81 port real webserver 
[root@bogon ~]# curl http://127.0.0.1:82
82222 port real webserver 
[root@bogon ~]# curl http://127.0.0.1:83
33333 port real webserver // 定义后端工作池
[root@bogon ~]# vim /etc/nginx/conf.d/work_server.conf		// 新文件
[root@bogon ~]# cat  /etc/nginx/conf.d/work_server.conf
upstream realwebs {server 	127.0.0.1:81;server	127.0.0.1:82;server	127.0.0.1:83;
}
[root@bogon ~]# vim /etc/nginx/nginx.conf

[root@bogon ~]# nginx -t 
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@bogon ~]# systemctl reload nginx 
// 注意这里使用默认的80端口访问,也就是通过80端口访问到了81 82 83 端口的响应内容
[root@bogon ~]# curl http://127.0.0.1
81 port real webserver 
[root@bogon ~]# curl http://127.0.0.1
82222 port real webserver 
[root@bogon ~]# curl http://127.0.0.1
33333 port real webserver 
// 上面展示的负载均衡算法为轮询,在轮询时可以通过权重,让性能更好的节点多处理用户访问
[root@bogon ~]# cat  /etc/nginx/conf.d/work_server.conf
upstream realwebs {server 	127.0.0.1:81  weight=3;   // 设置81端口的权重为3,那么81-83 各个端口实际处理用户访问的比例大概为 3:1:1  未修改的情况下,默认所有节点的权重为1server	127.0.0.1:82;server	127.0.0.1:83;
}[root@bogon ~]# nginx -t 
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@bogon ~]# systemctl reload nginx.service 
[root@bogon ~]# curl http://127.0.0.1
81 port real webserver 
[root@bogon ~]# curl http://127.0.0.1
82222 port real webserver 
[root@bogon ~]# curl http://127.0.0.1
81 port real webserver 
[root@bogon ~]# curl http://127.0.0.1
33333 port real webserver 
[root@bogon ~]# curl http://127.0.0.1
81 port real webserver 
[root@bogon ~]# curl http://127.0.0.1
81 port real webserver 
[root@bogon ~]# curl http://127.0.0.1
82222 port real webserver 
、
除此之外还可以设置nginx负载均衡的算法包括:
1、最少连接数  least_conn;
2、ip 哈希  	ip_hash;
只需要将对应的算法名称单独写入upstream配置块中即可,例如:[root@bogon ~]# cat /etc/nginx/conf.d/work_server.conf
upstream realwebs {least_conn;server 	127.0.0.1:81 weight=3;server	127.0.0.1:82;server	127.0.0.1:83;
}然而上图示例的架构中,在负载均衡也是就标记为前端节点的位置容易发生类似于

二、在ansible编写实验

[root@bogon ansible]# cat ansible.cfg
[defaults]
inventory = ./hosts
host_key_checking = false   
#修改默认值
[root@bogon ansible]# pwd
/root/ansible
[root@bogon ansible]# cat ansible.cfg 
[defaults]
inventory = ./hosts
host_key_checking = false
[root@bogon ansible]# cat hosts 
[realservers]
localhost[proxyserver]
Localhost
#主机清单
[root@bogon ansible]# cat playbook.yml 
- hosts: allgather_facts: falsetasks:- name: install nginxdnf: name: nginxstate: present
#下载nginx- name: start serviceservice:name: nginxstate: startedenabled: true
#开启服务- name: real server config copy:src: files/real_web.conf
#指定了要复制的源文件的路径dest: /etc/nginx/conf.d/real_web.conf
#目标路径# only run on realservers group
#任务仅当远程主机属于realservers组时才会执行when: '"realservers" in group_names'
#用于控制任务是否应该执行,条件表达式检查group_names(一个包含当前主机所属所有组的列表)中是否包含字符串"realservers"。如果包含,则条件为真,任务将执行;如果不包含,则条件为假,任务将被跳过。这确保了只有属于realservers组的主机才会执行这个复制操作。- name: deploy a test pagedebug: 
#debug模块通常用于在Ansible执行过程中输出信息,帮助调试playbook。msg: "this task should be replaced by a test file deploy task" when: "'realservers' in group_names"
#条件表达式检查group_names中是否包含字符串'realservers'- name: proxy server config about wokring pooltemplate:
#template模块用于将模板文件(包含变量和Jinja2模板语法的文件)渲染为实际文件,并将其复制到远程主机上。src: files/work_server.conf
#模板文件位于Ansible控制机的files/work_server.conf目录下。dest: /etc/nginx/conf.d/work_server.conf
#文件将被放置在/etc/nginx/conf.d/work_server.conf# only run proxyserver groupwhen: '"proxyserver" in group_names'- name: proxy server config proxy on default virtual server configblockinfile:
#blockinfile模块用于在指定的文件中插入一个文本块,可以在文件的特定行之前或之后插入,或者如果文本块已存在则不进行任何更改。block: |location / {proxy_pass http://realwebs;}
#block参数后跟了一个多行字符串(由|指示),它是要插入文件的内容。在这个例子中,它是一个Nginx的location块,它将所有对根URL(/)的请求代理到http://realwebs。insertbefore: '^        error_page 404 /404.html;$'
#insertbefore参数指定了插入位置。这意味着新的location块将被添加到这一行之前。path: /etc/nginx/nginx.conf
#path参数指定了要修改的文件的路径,这里是/etc/nginx/nginx.conf,即Nginx的主配置文件。# only run proxyserver groupwhen: '"proxyserver" in group_names'#- include_tasks: proxy_tasks.yml#- when: '"proxyserver" not in group_names'
#将尝试在条件为'"proxyserver" not in group_names'时包含并执行proxy_tasks.yml文件中的任务。- name: restart service on all nodesservice:name: nginx state: reloaded
#重启Nginx服务- name: test if all function workshosts: localhostgather_facts: false
#这告诉Ansible不要自动收集关于目标主机的信息(称为“facts”)。tasks: 
#这一行标志着任务列表的开始。- name: use loop to testuri:
#uri模块用于发送HTTP/HTTPS请求到指定的URL,并返回响应。url: http://localhost
#它指向http://localhost,意味着将向本地机器上的HTTP服务发送请求。return_content: true
#当设置为true时,它会将响应的内容作为任务的输出返回。register: reponses
#注册到一个名为reponses的变量中loop: [1, 2, 3]- name: debug test resultdebug:
#debug模块(在Ansible中)用于输出信息到控制台,通常用于调试目的。它可以显示变量的值或消息,帮助用户了解任务的执行状态和上下文。#var: reponses
#debug模块输出名为reponses的变量的值。msg: "{{ item.content }}"
#msg关键字用于指定debug模块将要显示的消息。
#item.content表示在循环的每次迭代中,都会尝试访问当前item(循环中的元素)的content属性或键的值。loop: "{{ reponses.results }}"
[root@bogon ansible]# cat files/real_web.conf 
server {listen	81;
#监听81端口server_name	web1;
#定义了Nginx服务器块处理的请求应该匹配哪个域名root	/usr/share/nginx/real1;
#Nginx将从/usr/share/nginx/real1目录中查找资源。index index.html;、
#Nginx应该尝试返回哪个文件作为响应。
}
server {listen	82;server_name	web2;root	/usr/share/nginx/real2;index index.html;
}
server {listen	83;server_name	web3;root	/usr/share/nginx/real3;index index.html;
}
[root@bogon ansible]# cat files/work_server.conf 
upstream realwebs {least_conn;server 	127.0.0.1:81 weight=3;server	127.0.0.1:82;server	127.0.0.1:83;}
[root@bogon ansible]# ansible-playbook playbook.yml --ask-pass

因为设置了权重所以三次测试,代理节点并不会依次分发给81到82端口,81端口响应的次数更多,且每一次测试结果不一致

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

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

相关文章

在蓝桥云课ROS中快速搭建Arduino开发环境

普通方式 一步步慢悠悠的搭建和讲解需要5-6分钟: 如何在蓝桥云课ROS中搭建Arduino开发环境 视频时间:6分40秒 高效方式 如何高效率在蓝桥云课ROS中搭建Arduino开发环境 视频时间:1分45秒 配置和上传程序到开发板 上传程序又称为下载程序h…

html+css+js网页设计 婚庆网站8个页面

htmlcssjs网页设计 婚庆网站8个页面 网页作品代码简单,可使用任意HTML编辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作)。 获取源码 1&#xff…

C#骑砍逻辑类Mod制作详细解说

前言: 最近在研究骑砍的mod,主要是想修改其中的逻辑部分,因此有了这篇帖子。 一,文件夹与XML配置 在Modules创建一个新文件夹,文件夹名称随意,不影响实际的读取。 文件夹下面的位置需要固定,因…

闲置物品|基于SprinBoot+vue的校园闲置物品交易平台(源码+数据库+文档)

校园闲置物品交易平台 目录 基于SprinBootvue的校园闲置物品交易平台 一、前言 二、系统设计 三、系统功能设计 5.1系统功能实现 5.2管理员模块实现 5.3用户模块实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xf…

项目:基于TCP的文件传输系统

项目介绍: 模拟FTP原理:客户端连接服务器后,向服务器发送一个文件。文件名可以通过参数指定,服务器端接收客户端传来的文件(文件名随意),如果文件不存在自动创建文件,如果文件存在,…

matlab 相位解缠

目录 一、功能概述1、相位解缠2、主要函数二、代码实现1、螺旋线的正确相位角2、使用不同阈值平移相位角3、将相移应用于矩阵三、参考链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的抄袭狗。 一、功能概述 1、相位解缠 对…

FPGA实现多功能SDI视频采集卡,基于GTX+RIFFA架构,提供2套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的PCIE方案本博已有的 SDI 编解码方案 3、详细设计方案设计框图SDI 输入设备Gv8601a 均衡器GTX 解串与串化SMPTE SD/HD/3G SDI IP核BT1120转RGBFDMA图像缓存RIFFA用户数据控制RIFFA架构详解Xilinx 7 Series Integrated Bloc…

智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序(XGBoost分类器)

智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序(XGBoost分类器) 文章目录 一、基本原理鲸鱼智能优化特征选择流程 二、实验结果三、核心代码四、代码获取五、总结 智能优化特征选择|基于鲸鱼WOA优化算法实现的特征选择研究Matlab程序…

从地图信息实时检测路口的各向通行状况、红绿灯及溢出情况

高德地图、百度地图都能获得实时的道路信息。 C# 编写的路况信息爬虫可获得准实时(1分钟间隔)的路口的各向通行状况、红绿灯及溢出情况。 优势: 投入少,效果好,无需安装设备; 缺陷: 时间间隔…

更新RK3588开发板的rknn_server和librknnrt.so【这篇文章是RKNPU2从入门到实践 --- 【5】的配套文章】

作者使用的平台有: 一台装有Windows系统的宿主机,在该宿主机上装有Ubuntu 20.04虚拟系统; 瑞芯微RK3588开发板,开发板上的系统为Ubuntu22.04系统; 更新板子的 rknn_server 和 librknnrt.so,rknn_server 和…

USART之串口发送+接收应用案例

文章目录 前言一、电路接线图二、应用案例代码三、应用案例分析3.1 USART模块初始化3.1.1 RCC开启时钟3.1.2 GPIO初始化3.1.3 配置USART3.1.4 开启中断、配置NVIC3.1.5 开启USART 3.2 USART串口收发模块3.2.1 Serial_SendByte(发送一个字节数据)3.2.2 US…

【蓝桥杯集训100题】scratch绘制扇子 蓝桥杯scratch比赛专项预测编程题 集训模拟练习题第28题

scratch绘制扇子 蓝桥杯集训100题第28题模拟练习解析 此题曾经作为第十届省赛的真题考过 一、题目要求 以坐标(0,0)点为中心绘制一把扇子;扇面和扇把都是三分之一圆,扇面的半径 为 100 左右,扇把的半径为 20 左右。 编程实现 每次点击绿旗后,舞台背景为白色,…

【自动驾驶】控制算法(六)前馈控制与航向误差

写在前面: 🌟 欢迎光临 清流君 的博客小天地,这里是我分享技术与心得的温馨角落。📝 个人主页:清流君_CSDN博客,期待与您一同探索 移动机器人 领域的无限可能。 🔍 本文系 清流君 原创之作&…

vue按钮弹框

在Vue中实现按钮点击后弹出对话框(弹框)的功能,通常可以使用一些Vue的UI组件库,如Element UI、Vuetify、BootstrapVue等,这些库提供了丰富的组件,包括对话框(Dialog)、模态框&#x…

如何使用Gogs搭建自己的git服务器

最近偶然发现一款轻量级的git服务器,以前一直用的svn server,最近想搞个git服务器, 用gitlab资源占用太多了,gogs是一款轻量级git服务器,非常适合个人使用。 项目地址:GitHub - gogs/gogs: Gogs is a painl…

图书项目要点

一、搭建项目 使用tarojs/cli进行搭建 taro init [项目名] 二、具体页面 页面声明: 在【app.config.ts】中对主页面进行声明:组件页面可以不用声明 pages: ["pages/index/index",pages/user/index,pages/book/index,], tabbar制作&…

三种tcp并发服务器实现程序

都需先进行tcp连接 1、多进程并发 2、多线程并发 3、IO多路复用并发 (1)select (2)epoll 注:select与epoll文件描述符限制的区别是指同时涌入的客户端数量,select最大只能有1024个,epoll可以超…

MSR810配置本地认证的有线802.1X认证

正文共:1567 字 15 图,预估阅读时间:2 分钟 IEEE 802.1X协议又称DOT1X协议,是一种基于端口的网络接入控制协议(Port based network access control protocol),即在局域网接入设备的端口上对所接…

Django 第八课 -- 路由

目录 一. 前言 1.1. Django1.1.x 版本 1.2. Django 2.2.x 之后的版本 二. 正则路径中的分组 2.1. 正则路径中的无名分组 2.2. 正则路径中的有名分组 三. 反向解析 3.1. 普通路径 3.2. 正则路径(无名分组) 3.3. 正则路径(有名分组&a…

代码随想录训练营 Day41打卡 动态规划 part08 121. 买卖股票的最佳时机 122. 买卖股票的最佳时机II 123. 买卖股票的最佳时机III

代码随想录训练营 Day41打卡 动态规划 part08 一、力扣121. 买卖股票的最佳时机 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计…