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.rhkb.cn/news/411824.html

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

相关文章

路别走窄了,华为认证的这些方向,比数通值钱

华为认证作为全球领先的ICT技术认证之一,以其高标准和权威性在全球范围内受到认可。它不仅代表了专业技能的国际水平,更是IT专业人士职业生涯中的重要里程碑。但谈论起华为认证,似乎大家都默认首选数通。 不止在华为认证,而是在整…

Vue使用v-model收集各种表单数据、过滤器

目录 1. 使用v-model收集各种表单数据2. 日期格式化3. 过滤器 1. 使用v-model收集各种表单数据 若<input type“text”/>&#xff0c;则v-model收集的是value值&#xff0c;用户输入的就是value值若<input type“radio”/>&#xff0c;则v-model收集的是value值&a…

H5开发有哪些技巧?

随着现代社会的飞速发展&#xff0c;网页开发已经从传统的HTML、CSS、JavaScript往H5发展。H5也称为HTML5&#xff0c;可以理解为是HTML的升级版&#xff0c;具有更加优秀的性能、更加完善的功能和更加多样的体验。因其灵活性和跨平台特性&#xff0c;成为了各类移动应用和网页…

R语言报错 | object ‘integral‘ not found whilst loading name

1、报错背景 Registered S3 method overwritten by htmlwidgets:method from print.htmlwidget tools:rstudio Error: package or namespace load failed for ‘Seurat’:object integral not found whilst loading namespace spatstat.core 当我想library&…

sheng的学习笔记-AI-半监督学习

AI目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 基础知识 什么是半监督学习 我们在丰收季节来到瓜田&#xff0c;满地都是西瓜&#xff0c;瓜农抱来三四个瓜说这都是好瓜&#xff0c;然后再指着地里的五六个瓜说这些还不好&#xff0c;还需再生长若干天。基于这些信息&a…

【Qt CMake】Qt5Widgets.dll:-1: error: LNK1107: 文件无效或损坏: 无法在 0x308 处读取

项目场景&#xff1a; CMake 编译QT 工程 编译报错 E:\tool\Qt5.15.2\5.15.2\msvc2019_64\bin\Qt5Widgets.dll&#x1f44e; error: LNK1107: 文件无效或损坏: 无法在 0x308 处读取 问题描述 Cmkae 报错&#xff1a; E:\tool\Qt5.15.2\5.15.2\msvc2019_64\bin\Qt5Widgets.dll…

Linux 数据结构 链表

1.段错误调试方法&#xff1a; 1.按照网上的方法配置Ubuntu&#xff0c;允许生成core文件 2.重新编译代码并加入-g选项(允许进行GDB调试) 3.ulimit -c unlimited 不限制core文件的生成的大小 4.执行代码,复现段错误,产生包含出错信息的core文件(检查cor…

Android UI绘制原理:UI的绘制流程是怎么样呢?为什么子线程不能刷新UI呢?讲解大体的流程是怎么样的

目录&#xff1a; 一、 为什么要学习android UI绘制原理呢&#xff1f;对我们有什么帮助&#xff1f; 1.解决复杂布局问题&#xff1a;了解UI绘制原理可以帮助我们更好地理解和解决布局问题&#xff0c;比如使用自定义View、优化布局层级等。 2.知道何时触发布局&#xff08;…

redis面试(二十五)CountDownLatch实现

CountDownLatch最基本的原理&#xff0c;就是用来阻塞线程的&#xff0c;java本身也有CountDownLatch&#xff0c;用多线程处理分批处理多数据的时候很有用 基本的逻辑就是&#xff0c;同时开多个子线程&#xff0c;然后主线程进入等待&#xff0c;只有当其他子线程全都结束之…

JAVA后端框架【spring】--超详解

什么是spring? spring是一个轻量级的ioc和Aop的一站式java开发框架&#xff0c;简化企业级开发 轻量级&#xff1a;框架体积小&#xff08;核心模块&#xff09; IOC IOC:inversion of control 控制反转 把创建对象的控制权反转给spring框架 AOP Aop:面向切面编程 将程…

