编译安装Nginx和使用五种算法实现Nginx反向代理负载均衡

目录

Ubuntu中安装Nginx

概念介绍

负载均衡

几种负载均衡算法

反向代理

环境规划

配置反向代理

加权负载均衡(Weighted Load Balancing)

轮询(Round Robin)

IP 哈希(IP Hash)

最少连接(Least Connections)

URL 哈希(URL Hash)


 

想要安装nginx,首先我们需要有一台Ubuntu的虚拟机,然后最好在没有安装前做一个快照,防止出错可以快速恢复到没有安装前的状态

Ubuntu中安装Nginx

(1)安装依赖库

sudo apt install libgd-dev

(2)下载nginx的源码包

wget http://nginx.org/download/nginx-1.22.1.tar.gz

(3)解压该压缩包

tar -zvxf nginx-1.22.1.tar.gz

(4)进入到解压完成的nginx目录中,进行编译安装

cd nginx-1.22.1

(5)编译并指定安装位置,执行安装之后会创建指定文件夹/www/nginx

但是这编译却有很多的文件找不到,并且报错说没有prce库,PCRE库支持正则表达式。如果我们在配置文件nginx.conf中使用了正则表达式,那么在编译Nginx时就必须把PCRE库编译进Nginx,因为Nginx的HTTP模块需要靠它来解析正则表达式。

fc8b628ef466412faa88e53896aef95b.png

可以使用下载libpcre3和libpcre3-dev的方法来解决:

sudo apt update
sudo apt install libpcre3 libpcre3-dev

(6)编译完成后进行安装

make && make install

安装完成后,移动到/www/nginx目录下就可以看到几个文件了

349c231533dc470097369c6cb378da5b.png

conf/ - 这个目录包含Nginx的配置文件,用于配置服务器的行为,包括虚拟主机配置、代理设置等。

html/ - 这个目录通常包含Nginx服务器的网页文件,也就是网站的内容文件,比如HTML、CSS、JavaScript文件等。

logs/ - 这个目录包含Nginx服务器的日志文件,记录了服务器的活动、访问日志、错误日志等。

sbin/ - 这个目录包含Nginx服务器的可执行文件,是服务器的主要执行文件,用于启动、停止、重载服务器等操作。

(7)使用

启动Nginx:

sbin/nginx

除了启动还有一些常用的命令:

nginx -s reload	修改配置后重新加载生效
nginx -s stop	快速停止nginx
nginx -s start	启动nginx
nginx -s quit	完整有序的停止nginx
nginx -v	查看nginx的版本
nginx -V	查看版本和nginx的配置选项
nginx -t -c /path/to/nginx.conf	测试nginx配置文件是否正确
nginx -s reopen	重新打开日志文件

启动完成后可以在浏览器中输入Ubuntu机器的ipd地址,检查是否成功运行:
f00839dfbaa64ce1ababc687798c4c00.png

可以看到是正常运行的 

概念介绍

因为需要配置反向代理实现负载均衡,这里需要先知道一下反向代理和负载均衡分别都是什么

负载均衡

当一个网站需要多台服务器时,通常会部署负载均衡器,因为请求量太大,单台服务器无法进行高效处理。部署多台服务器还有助于消除单点故障,从而提高网站的可靠性。

几种负载均衡算法

  • 1.轮询 每个请求按照时间顺序逐一分配到下游的服务节点,如果其中某一节点故障,nginx 会自动剔除故障系统使用户使用不受影响。

  • 2.加权负载均衡 在配置文件中对下游的服务节点指定权重值 weight, weight 值越大则被分配的评率越高,一般这种负载均衡,用于节点的配置情况不一样,有的可能配置高,有的配置低。

  • 3.ip hash 对每个请求,针对 ip 进行 hash, 然后分配到后台节点,这样一来,同一 ip 会被固定分配到下游固定服务上。它能够暂时的解决集群环境中容器之间 session 共享的问题(因为session每次只能和一个人,一对一的记录,但是如果现在需要负载均衡就出现了一种一对多的情况,可以使用ip_hash实现一对一),但是不是解决的根本之道,只是权宜之策,我们试想,如果访问的好好的,家里的路由器被重启了,或者运营商分配给你的 ip 地址改变了,那么你再次访问的时候,新的 ip 就可能被分配到新的服务上,之前的 session 也就失效了。

  • 4.least_conn (最少连接调度算法) 最少连接调度算法,对下游服务中连接情况,优先选择连接数最少的服务分配。

  • 5.url_hash按访问的URL的哈希结果来分配请求,使每个URL定向到一台后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身不支持url_hash,如果需要这种调度算法,则必须安装Nginx的hash软件包。

