Linux——nginx 负载均衡

news2024/11/15 21:49:15

常规的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  未修改的情况下,默认所有节点的权重为1
	server	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: all
  gather_facts: false
  tasks:
    - name: install nginx
      dnf: 
        name: nginx
        state: present
#下载nginx

    - name: start service
      service:
        name: nginx
        state: started
        enabled: 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 page
      debug: 
#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 pool
      template:
#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 group
      when: '"proxyserver" in group_names'
    	

    - name: proxy server config proxy on default virtual server config
      blockinfile:
#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 group
      when: '"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 nodes
      service:
        name: nginx 
        state: reloaded
#重启Nginx服务

- name: test if all function works
  hosts: localhost
  gather_facts: false
#这告诉Ansible不要自动收集关于目标主机的信息(称为“facts”)。
  tasks: 
#这一行标志着任务列表的开始。
    - name: use loop to test
      uri:
#uri模块用于发送HTTP/HTTPS请求到指定的URL,并返回响应。
        url: http://localhost
#它指向http://localhost,意味着将向本地机器上的HTTP服务发送请求。
        return_content: true
#当设置为true时,它会将响应的内容作为任务的输出返回。
      register: reponses
#注册到一个名为reponses的变量中
      loop: [1, 2, 3]

    - name: debug test result
      debug:
#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.coloradmin.cn/o/2086211.html

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

相关文章

音频变声怎么弄?(实测好用)快来试试这6个AI变声工具

音频变声怎么弄?随着短视频平台和社交平台的发展,很多小伙伴们会自己拍摄视频分享到平台上,还有一些视频创作者会制作有趣的视频吸引观众。而视频配音就是锦上添花,很多人觉得自己的声音不好听,想要实现录音音频变声&a…

结合ollama gemma2:2b大模型来实现数据分析系统的智能交互

在最近的人员风险行为分析系统开发过程中,需要解决一个问题:在缺乏GPU资源的情况下,如何提升智能交互能力。​我们探索并研究了集成gemma2:2b模型的可行性,这一举措旨在在有限的硬件条件下,为我们的系统注入更高级别的…

如何理解进程

一、进程的概念 进程:顾名思义,就是一个完整执行程序的过程。没错,就是这么简单,但是在程序执行的过程之中,系统会为这个执行的程序分配内存资源,这些过程也包含在进程当中。 进程是动态的,是程…

css-50 Projects in 50 Days(2)

html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>步骤条</title><link rel"style…

基于混沌麻雀搜索算法的光伏MPPT控制MATLAB仿真

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 模型简介 此模型主要研究光伏系统MPPT控制&#xff0c;通过将麻雀搜索算法引入至MPPT控制策略中&#xff0c;在模型中通过改变光照强度&#xff0c;来验证算法引入的有效性。模型中包含麻雀搜索算法MPPT与混…

单链表——随机链表的复制

深拷贝&#xff0c;就是将原链表彻底的拷贝&#xff0c;当我们观察这个链表时我们会发现&#xff0c;val与next都比较好拷贝&#xff0c;难点就是在random的拷贝&#xff0c;因为我们需要知被拷贝的节点的random指向的是哪个&#xff0c;所以我们很容易想到的方法就是从头遍历链…

从开题到答辩:ChatGPT超全提示词分享!(上)【建议收藏】

在浩瀚的知识领域中&#xff0c;提问的艺术是探索真理的钥匙。在这个信息爆炸的时代&#xff0c;深入探索知识的海洋&#xff0c;不仅需要热情和毅力&#xff0c;更需要正确的方法和工具。学术研究是一个复杂而严谨的过程&#xff0c;涉及从选题、文献综述到研究设计、数据收集…

网络层,数据链路层和应用层

1.网络层 网络层最主要的协议就是IP协议。 下图是IP协议的格式&#xff1a; 1.1 IP协议解析 &#xff08;1&#xff09;4位版本&#xff1a; 有两种&#xff1a;IPV4&#xff08;IP地址4个字节大小&#xff09;和IPV6&#xff08;IP地址16个字节大小&#xff09; &#xf…

推荐系统实战(八)-冷启动(上)

