1 NGINX介绍
1.1 基本概念
1.1.1 什么是NGINX
NGINX(发音为“engine-x”)是一个高性能的开源Web服务器、反向代理服务器、负载均衡器和邮件代理服务器。它由俄罗斯程序员Igor Sysoev于2002年开始开发。NGINX的设计初衷是为了解决C10k问题(即同时处理一万个并发连接的问题),因此它采用了异步、事件驱动的架构,使其在处理大量并发连接时具有极高的效率和稳定性。
1.1.2 NGINX的主要特点
1.高并发处理能力:NGINX以其高效的连接处理能力著称,能够在低内存消耗的情况下同时处理数万个并发连接。这使得它非常适合用于高流量的网站和应用。
2.轻量级和高性能:NGINX的设计使其能够以较少的系统资源提供高性能的服务。它的内存占用低,启动速度快,且能够处理大量的静态和动态内容。
3.灵活的配置:NGINX的配置文件采用模块化和层级结构,用户可以根据需要灵活地配置各种功能,如反向代理、负载均衡、缓存等。配置文件的语法简洁明了,便于管理和维护。
4.跨平台支持:NGINX支持多种操作系统,包括Linux、Windows、macOS、BSD等,用户可以在不同的环境中轻松部署和运行NGINX。
5.模块化架构:NGINX的模块化架构使得用户可以根据需求加载或卸载不同的模块,扩展其功能。例如,可以通过第三方模块实现额外的功能,如防火墙、认证、日志分析等。
6.丰富的社区和生态系统:作为一个流行的开源项目,NGINX拥有一个活跃的开发者社区和广泛的用户群体。社区不断贡献新的模块、插件和工具,使得NGINX的功能不断扩展和完善。
1.1.3 NGINX的应用场景
1.Web服务器:NGINX可以作为一个静态内容的Web服务器,用于提供HTML、CSS、JavaScript、图像等静态文件。它以处理并发请求的高效能力而闻名,能够在低内存使用的情况下处理大量并发连接。
2.反向代理服务器:NGINX可以作为反向代理服务器,接受客户端请求并将其转发到一个或多个后端服务器。这种功能特别适用于负载均衡和提高可用性,能够将流量分散到多个服务器上,从而提高系统的整体性能和可靠性。
3.负载均衡器:NGINX可以用于HTTP、HTTPS、TCP和UDP的负载均衡。它支持多种负载均衡算法(如轮询、加权轮询、IP哈希等),能够在后端服务器之间分配请求,从而优化资源使用和响应时间。
4.邮件代理服务器:NGINX还可以作为IMAP、POP3和SMTP的邮件代理服务器,提供邮件服务的负载均衡和安全性。
5.HTTP缓存:NGINX可以缓存静态和动态内容,减少后端服务器的负载,提高响应速度。它支持多种缓存策略,可以灵活配置缓存行为。
6.安全功能:NGINX支持SSL/TLS加密,可以用于保护传输数据的安全性。同时,它还支持访问控制和限流功能,能够有效防止恶意攻击和滥用。
7.大型网站和内容分发网络(CDN):由于其高效的静态内容处理能力和出色的并发处理性能,NGINX广泛应用于大型网站和内容分发网络中。
8.微服务架构:在微服务架构中,NGINX常用于服务间的反向代理和负载均衡,确保服务的高可用性和伸缩性。
9.API网关:NGINX可以用作API网关,处理API请求的路由、认证和速率限制等功能。
NGINX作为一个功能强大、灵活性高的服务器软件,广泛应用于现代Web架构中,适用于各种规模的网站和应用。从小型网站到大型企业级系统,NGINX都能够提供卓越的性能和可靠性。
1.2 NGINX和Apache的比较
1.2.1 性能和架构
NGINX:采用异步、事件驱动的架构,能够高效处理大量并发连接。NGINX在处理静态内容和反向代理时表现尤为出色。
Apache:采用多线程和多进程模型,默认使用的是基于进程的MPM(Multi-Processing Module)架构。Apache在处理动态内容(如PHP)时通常表现良好,但在高并发情况下可能不如NGINX高效。
1.2.2 资源消耗
NGINX:由于其事件驱动的架构,NGINX在处理大量并发连接时占用的内存和CPU资源较少,更适合高流量的场景。
Apache:基于进程的架构在处理高并发时可能需要更多的内存和CPU资源,但其模块化设计和灵活性使其在某些特定应用中表现更好。
1.2.3 配置和模块
NGINX:配置文件简洁、清晰,模块化设计可以根据需要加载或卸载模块。NGINX的核心模块相对较少,但可以通过第三方模块扩展功能。
Apache:拥有丰富的模块库,可以通过配置文件启用或禁用各种模块。配置文件语法灵活,但可能相对复杂。
1.2.4 静态和动态内容处理
NGINX:在处理静态内容(如HTML、CSS、图像)时表现非常出色,具有较高的性能。动态内容处理通常通过FastCGI、uwsgi等外部处理器来实现。
Apache:在处理动态内容(如PHP、Perl)时表现良好,因为它可以直接通过其模块(如mod_php、mod_perl)处理动态请求。
1.2.5 反向代理和负载均衡
NGINX:内置强大的反向代理和负载均衡功能,支持多种负载均衡算法,如轮询、加权轮询、IP哈希等,非常适合用于分布式系统和微服务架构。
Apache:也支持反向代理和负载均衡功能,但配置相对复杂,性能可能不如NGINX高效。
1.2.6 社区和支持
NGINX:拥有活跃的开源社区,提供丰富的文档和教程。商业版NGINX Plus提供额外的功能和支持服务。
Apache:Apache HTTP Server项目由Apache Software Foundation维护,拥有长期的用户基础和丰富的资源支持,社区非常活跃。
1.2.7 安全性
NGINX:默认配置下具有较高的安全性,支持SSL/TLS加密、访问控制和限流功能,有效防止DDoS攻击和滥用。
Apache:通过配置和模块可以实现多种安全功能,如SSL/TLS加密、身份验证和访问控制,安全性较高。
1.2.8 使用场景
NGINX:适用于高并发的静态内容服务、反向代理、负载均衡和缓存等场景,尤其在高流量的网站和应用中表现优异。
Apache:适用于需要灵活处理动态内容的网站和应用,模块化设计使其能够适应多种应用需求。
1.3 NGINX的两种部署方法比较
Linux是最常见的NGINX安装环境,支持通过包管理器和源代码编译安装。
Linux提供了丰富的工具和资源,便于NGINX的配置和管理,源码包安装和包管理器安装各有优劣,选择哪种方式应根据具体的需求和使用场景来决定。
一般来说,如果需要对NGINX进行深度定制和优化,并且具备足够的技术能力,可以选择源码包安装;如果你追求安装和维护的简便性,包管理器安装则是一个更好的选择。
1.3.1 灵活性与自定义
源码包安装:
优点:
1.高度灵活:可根据需要定制NGINX的编译选项和模块。可以选择只编译需要的模块,减少内存和CPU占用。
2.自定义模块:可以编译和安装第三方模块,这在需要特殊功能时非常有用。
缺点:
1.复杂性:编译和安装过程复杂,需要处理依赖项和配置选项。
2.时间消耗:编译过程耗时较长,尤其是在资源有限的系统上。
包管理器安装:
优点:
1.简单快捷:通过包管理器(如apt、yum、brew等)可以快速安装NGINX,并自动处理依赖项。
2.易于管理:包管理器提供了统一的工具来管理软件的安装、升级和卸载,方便维护。
缺点:
1.灵活性有限:安装的NGINX版本和模块通常是预编译的,不能进行深度定制。
2.版本控制:可能无法立即获取到最新版本,需要等待包管理器维护者更新软件库。
1.3.2 性能与优化
源码包安装:
优点:
1.性能优化:可以根据系统环境和具体需求,进行编译时的优化配置,从而提升性能。
2.精细控制:可以关闭不需要的模块,减小可执行文件的体积,提高执行效率。
缺点:
1.调试复杂:由于是手动编译的版本,出现问题时需要自己调试和解决。
包管理器安装:
优点:
1.稳定性高:包管理器提供的版本通常经过了充分测试,具备较高的稳定性。
2.社区支持:使用包管理器安装的版本更容易获得社区支持和帮助。
缺点:
1.性能优化有限:预编译版本的性能优化程度不如手动编译。
1.3.3 升级与维护
源码包安装:
优点:
1.定制升级:可以针对需要的版本进行升级,灵活选择新版本特性。
2.独立维护:可以独立管理不同版本,适合高级用户和特殊需求。
缺点:
1.维护成本高:每次升级都需要重新编译和配置,耗时且复杂。
包管理器安装:
优点:
1.自动升级:包管理器通常提供自动升级功能,可以方便地保持软件的最新状态。
2.低维护成本:包管理器处理依赖项和配置文件的变更,降低维护工作量。
缺点:
1.定制性差:无法选择特定版本或特定功能进行升级。
2 NGINX快速部署
2.1 环境介绍
操作系统 | IP地址 | NGINX版本 |
---|---|---|
Red Hat Enterprise Linux release 9.6 | 192.168.8.53 | 1.28.0 |
2.2 RedHat9的有关配置
2.2.1 网络设置
# 查看虚拟机网路适配器设置
[root@RhelHost1 ~]# vim /etc/NetworkManager/system-connections/ens160.nmconnection
# 添加DNS
[root@RhelHost1 ~]# vim /etc/resolv.conf
# Generated by NetworkManager
nameserver 8.8.8.8
nameserver 8.8.4.4
# 重启网卡
[root@RhelHost1 ~]# nmcli connection down ens160
[root@RhelHost1 ~]# nmcli connection up ens160
2.2.1 国内镜像源
[root@RhelHost1 ~]# cd /etc/yum.repos.d
[root@RhelHost1 yum.repos.d]# vim aliyun_yum.repo
[ali_baseos]
name=ali_baseos
baseurl=https://mirrors.aliyun.com/centos-stream/9-stream/BaseOS/x86_64/os/
gpgcheck=0
[ali_appstream]
name=ali_appstream
baseurl=https://mirrors.aliyun.com/centos-stream/9-stream/AppStream/x86_64/os/
gpgcheck=0
[root@RhelHost1 ~]# yum makecache
# 根据需要选择是否更新yum源
[root@RhelHost1 ~]# yum -y update
2.2.2 本地yum源配置
配置本地yum源可以创建一个本地的软件包存储库,以便更快地安装、更新和管理软件包
# 创建文件夹并将光盘挂载到新建的文件中
[root@RhelHost1 ~]# mkdir -p /GuaZai/Iso
[root@RhelHost1 ~]# mount /dev/sr0 /GuaZai/Iso
mount: /GuaZai/Iso: WARNING: source write-protected, mounted read-only.
[root@RhelHost1 ~]# cd /GuaZai/Iso
[root@RhelHost1 Iso]# ls
AppStream BaseOS EFI EULA extra_files.json GPL images isolinux media.repo RPM-GPG-KEY-redhat-beta RPM-GPG-KEY-redhat-release
#配置yum文件
[root@RhelHost1 ~]# vim /etc/yum.repos.d/rhel9.repo
[BaseOS]
name=rhel9-BaseOS
baseurl=file:///GuaZai/Iso/BaseOS
gpgcheck=0
[Appstream]
name=rhel9-Appstream
baseurl=file:///GuaZai/Iso/AppStream
gpgcheck=0
# 查看仓库序列
[root@RhelHost1 ~]# yum repolist
# 生成yum缓存
[root@RhelHost1 ~]# yum makecache
2.3 准备软件包仓库
向系统添加了一个名为nginx的仓库
# 仓库地址 https://nginx.org/packages
cat > /etc/yum.repos.d/nginx.repo <<EOF
[nginx]
name=nginx repo
baseurl=https://nginx.org/packages/rhel/9/x86_64/
gpgcheck=0
enabled=1
EOF
# 尝试生成仓库索引,如果可以成功,就说明仓库可用
[root@RhelHost1 ~]# dnf makecache
ali_baseos 12 kB/s | 3.9 kB 00:00
ali_appstream 32 kB/s | 4.4 kB 00:00
nginx repo 21 kB/s | 52 kB 00:02
rhel9-BaseOS 2.7 MB/s| 2.7 kB 00:00
rhel9-Appstream 3.1 MB/s| 3.2 kB 00:00
2.4 安装NGINX软件
# 从输出看,已经从nginx仓库中,安装了1.28.0
[root@RhelHost1 ~]# dnf install nginx -y
...
Verifying : nginx-2:1.28.0-1.el9.ngx.x86_64 1/1
Installed products updated.
Installed:
nginx-2:1.28.0-1.el9.ngx.x86_64
Complete!
2.5 准备测试页面
nginx的服务默认需要将网页放到**/usr/share/nginx/html目录中,首页需要以index.html或者index.htm**命名
准备一个内容为Hello nginx, I’m China的网页作为其首页
[root@RhelHost1 ~]# echo "Hello nginx, I'm China" > /usr/share/nginx/html/index.html
[root@RhelHost1 ~]# cat /usr/share/nginx/html/index.html
Hello nginx, I'm China
2.6 启用并启动服务
用enable –now的语法,将nginx的服务执行enable和start操作,以便于马上启动nginx服务,并通知服务器,将nginx服务在开机时自动启动
[root@RhelHost1 ~]# systemctl enable nginx --now
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.
[root@RhelHost1 ~]# systemctl status nginx
2.7 开通防火墙
[root@RhelHost1 ~]# firewall-cmd --add-service=http --permanent
success
[root@RhelHost1 ~]# firewall-cmd --reload
success
2.8 访问测试网页
[root@RhelHost1 ~]# curl http://192.168.8.53
Hello nginx, I'm China
2.9 优雅重载NGINX
如果后续修改了配置文件,可用下面的方法优雅重载nginx,比如下面告诉nginx来重新加载配置文件,而不中断服务
# 给nginx发送reload信号,可在不中断nginx进程的情况下重载配置文件
[root@RhelHost1 ~]# nginx -s reload
3 NGINX实现负载均衡
3.1 环境介绍
操作系统 | IP地址 | 主机名 | NGINX版本 | 角色 |
---|---|---|---|---|
Red Hat Enterprise Linux release 9.6 | 192.168.8.53 | loadbalance.luovip.cn | 1.28.0 | 负载均衡 |
Red Hat Enterprise Linux release 9.6 | 192.168.8.54 | web1.luovip.cn | 1.28.0 | 普通业务服务器 |
Red Hat Enterprise Linux release 9.6 | 192.168.8.55 | web2.luovip.cn | 1.28.0 | 普通业务服务器 |
3.2 环境架构图
在这个架构中,NGINX负载均衡器loadbalance.luovip.cn(IP地址192.168.8.53)负责将请求分发到两台普通业务服务器web1.luovip.cn(IP地址192.168.8.54)和web2.luovip.cn(IP地址192.168.8.55)
+------------------------+
| loadbalance.luovip.cn |
| 192.168.8.53 |
| (NGINX) |
+------------------------+
|
|
+-------------------------+-------------------------+
| |
| |
+------------------------+ +------------------------+
| web1.luovip.cn | | web2.luovip.cn |
| 192.168.8.54 | | 192.168.8.55 |
| (业务服务器) | | (业务服务器) |
+------------------------+ +------------------------+
3.3 实验先决条件
3.3.1 准备hosts文件
需要在所有机器上完成准备,以便能用名称互相解析和访问
# 以下命令在架构中的三台主机中执行
cat > /etc/hosts <<EOF
192.168.8.53 loadbalance.luovip.cn loadbalance
192.168.8.54 web1.luovip.cn web1
192.168.8.55 web2.luovip.cn web2
EOF
3.3.2 部署业务服务器
在两台业务服务器上部署Nginx,需要让每个服务器上的页面显示不同的内容以区分主机,每个主机需开通防火墙
1.部署web1.luovip.cn这台主机,IP为:192.168.8.54
# 准备软件包仓库
cat > /etc/yum.repos.d/nginx.repo <<EOF
[nginx]
name=nginx repo
baseurl=https://nginx.org/packages/rhel/9/x86_64/
gpgcheck=0
enabled=1
EOF
[root@RhelHost2 ~]# dnf makecache
# 安装NGINX软件
[root@RhelHost2 ~]# dnf install nginx -y
# 准备测试页面
[root@RhelHost2 ~]# echo "Hello nginx, I'm web1.luovip.cn" > /usr/share/nginx/html/index.html
# 启用并启动服务
[root@RhelHost2 ~]# systemctl enable nginx --now
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.
# 开通防火墙
[root@RhelHost2 ~]# firewall-cmd --add-service=http --permanent
success
[root@RhelHost2 ~]# firewall-cmd --reload
success
# 访问测试页
[root@RhelHost2 ~]# curl http://192.168.8.54
Hello nginx, I'm web1.luovip.cn
2.部署web2.luovip.cn这台主机,IP为:192.168.8.55
# 准备软件包仓库
cat > /etc/yum.repos.d/nginx.repo <<EOF
[nginx]
name=nginx repo
baseurl=https://nginx.org/packages/rhel/9/x86_64/
gpgcheck=0
enabled=1
EOF
[root@RhelHost3 ~]# dnf makecache
# 安装NGINX软件
[root@RhelHost3 ~]# dnf install nginx -y
# 准备测试页面
[root@RhelHost3 ~]# echo "Hello nginx, I'm web2.luovip.cn" > /usr/share/nginx/html/index.html
# 启用并启动服务
[root@RhelHost3 ~]# systemctl enable nginx --now
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.
# 开通防火墙
[root@RhelHost3 ~]# firewall-cmd --add-service=http --permanent
success
[root@RhelHost3 ~]# firewall-cmd --reload
success
# 访问测试页
[root@RhelHost3 ~]# curl http://192.168.8.55
Hello nginx, I'm web2.luovip.cn
3.4 基本概念
NGINX不仅是一个高性能的Web服务器,同时还提供了强大的负载均衡功能。它支持基于HTTP、HTTPS、TCP和UDP协议的负载均衡,为不同的应用场景提供了解决方案。在开源版本的NGINX中,提供了被动的健康检查,这有助于减少上游服务器的压力。而在NGINX Plus版本中,除了被动健康检查,还提供了主动健康检查功能。
主动健康检查每隔一段时间就会向上游服务器发起连接或请求,以确保服务器的健康状态。这虽然会带来一定的系统负载,但能够更及时地发现问题,并提供更高的服务可用性。
3.5 负载均衡的应用
以下所有关于负载均衡的例子,都在loadbalance服务器执行,192.168.8.56不需要准备,仅用于示意
3.5.1 HTTP 负载均衡
在这个配置中:
upstream load:定义了一个名为load的上游服务器组。
server 192.168.8.54:80 weight=1 max_fails=3 fail_timeout=3s:定义了第一台后端服务器,权重为1,最大失败次数为3,超时时间为3秒。
server 192.168.8.55:80 weight=2 max_fails=3 fail_timeout=3s:定义了第二台后端服务器,权重为2,最大失败次数为3,超时时间为3秒。
server 192.168.8.56:80 backup max_fails=3 fail_timeout=3s:定义了备份服务器,最大失败次数为3,超时时间为3秒。
server_name loadbalance.luovip.cn:设置了虚拟主机名。
proxy_pass http://load:将请求转发到上游服务器组。
# 将以下代码在loadbalance服务器执行,让nginx重新加载配置文件生效
cat > /etc/nginx/conf.d/httpha.conf <<EOF
upstream load {
server 192.168.8.54:80 weight=1 max_fails=3 fail_timeout=3s;
server 192.168.8.55:80 weight=2 max_fails=3 fail_timeout=3s;
server 192.168.8.56:80 backup max_fails=3 fail_timeout=3s;
}
server {
listen 80;
server_name loadbalance.luovip.cn;
location / {
proxy_pass http://load;
}
}
EOF
第三个服务器后面的backup可以是以下的几种:
选项 | 含义 |
---|---|
down | 目前宕机,不参与负载均衡 |
backup | 当具有权重的正常服务器全宕机后,此服务器将启用 |
max_fails | 最大请求失败次数 |
fail_timeout | 超过最大失败次数后,暂停多长时间 |
max_conns | 最大连接数 |
# 让nginx重新加载配置文件生效 nginx -t表示检查配置
[root@RhelHost1 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@RhelHost1 ~]# nginx -s reload
测试负载均衡效果,需要将SELinux的布尔值打开,或者关闭SELinux,不然nginx将无法作为负载均衡工作
# 临时关闭SELinux
[root@RhelHost1 ~]# setenforce 0
# 将SELinux的布尔值打开
[root@RhelHost1 ~]# setsebool -P httpd_can_network_relay on
# 可以看到,当多次访问loadbalance的时候,会返回不同主机上的内容
[root@RhelHost1 ~]# curl http://loadbalance.luovip.cn
Hello nginx, I'm web2.luovip.cn
[root@RhelHost1 ~]# curl http://loadbalance.luovip.cn
Hello nginx, I'm web1.luovip.cn
3.5.2 TCP 负载均衡
nginx 使用stream模块来完成TCP端口负载均衡,所以需要在主配置文件中打开stream功能,并将stream配置文件单独存储,方便管理
[root@RhelHost1 ~]# vim /etc/nginx/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /run/nginx.pid;
events {
worker_connections 1024;
}
http {
...
stream {
include /etc/nginx/stream.conf.d/*.conf;
}
# 从上面的配置文件中可看出,将stream功能的配置文件放入了/etc/nginx/stream.conf.d/,这个位置需要建出来
[root@RhelHost1 ~]# mkdir /etc/nginx/stream.conf.d/
[root@RhelHost1 ~]# vim /etc/nginx/stream.conf.d/tcp.conf
upstream backend {
server 192.168.8.54:22 weight=1 max_fails=3 fail_timeout=30s; # 业务服务器1,SSH端口22
server 192.168.8.55:22 weight=2 max_fails=3 fail_timeout=30s; # 业务服务器2,SSH端口22
server 192.168.8.56:22 backup max_fails=3 fail_timeout=30s; # 备份服务器,SSH端口22
}
server {
listen 3000; # 将负载均衡器监听端口更改为3000
proxy_pass backend;
}
以上配置文件主要是用于实现基于 TCP 协议的负载均衡,特别是针对 SSH 流量。NGINX 监听 3000 端口的连接请求,然后根据配置的权重和健康检查机制,将请求转发到后端的 SSH 服务器(192.168.8.54
、192.168.8.55
和 192.168.8.56
)
upstream backend:定义了一个名为 backend的上游服务器组。
server 192.168.8.4:22 weight=1 max_fails=3 fail_timeout=30s:
192.168.8.4:22:服务器的 IP 和端口号(SSH端口 22)
weight=1:设置此服务器的权重为1,表示流量分配到此服务器的比例较低
max_fails=3:如果服务器失败次数超过3次,则认为服务器不可用
fail_timeout=30s:在30秒内,如果服务器连续失败达到 max_fails,则将其标记为不可用。
其他服务器配置(192.168.8.55
和 192.168.8.56
)类似,只是权重和角色(备份服务器)不同。
listen 3000:NGINX 监听 3000 端口,所有进入 3000 端口的 TCP 请求都会被处理。
proxy_pass backend:将接收到的流量转发到上游服务器组
backend
[root@RhelHost1 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@RhelHost1 ~]# nginx -s reload
# 测试
[root@RhelHost1 ~]# nc -vz loadbalance.luovip.cn 3000
Ncat: Version 7.92 ( https://nmap.org/ncat )
Ncat: Connected to 192.168.8.53:3000.
Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.
3.5.3 UDP负载均衡
listen 的端口号之后指明为UDP即可,基本配置和上面的TCP很像
cat > /etc/nginx/stream.conf.d/udp-dns.conf <<EOF
upstream dns_servers {
server 192.168.8.54:53 weight=1 max_fails=3 fail_timeout=30s; # 业务服务器1,DNS端口53
server 192.168.8.55:53 weight=2 max_fails=3 fail_timeout=30s; # 业务服务器2,DNS端口53
server 192.168.8.56:53 backup max_fails=3 fail_timeout=30s; # 备份服务器,DNS端口53
}
server {
listen 53 udp; # 监听 UDP 53 端口
proxy_pass dns_servers;
}
EOF
upstream dns_servers:定义一个名为 dns_servers的上游服务器组,其中包含了三个后端服务器。每个服务器配置了 IP 地址、端口、权重、最大失败次数和失败超时时间。
server:
listen 53 udp:NGINX 监听 UDP 53 端口(通常用于 DNS 服务)
proxy_pass dns_servers:将接收到的 UDP 流量转发到上游服务器组 dns_servers
[root@RhelHost1 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@RhelHost1 ~]# nginx -s reload
3.6 不同负载均衡类型配置示意
NGINX的负载均衡类型:最少连接、最少时间、轮询调度、通用哈希、随机调度、IP哈希
1.最少连接(Least Connections):
将新请求分配给当前活动连接数最少的后端服务器。适用于请求处理时间较长的场景。
配置示例:
upstream backend {
least_conn;
server backend1.example.com;
server backend2.example.com;
}
2.最少时间(Least Time):
根据请求处理时间,将新请求分配给响应时间最短且当前活动连接数最少的后端服务器。适用于需要快速响应的场景。
配置示例(需要 NGINX Plus):
upstream backend {
least_time header;
server backend1.example.com;
server backend2.example.com;
}
3.轮询调度(Round Robin):
将新请求按照循环顺序分配给后端服务器。适用于大多数场景。
配置示例(默认配置):
upstream backend {
server backend1.example.com;
server backend2.example.com;
}
4.通用哈希(Generic Hash):
基于用户定义的哈希方法,将请求分配给特定的后端服务器。适用于需要特定规则进行流量分配的场景。
配置示例:
upstream backend {
hash $request_uri;
server backend1.example.com;
server backend2.example.com;
}
5.随机调度(Random with Two Choices):
随机选择两台后端服务器,然后将请求分配给其中负载较小的一台。适用于需要均匀分配负载的场景。
配置示例(需要 NGINX Plus):
upstream backend {
random two least_conn;
server backend1.example.com;
server backend2.example.com;
}
6.IP哈希(IP Hash):
基于客户端 IP 地址的哈希值,将请求分配给特定的后端服务器。适用于需要保持会话一致性的场景。
配置示例:
upstream backend {
ip_hash;
server backend1.example.com;
server backend2.example.com;
}