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

news2024/11/15 14:10:29

目录

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):作为负载均衡服务器2号

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

画一张图来演示一下:
 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.coloradmin.cn/o/1409229.html

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

相关文章

服务器和云桥通SDWAN组网的区别

一、服务器的概念 服务器是一种计算设备,用于存储、处理和提供数据和应用服务。通常,服务器配备高性能处理器、大容量存储器和网络接口,其主要目的是提供计算资源、存储资源以及应用程序的托管。这种设备可以用于托管网站、应用程序、数据库和…

1331:【例1-2】后缀表达式的值

【题目描述】 从键盘读入一个后缀表达式(字符串),只含有0-9组成的运算数及加()、减(—)、乘(*)、除(/)四种运算符。每个运算数之间用一个空格隔开…

8.8加油站(LC134-M)

算法: 首先如果总油量减去总消耗大于等于零那么一定可以跑完一圈, 每个加油站的剩余量rest[i]为gas[i] - cost[i]。 说明 各个站点的加油站 剩油量rest[i]相加一定是大于等于零的。 i从0开始累加rest[i],和记为curSum,一旦curS…

合合信息启信数据发布园区金融解决方案,助力银行精准服务“十四五”特色产业

今年冬季寒潮频现,“尔滨”等冰雪之城却凭借着出色的文旅服务,接连火爆“出圈”。现阶段,作为传统工业基地的哈尔滨正积极向第三产业转型。文旅园区具备产业、技术、知识、劳动力密集属性和特定产业集群规模效应,是推动文化与创意…

腾讯云安装Java11(jdk11.0.21)

腾讯云安装Java11(jdk11.0.21) 下载Java11 下载Linux的jdk包Java11下载路径 https://www.oracle.com/java/technologies/javase/jdk11-archive-downloads.html 解压jdk 下载完成后,进入自己想要放到的目录下面,输入tar -zxvf jdk-11.0.21_linux-x64_b…

考研C语言刷题基础篇之数组(一)

目录 第一题:用数组作为参数实现冒泡排序 不用函数的冒泡排序 冒泡排序原理: 错误的数值传参冒泡排序 错误的原因 就是什么是数组名 正确的数组传参的冒泡排序 数组的地址和数组首元素的地址的区别 第一题:用数组作为参数实现冒泡排…

oracle19.22的patch已发布

2024年01月16日,oracle发布了19.22的patch 具体patch如下 Reserved for Database - Do not edit or delete (Doc ID 19202401.9) 文档ID规则如下 19(版本)+年份(202x)+(季度首月01,04,07,10).9 往期patch no信息和下载参考文档 oracle 19C Release Update patch num…

喝葡萄酒要懂得选对杯

喝葡萄酒要懂得选对杯 一、什么是葡萄酒杯? 葡萄酒杯,因其有一个细长的底座而被大众形象的称为高脚杯,但在事实上,高脚杯只是葡萄酒杯中的一种。在葡萄酒文化中,酒杯是其不可缺失的一个重要环节,在西方传统…

《动手学深度学习(PyTorch版)》笔记3.1

Chapter3 Linear Neural Networks 3.1 Linear Regression 3.1.1 Basic Concepts 我们通常使用 n n n来表示数据集中的样本数。对索引为 i i i的样本,其输入表示为 x ( i ) [ x 1 ( i ) , x 2 ( i ) , . . . , x n ( i ) ] ⊤ \mathbf{x}^{(i)} [x_1^{(i)}, x_2…

composer安装hyperf后,nginx配置hyperf

背景 引入hyperf项目用作微服务,使用composer 安装hyperf后,对hyperf进行nginx配置。 配置步骤 因为hyperf监听的是端口,不像其他laravel、lumen直接指向文件即可。所有要监听端口号。 1 配置nginx server {listen 80;//http&#xff1a…

逻辑回归中的损失函数梯度下降

一、引言 逻辑回归中的损失函数通常采用的是交叉熵损失函数(cross-entropy loss function)。在逻辑回归中,我们通常使用sigmoid函数将线性模型的输出转换为概率值,然后将这些概率值与实际标签进行比较,从而计算损失。 …

2024年mongodb自建三节点副本集详细教程

环境说明 系统centos7.9 自建服务器或云服务器,硬件要求不低于2核2G内存,20G硬盘,文件系统默认是ext4即可。 生产环境最好单独一个磁盘存放数据库,方便数据备份和还原,避免干扰到其他磁盘的运作。 mongodb 4.4.27 …

基于差分进化算法的移动边缘计算 (MEC) 的资源调度分配优化(提供MATLAB代码)

一、优化模型简介 在所研究的区块链网络中,优化的变量为:挖矿决策(即 m)和资源分配(即 p 和 f),目标函数是使所有矿工的总利润最大化。问题可以表述为: max ⁡ m , p , f F miner …

TCP 异常断开连接【重点】

参考链接 https://xiaolincoding.com/network/3_tcp/tcp_down_and_crash.html https://xiaolincoding.com/network/3_tcp/tcp_unplug_the_network_cable.html#%E6%8B%94%E6%8E%89%E7%BD%91%E7%BA%BF%E5%90%8E-%E6%9C%89%E6%95%B0%E6%8D%AE%E4%BC%A0%E8%BE%93 关键词&#xff1a…

重构改善既有代码的设计-学习(三):重新组织数据

1、拆分变量(Split Variable) 有些变量用于保存一段冗长代码的运算结果,以便稍后使用。这种变量应该只被赋值一次。 如果它们被赋值超过一次,就意味它们在函数中承担了一个以上的责任。如果变量承担多个责任,它就应该被…

Redis 面试题 | 10.精选Redis高频面试题

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

利用git上传本地文件

1、建立仓库 2.然后刷新网站,获取下载链接,备用。 3、接下来在本地创建一个文件夹, 4、把github上面的仓库克隆到本地 git clone https://github.com/xxxxx(https://github.com/xxxxx替换成你之前复制的地址) 5、把…

京东高薪招聘GIS开发工程师,细数其背后的商业逻辑

京东以30-50K*16薪的薪资招聘GIS开发工程师。 之前我们介绍过腾讯在智慧城市方向的布局,具体的可以看这里:腾讯在智慧城市方向的布局 今天我们来细数一下京东背后的GIS生意。 01 京东地图 成立时间和所在地 2018年7月,专注于机器人地图和智…

Github 不能访问,提示:port 22: Connection timed out

问题描述 github clone 代码出现错误: $ git clone gitgithub.com:Atlan4/Fnirsi1013D.git Cloning into Fnirsi1013D... ssh: connect to host github.com port 22: Connection timed out fatal: Could not read from remote repository.Please make sure you ha…

wayland(wl_shell) + egl + opengles 最简实例

文章目录 前言一、ubuntu 上相关环境准备1. ubuntu 上安装 weston2. 确定ubuntu 上安装的opengles 版本3. 确定安装的 weston 是否支持 wl_shell 接口二、窗口管理器接口 wl_shell 介绍二、代码实例1.egl_wayland_demo.c2. 编译和运行2.1 编译2.2 运行总结参考资料前言 本文主…