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

目录

Ubuntu中安装Nginx

概念介绍

负载均衡

几种负载均衡算法

反向代理

环境规划

配置反向代理

[加权负载均衡(Weighted Load Balancing)](#加权负载均衡(Weighted Load Balancing))

[轮询(Round Robin)](#轮询(Round Robin))

[IP 哈希(IP Hash)](#IP 哈希(IP Hash))

[最少连接(Least Connections)](#最少连接(Least Connections))

[URL 哈希(URL Hash)](#URL 哈希(URL Hash))


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

Ubuntu中安装Nginx

(1)安装依赖库

bash 复制代码
sudo apt install libgd-dev

(2)下载nginx的源码包

bash 复制代码
wget http://nginx.org/download/nginx-1.22.1.tar.gz

(3)解压该压缩包

bash 复制代码
tar -zvxf nginx-1.22.1.tar.gz

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

bash 复制代码
cd nginx-1.22.1

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

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

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

bash 复制代码
sudo apt update
sudo apt install libpcre3 libpcre3-dev

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

bash 复制代码
make && make install

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

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

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

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

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

(7)使用

启动Nginx:

bash 复制代码
sbin/nginx

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

bash 复制代码
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地址,检查是否成功运行:

可以看到是正常运行的

概念介绍

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

负载均衡

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

几种负载均衡算法

  • 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号

画一张图来演示一下:

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

centos2:

Ubuntu:

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

配置反向代理

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

加权负载均衡(Weighted Load Balancing)

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

bash 复制代码
cd /etc/nginx/

(2)编辑配置文件:

bash 复制代码
vim nginx.conf
bash 复制代码
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服务

bash 复制代码
systemctl restart nginx.service 

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

第一次:

第二次:

可以从上面两次访问的结果看到,这里的反向代理已经实现了。我们第一次访问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去掉即可

修改后的配置文件:

bash 复制代码
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;}
}

可以再次访问一下:

第一次:

第二次:

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

IP 哈希(IP Hash)

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

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

bash 复制代码
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;}
}

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

最少连接(Least Connections)

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

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

bash 复制代码
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软件包。

该策略的配置如下:

bash 复制代码
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反向代理负载均衡就完成了(^▽^)

相关推荐
WTT001140 分钟前
2024楚慧杯WP
大数据·运维·网络·安全·web安全·ctf
苹果醋31 小时前
React源码02 - 基础知识 React API 一览
java·运维·spring boot·mysql·nginx
明 庭2 小时前
Ubuntu下通过Docker部署NGINX服务器
服务器·ubuntu·docker
猿小蔡-Cool2 小时前
ubuntu20.04安装imwheel实现鼠标滚轮调速
ubuntu
过过过呀Glik2 小时前
在 Ubuntu 上安装 MySQL 的详细指南
mysql·ubuntu
群联云防护小杜3 小时前
如何给负载均衡平台做好安全防御
运维·服务器·网络·网络协议·安全·负载均衡
PyAIGCMaster4 小时前
ubuntu装P104驱动
linux·运维·ubuntu
zzzhpzhpzzz4 小时前
Ubuntu如何查看硬件型号
linux·运维·ubuntu
蜜獾云4 小时前
linux firewalld 命令详解
linux·运维·服务器·网络·windows·网络安全·firewalld
黑客Jack4 小时前
防御 XSS 的七条原则
安全·web安全·xss