一、冷启动基本描述 &#xff08;一&#xff09;冷启动与新用户新物料 冷启动针对的是对缺少消费记录的新用户、新物料的推荐。 新用户不仅包含初次使用应用的用户&#xff0c;还包含安装很久但是处于低活跃状态的用户。 &#xff08;二&#xff09;部分经典算法无法支持新…

2024年【安全员-C证】新版试题及安全员-C证复审模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年【安全员-C证】新版试题及安全员-C证复审模拟考试&#xff0c;包含安全员-C证新版试题答案和解析及安全员-C证复审模拟考试练习。安全生产模拟考试一点通结合国家安全员-C证考试最新大纲及安全员-C证考试真题汇…

二叉搜索树进阶之红黑树

前言&#xff1a; 在上文我们已经学习了AVL树的相关知识以及涉及的四种旋转的内容&#xff0c;但是AVL树追求平衡导致旋转操作过多&#xff0c;一些情况下影响性能&#xff0c;由此我们就来了解一下二叉搜索树的另外一个分支&#xff0c;红黑树。 &#xff08;倘若对旋转知识…

詹娜奥尔特加看到自己青少年时期露骨AI照片后删除了推特:“这太恶心了”

詹娜奥尔特加看到自己青少年时期露骨AI照片后删除了推特&#xff1a;“这太恶心了” 2024-08-25 23:07 发布于&#xff1a;河北省 21 岁的奥尔特加承认她仍在学习如何保护自己&#xff0c;一种有帮助的方法是“尽可能避免使用手机”。 这位女演员表示&#xff0c;看到“剪…

算法: 双指针

题目&#xff1a;环形链表 题目讲解&#xff1a; 判断环 要判断链表是否有环&#xff0c;可以使用快慢指针的方法。快指针每次走两步&#xff0c;慢指针每次走一步。如果链表有环&#xff0c;快慢指针最终会相遇&#xff1b;如果没有环&#xff0c;快指针会先到达链表末尾。 …

该部署公钥无权限拉代码

从阿里云云效的代码库中执行git pull时报错如下&#xff1a; git pull该部署公钥无权限拉代码 fatal: Could not read from remote repository.Please make sure you have the correct access rights and the repository exists.原因是该代码库在云效上未启用密钥&#xff0c;…

【Material-UI】Select 组件中的 `Auto width`、`Small Size` 和 `Other Props` 详解

文章目录 一、Select 组件概述1. 组件介绍2. Select 组件的基本结构 二、Auto width 属性详解1. Auto width 的作用2. Auto width 属性的基本用法3. Auto width 的实际应用场景 三、Small Size 属性详解1. Small Size 的作用2. Small Size 属性的基本用法3. Small Size 的实际应…

三分钟总结开源流程表单的优势特点

实现流程化办公&#xff0c;可以借助低代码技术平台、开源流程表单的优势特点。作为当前较为理想的平台产品&#xff0c;低代码技术平台凭借够灵活、好操作、可视化界面的优势特点&#xff0c;得到了通信业、医疗、高校等很多行业客户朋友的喜爱与支持。今天一起来看看开源流程…

vue2.0纯前端预览附件方法汇总

vue2.0纯前端预览附件方法汇总 一、使用iframe预览1.使用 Office 在线查看器2.XDOC文档预览服务XDOC官网地址:[https://view.xdocin.com/](https://view.xdocin.com/) 二、vue-office具体效果可以参考: [https://501351981.github.io/vue-office/examples/dist/#/docx](https:/…

linux下使用xargs批量操作

1、创建测试文件&#xff1a; for i in {1..4}; do touch $i.gz; done;2、将所有gz文件重命名为.gz.log2文件 ls | xargs -I {} sh -c mv {} {}.log2 3、将所有.log2文件改回为.gz文件 ls | xargs -I {} sh -c mv {} $(echo {} | sed "s/\.log2//g" ) 4、将所有的…

优先级队列面试题详解

题目链接&#xff1a; . - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/smallest-k-lcci/description/ 解题思路&#x…

新华三H3C HCL配置IS-IS基本配置

实验目标 完成本实验,应该能够达到以下目标。 ●掌握如何在路由器进行单区域IS-IS的基本配置 ●掌握如何在路由器上查看IS-IS路由表、邻居信息 ●掌握如何在路由器上查看IS-IS的LSDB信息 实验拓扑 IP地址表 实验任务 单区域配置&#xff1a; 在本实验任务中,需要在路由器上…