NGINX


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.54192.168.8.55192.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.55192.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;
}

4 NGINX实现流量按比例分流


文章作者: 罗宇
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 罗宇 !
 上一篇
Docker容器&Kubernetes Docker容器&Kubernetes
容器编排是指自动化地部署、扩展、管理和协调容器化应用的过程,它涉及到多个方面,如容器的调度、资源分配、容器之间的通信、故障恢复等
2025-05-28
下一篇 
Shell脚本 Shell脚本
Shell脚本是一种编程语言脚本,用于在Unix/Linux操作系统上执行命令。它是一系列命令的集合,通常保存在一个文件中,可以通过运行脚本文件来执行这些命令。
  目录