pnpm 查看库的所有版本

1、最近在做图布局的时候&#xff0c;发现默认版本是beta版 2、那么我们如何来查看远程库中有什么版本可以安装呢&#xff1f; 3、使用命令&#xff1a; pnpm view antv/layout versions pnpm view 这里替换成要查看的库名 versions

Android APP 常见概念与 adb 命令

adb 的概念 adb 即 Android Debug Bridge 。在窗口输入 adb 即可显示帮助文档。adb 实际上就是在后台开启一个 server&#xff0c;会接收 adb 的命令然后帮助管理&#xff0c;控制&#xff0c;查看设备的状态、信息等&#xff0c;是开发、测试 Android 相关程序的最常用手段。…

Jenkins安装使用详解,jenkins实现企业级CICD流程

文章目录 一、资料1、官方文档 二、环境准备1、安装jdk172、安装maven3、安装git4、安装gitlab5、准备我们的springboot项目6、安装jenkins7、安装docker8、安装k8s&#xff08;可选&#xff0c;部署节点&#xff09;9、安装Harbor10、准备带有jdk环境的基础镜像 三、jenkins实…

addroutes和next()导致的页面无法跳转问题,如登录之后无法跳转到首页,无法重定向,使用next(to)

版本 vue router 3 问题说明 登录成功后&#xff0c;想重定向到/index&#xff0c;执行router.push之后进入beforeEach&#xff1b; 由于第一次访问&#xff0c;判断用户信息为空&#xff0c;需要异步拉取用户的权限等信息&#xff0c; 获得响应后&#xff0c;使用addRoutes批…

harbor部署+docker-compose

harbor部署 harbor介绍 Harbor 是一个开源的企业级容器镜像仓库&#xff0c;用于存储和分发 Docker 镜像及其他容器格式的镜像。 Harbor 提供了一个集中化的存储库&#xff0c;方便团队成员共享和管理容器镜像。你可以将构建好的镜像推送到 Harbor 仓库中&#xff0c;其他成…

用python启动nacos和redis

import subprocess import tkinter as tk from tkinter import ttk, messagebox from subprocess import Popen, run, PIPE# 启动Nacos的函数 def start_nacos():startup_cmd_path rD:\environment\code-software\nacos-server-1.4.1\nacos\bin\startup.cmd# 异步启动NacosPop…

Python 和 PyCharm 安装(傻瓜式)

为什么要安装Python&#xff1f; 当我们写 python 代码的时候&#xff0c;需要有环境的支持&#xff0c;才可以运行代码。而 python 的安装支持了两个主要部分&#xff0c;分别是解释器和标准库。当我们安装完成&#xff0c;就可以使用python里面的标准库来写代码&#xff0c;而…

Nginx - 反向代理、缓存详解

概述 本篇博客对配置Nginx的第二篇&#xff0c;主要介绍Nginx设置反向代理、缓存、和负载均衡三个知识点&#xff0c;在之前的生产实践中遇到的问题进行归纳和总结&#xff0c;分享出来&#xff0c;以方便同学们有更好的成长。 Nginx 核心参数配置 在写Nginx反向代理时&…

Kafka的Offset(偏移量)详解

Kafka的Offset详解 1、生产者Offset2、消费者Offset2.1、消费者2.2、生产者2.3、实体类对象2.4、JSON工具类2.5、项目配置文件2.6、测试类2.7、测试2.8、总结 1、生产者Offset 2、消费者Offset 2.1、消费者 package com.power.consumer;import org.apache.kafka.clients.consu…

nexus 清理 docker 镜像

下载配置 nexus-cli 看网上文档都用如下地址&#xff0c;但现在已经不能下载&#xff1a; wget https://s3.eu-west-2.amazonaws.com/nexus-cli/1.0.0-beta/linux/nexus-cli chmod x nexus-cli 在 github 上下载&#xff1a; wget https://github.com/heyonggs/nexus-cli/r…