反向代理

反向代理接受来自客户端的请求,将其转发到可完成该请求的服务器,并将服务器的响应返回给客户端。

环境规划

了解了负载均衡和反向代理都是什么后那么现在开始来进行演示,这里需要使用反向代理实现负载均衡最少需要三台设备,这里我的计划是这样的:

centos1(192.168.159.200):作为web服务器

Ubuntu(192.168.159.202):作为负载均衡服务器1号

centos2(192.168.159.201):作为负载均衡服务器2号

画一张图来演示一下:
 75271805ac4b4ae3a24ef37365331f9b.png

首先来测试一下两个服务器的nginx页面是否可以成功访问

centos2:

c88656bc527c407c95ff866272aad775.png

Ubuntu:

e4dc824404724c868738de08c98b9441.png

可以看到这里的两台设备都是可以正常访问的

配置反向代理

现在我们就可以在centos1上配置反向代理了

加权负载均衡(Weighted Load Balancing)

(1)首先进入到对应的安装nginx的目录的conf目录下:

cd /etc/nginx/

(2)编辑配置文件:

vim nginx.conf
upstream nginx_boot{
# 30s内检查心跳发送两次包,未回复就代表该机器宕机,请求分发权重比为1:2   
server 192.168.159.201 weight=100 max_fails=2 fail_timeout=30s;
server 192.168.159.202 weight=100 max_fails=2 fail_timeout=30s;
# 这里的IP请配置成你WEB服务所在的机器IP
}
server {listen  80;server_name 192.168.159.200;location / {root   html;        # 配置一下index的地址,最后加上index.ftl。        index  index.html index.htm index.jsp index.ftl;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# 请求交给名为nginx_boot的upstream上        proxy_pass http://nginx_boot;}location ~ .*.(gif|jpg|jpeg|bmp|png|ico|txt|js|css){root   /usr/local/nginx/html/static;expires 7d;}
}

(2)修改完成后一定要重新启动nginx服务

systemctl restart nginx.service 

(3)然后我们就可以在浏览器中再次访问192.168.159.200

第一次:

d0d63009be8d4ed69295a84ea50304e0.png

第二次:

762cada0936245a6950bec5a07eb554f.png

可以从上面两次访问的结果看到,这里的反向代理已经实现了。我们第一次访问192.168.159.200(centos1)流量被转发到centos2(192.168.159.201)上,然后第二次访问流量被转发到了ubuntu(192.168.159.202)上,成功的实现了负载均衡。

这里是使用的权重的方式来实现的,上面的例子中,我将两台设备的权重均设置为100,所以,都是每次刷新都会换另外一个设备相应,在实际应用中是可以根据服务器的性能和流量大小来更加灵活的设置权重。

后面再来分别演示一下轮询算法和ip-hash算法的实现效果

轮询(Round Robin)

首先介绍一下轮询算法:每个请求按照时间顺序逐一分配到下游的服务节点,如果其中某一节点故障,nginx 会自动剔除故障系统使用户使用不受影响。

轮询算法的配置非常的简单,甚至比权重算法都简单,只需要在web服务器的nginx配置文件中将每个ip后的weight去掉即可

修改后的配置文件:

upstream nginx_boot{
# 30s内检查心跳发送两次包,未回复就代表该机器宕机,请求分发权重比为1:2   
server 192.168.159.201  max_fails=2 fail_timeout=30s;
server 192.168.159.202  max_fails=2 fail_timeout=30s;
# 这里的IP请配置成你WEB服务所在的机器IP
}
server {listen  80;server_name 192.168.159.200;location / {root   html;        # 配置一下index的地址,最后加上index.ftl。        index  index.html index.htm index.jsp index.ftl;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# 请求交给名为nginx_boot的upstream上        proxy_pass http://nginx_boot;}location ~ .*.(gif|jpg|jpeg|bmp|png|ico|txt|js|css){root   /usr/local/nginx/html/static;expires 7d;}
}

可以再次访问一下:

第一次:

7cc9476599c241569b8fdad61580f295.png

第二次: 

6177b1f6321248caaf9a1c1d9c9172fd.png

可以看到还是两次访问,分被将流量分到了两个设备个一次,这也就是轮询,一人一次

IP 哈希(IP Hash)

对每个请求,针对 ip 进行 hash, 然后分配到后台节点,这样一来,同一 ip 会被固定分配到下游固定服务上。

比如说我现在就要每次都让访问centos1(192.168.159.200)的流量只分配到centos2(192.168.159.201)上,不去ubuntu,当然在本例中只有两台负载均衡设备,可以直接关闭一台达到同样的效果,但是实际应用中我想不会这么简单,这里还是修改nginx配置文件为:

upstream nginx_boot{
ip_hash;
# 30s内检查心跳发送两次包,未回复就代表该机器宕机,请求分发权重比为1:2   
server 192.168.159.201 weight=100 max_fails=2 fail_timeout=30s;
server 192.168.159.202 weight=100 max_fails=2 fail_timeout=30s;
# 这里的IP请配置成你WEB服务所在的机器IP
}
server {listen  80;server_name 192.168.159.200;location / {root   html;        # 配置一下index的地址,最后加上index.ftl。        index  index.html index.htm index.jsp index.ftl;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# 请求交给名为nginx_boot的upstream上        proxy_pass http://nginx_boot;}location ~ .*.(gif|jpg|jpeg|bmp|png|ico|txt|js|css){root   /usr/local/nginx/html/static;expires 7d;}
}

b59f36ec26ac4efa921f79f1dc515040.png

这样我们无论刷新页面多少次,响应的始终都是Ubuntu(192.168.159.202)这台设备响应

最少连接(Least Connections)

最少连接调度算法,对下游服务中连接情况,优先选择连接数最少的服务分配。使用最少连接策略可以避免出现某些服务器负载过重的情况。

最少连接的算法将配置文件修改为:

upstream nginx_boot{
least_conn;
# 30s内检查心跳发送两次包,未回复就代表该机器宕机,请求分发权重比为1:2   
server 192.168.159.201 weight=100 max_fails=2 fail_timeout=30s;
server 192.168.159.202 weight=100 max_fails=2 fail_timeout=30s;
# 这里的IP请配置成你WEB服务所在的机器IP
}
server {listen  80;server_name 192.168.159.200;location / {root   html;        # 配置一下index的地址,最后加上index.ftl。        index  index.html index.htm index.jsp index.ftl;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# 请求交给名为nginx_boot的upstream上        proxy_pass http://nginx_boot;}location ~ .*.(gif|jpg|jpeg|bmp|png|ico|txt|js|css){root   /usr/local/nginx/html/static;expires 7d;}
}

这样配置后根据least_conn 策略将会我们请求的分配到连接数最少的服务器上。但是这里我们只有三台设备无法演示连接最少的环境,就不演示了。

URL 哈希(URL Hash)

url_hash按访问的URL的哈希结果来分配请求,使每个URL定向到一台后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身不支持url_hash,如果需要这种调度算法,则必须安装Nginx的hash软件包。

该策略的配置如下:

upstream nginx_boot{
hash $request_uri;
# 30s内检查心跳发送两次包,未回复就代表该机器宕机,请求分发权重比为1:2   
server 192.168.159.201 weight=100 max_fails=2 fail_timeout=30s;
server 192.168.159.202 weight=100 max_fails=2 fail_timeout=30s;
# 这里的IP请配置成你WEB服务所在的机器IP
}
server {listen  80;server_name 192.168.159.200;location / {root   html;        # 配置一下index的地址,最后加上index.ftl。        index  index.html index.htm index.jsp index.ftl;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# 请求交给名为nginx_boot的upstream上        proxy_pass http://nginx_boot;}location ~ .*.(gif|jpg|jpeg|bmp|png|ico|txt|js|css){root   /usr/local/nginx/html/static;expires 7d;}
}

 在配置文件中hash指令将哈希算法设置为URL哈希,$request_uri表示使用请求的URL作为哈希值。因为需要安装相应的软件包和环境不满足,这里也就不再演示了

到此,Ubuntu下安装nginx和使用五种算法实现nginx反向代理负载均衡就完成了(^▽^)

 

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

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

相关文章

多维时序 | Matlab实现EVO-TCN-Multihead-Attention能量谷算法优化时间卷积网络结合多头注意力机制多变量时间序列预测

多维时序 | Matlab实现EVO-TCN-Multihead-Attention能量谷算法优化时间卷积网络结合多头注意力机制多变量时间序列预测 目录 多维时序 | Matlab实现EVO-TCN-Multihead-Attention能量谷算法优化时间卷积网络结合多头注意力机制多变量时间序列预测效果一览基本介绍程序设计参考资…

Spring5系列学习文章分享---第四篇(JdbcTemplate+概念配置+增删改查数据+批量操作 )

目录 JdbcTemplateJdbcTemplate(概念和准备)JdbcTemplate 操作数据库(新增update)JdbcTemplate 操作数据库(修改和删除update)JdbcTemplate 操作数据库(查询返回某个值queryForObject&#xff0…

shopee的AI学习之路——GPTs通过AdInteli 广告变现

GPTs|AdInteli 广告变现 一、什么是 AdInteli AdIntelli 是一个旨在为生成 GPTs 接入广告并实现变现的平台。它连接了全球最大的广告联盟,允许广告商进行竞价,确保展示最有价值的广告。AdIntelli 采用 AI 驱动的收入生成技术,优化广告选择。…

安卓MediaRecorder(4)视频采集编码写入详细源码分析

文章目录 前言视频采集视频编码视频编码写入结语 本文首发地址 https://blog.csdn.net/CSqingchen/article/details/134896821 最新更新地址 https://gitee.com/chenjim/chenjimblog 前言 通过 文2 我们知道了 MediaRecorder 各个接口 Framework 中的实现。 通过 文3 我们 知道…

<网络安全>《5 网络安全产品之网关》

1 基础概念 网关(Gateway)又称网间连接器、协议转换器。 网关在网络层以上实现网络互连,是复杂的网络互连设备,仅用于两个高层协议不同的网络互连。 网关既可以用于广域网互连,也可以用于局域网互连。 网关是一种充当转换重任的计算机系统或…

《游戏-03_3D-开发》之—新输入系统人物移动攻击连击

本次修改unity的新输入输出系统。本次修改unity需要重启,请先保存项目, 点击加号起名为MyCtrl, 点击加号设置为一轴的, 继续设置W键, 保存 生成自动脚本, 修改MyPlayer代码: using UnityEngine;…

华为产业链之车载激光雷达

一、智能汽车 NOA 加快普及,L3 上路利好智能感知硬件 1、感知层是 ADAS 最重要的一环 先进驾驶辅助系统 (ADAS, Advanced driver-assistance system)分“感知层、决策层、执行层”三个层级,其中感知层是最重要的一环…

Python数据分析:数据处理

数据处理是指对原始数据进行清洗、转换、整合和分析,以便从中提取有价值的信息。 常见的数据处理步骤包括: 数据清洗:去除缺失值、异常值和重复值。数据转换:对数据进行格式转换、归一化、标准化等操作。数据整合:将…

vue创建前端项目

背景 项目中需要用到前端技术,通过技术调研和团队分析,则采用vue作为前端主要技术栈。 问题 安装好后vue,按理说就可以创建vue项目 vue init webpack 项目名称 npm install,使用vue-cli脚手架搭建项目卡在sill idealTree buil…

C++高级编程——STL:list容器、set容器和map容器

本专栏记录C学习过程包括C基础以及数据结构和算法,其中第一部分计划时间一个月,主要跟着黑马视频教程,学习路线如下,不定时更新,欢迎关注。 当前章节处于: ---------第1阶段-C基础入门 ---------第2阶段实战…

C++入门【35-类访问修饰符】

数据封装是面向对象编程的一个重要特点,它防止函数直接访问类类型的内部成员。类成员的访问限制是通过在类主体内部对各个区域标记 public、private、protected 来指定的。关键字 public、private、protected 称为访问修饰符。 一个类可以有多个 public、protected…

C#hybridCLR热更新方案初探

前言 暂时处于初步研究状态,目前的框架使用还是尚少,本篇文章旨在同步给大家大概的使用流程和使用心得,在初步建立新项目时可以适当考虑。 介绍 热更新 与强制更新相对应,移动平台上App的可执行程序没有发生变化,仅…

[Go]认识Beego框架

对比Gin的简洁,自己之前基于Gin撸了一个架子,确实比beego目录看着舒服多了,不过最近接触到beego的项目,beego的bee工具使用还是很方便,来简单梳理下细节; Beego是一个开源的Go语言Web应用框架,…

边缘计算:在挑战与机遇的浪潮中破浪前行

在这个万物互联的时代,边缘计算如同一股清新奔腾的泉水,涌入了浩如烟海的技术海洋。它带着信息时代的涟漪,泛起了片片波澜,既有数据安全与隐私保护的风险,也有网络稳定性的挑战。但是,正如每一朵风雨都孕育…

设计一个在线聊天系统

约束和限制 假设我们聚焦在以下的工作流 只是输入Text进行对话 Users Add a UserRemove a UserUpdate a userAdd to a user’s friends list Add friend request Approve friend requestReject friend request Remove from a user’s friends list Create a group chat 邀请…

摄像机视角的切换_unity基础开发教程

摄像机视角的切换 前言一、场景搭建二、脚本编辑三、脚本挂载四、运行效果结语 前言 我们在游戏中经常可以看到游戏视角的切换,今天我们就做一个视角切换的小demo,学会之后可以将其融入到自己的游戏制作当中。 话不多说,我们现在开始&#xf…

eNSP学习——理解交换机Hybird接口的应用

目录 原理概述 实验内容 实验目的 实验步骤 实验拓扑 实验编址 实验步骤 基本配置(此处仅以PC1为例) 实现组内通信、组间间隔 实现网络管理员对所有网络的访问 原理概述 Hybrid接口既可以连接普通终端的接入链路又可以连接交换机间的干道…

Word中插入公式并引用

1、如何插入公式 在word中,键入快捷键 “alt” + “=”,即可快速插入一个公式,并立即编辑。 2、利用表格框住公式 新建一个 1 行 3 列的表格,总宽度为页面宽度,第一个单元格和最后一个单元格都保持在 2.25cm,中间尽可能长。我设置的这个数值比较合理。 记住,要把表格…

初识人工智能,一文读懂机器学习之逻辑回归知识文集(4)

🏆作者简介,普修罗双战士,一直追求不断学习和成长,在技术的道路上持续探索和实践。 🏆多年互联网行业从业经验,历任核心研发工程师,项目技术负责人。 🎉欢迎 👍点赞✍评论…

使用Linux SDK客户端向AWS Iot发送数据

参考链接: https://ap-southeast-1.console.aws.amazon.com/iot/home?regionap-southeast-1#/test 此篇文章用于测试,使用Linux SDK客户端向AWS Iot发送数据,准备环境如下: 1、客户端环境准备 1.1 客户端操作系统 虚拟机一台…