1 基本概念
1.1 什么是NGINX
NGINX(发音为“engine-x”)是一个高性能的开源Web服务器、反向代理服务器、负载均衡器和邮件代理服务器。它由俄罗斯程序员Igor Sysoev于2002年开始开发。NGINX的设计初衷是为了解决C10k问题(即同时处理一万个并发连接的问题),因此它采用了异步、事件驱动的架构,使其在处理大量并发连接时具有极高的效率和稳定性。
1.2 NGINX的主要特点
高并发处理能力:
NGINX以其高效的连接处理能力著称,能够在低内存消耗的情况下同时处理数万个并发连接。这使得它非常适合用于高流量的网站和应用。
轻量级和高性能:
NGINX的设计使其能够以较少的系统资源提供高性能的服务。它的内存占用低,启动速度快,且能够处理大量的静态和动态内容。
灵活的配置:
NGINX的配置文件采用模块化和层级结构,用户可以根据需要灵活地配置各种功能,如反向代理、负载均衡、缓存等。配置文件的语法简洁明了,便于管理和维护。
跨平台支持:
NGINX支持多种操作系统,包括Linux、Windows、macOS、BSD等,用户可以在不同的环境中轻松部署和运行NGINX。
模块化架构:
NGINX的模块化架构使得用户可以根据需求加载或卸载不同的模块,扩展其功能。例如,可以通过第三方模块实现额外的功能,如防火墙、认证、日志分析等。
丰富的社区和生态系统:
作为一个流行的开源项目,NGINX拥有一个活跃的开发者社区和广泛的用户群体。社区不断贡献新的模块、插件和工具,使得NGINX的功能不断扩展和完善。
1.3 NGINX的应用场景
Web服务器:
NGINX可以作为一个静态内容的Web服务器,用于提供HTML、CSS、JavaScript、图像等静态文件。它以处理并发请求的高效能力而闻名,能够在低内存使用的情况下处理大量并发连接。
反向代理服务器:
NGINX可以作为反向代理服务器,接受客户端请求并将其转发到一个或多个后端服务器。这种功能特别适用于负载均衡和提高可用性,能够将流量分散到多个服务器上,从而提高系统的整体性能和可靠性。
负载均衡器:
NGINX可以用于HTTP、HTTPS、TCP和UDP的负载均衡。它支持多种负载均衡算法(如轮询、加权轮询、IP哈希等),能够在后端服务器之间分配请求,从而优化资源使用和响应时间。
邮件代理服务器:
NGINX还可以作为IMAP、POP3和SMTP的邮件代理服务器,提供邮件服务的负载均衡和安全性。
HTTP缓存:
NGINX可以缓存静态和动态内容,减少后端服务器的负载,提高响应速度。它支持多种缓存策略,可以灵活配置缓存行为。
安全功能:
NGINX支持SSL/TLS加密,可以用于保护传输数据的安全性。同时,它还支持访问控制和限流功能,能够有效防止恶意攻击和滥用。
大型网站和内容分发网络(CDN):
由于其高效的静态内容处理能力和出色的并发处理性能,NGINX广泛应用于大型网站和内容分发网络中。
微服务架构:
在微服务架构中,NGINX常用于服务间的反向代理和负载均衡,确保服务的高可用性和伸缩性。
API网关:
NGINX可以用作API网关,处理API请求的路由、认证和速率限制等功能。
NGINX作为一个功能强大、灵活性高的服务器软件,广泛应用于现代Web架构中,适用于各种规模的网站和应用。从小型网站到大型企业级系统,NGINX都能够提供卓越的性能和可靠性。
2 NGINX和Apache的比较
2.1 性能和架构
NGINX:采用异步、事件驱动的架构,能够高效处理大量并发连接。NGINX在处理静态内容和反向代理时表现尤为出色。
Apache:采用多线程和多进程模型,默认使用的是基于进程的MPM(Multi-Processing Module)架构。Apache在处理动态内容(如PHP)时通常表现良好,但在高并发情况下可能不如NGINX高效。
2.2 资源消耗
NGINX:由于其事件驱动的架构,NGINX在处理大量并发连接时占用的内存和CPU资源较少,更适合高流量的场景。
Apache:基于进程的架构在处理高并发时可能需要更多的内存和CPU资源,但其模块化设计和灵活性使其在某些特定应用中表现更好。
2.3 配置和模块
NGINX:配置文件简洁、清晰,模块化设计可以根据需要加载或卸载模块。NGINX的核心模块相对较少,但可以通过第三方模块扩展功能。
Apache:拥有丰富的模块库,可以通过配置文件启用或禁用各种模块。配置文件语法灵活,但可能相对复杂。
2.4 静态和动态内容处理
NGINX:在处理静态内容(如HTML、CSS、图像)时表现非常出色,具有较高的性能。动态内容处理通常通过FastCGI、uwsgi等外部处理器来实现。
Apache:在处理动态内容(如PHP、Perl)时表现良好,因为它可以直接通过其模块(如mod_php、mod_perl)处理动态请求。
2.5 反向代理和负载均衡
NGINX:内置强大的反向代理和负载均衡功能,支持多种负载均衡算法,如轮询、加权轮询、IP哈希等,非常适合用于分布式系统和微服务架构。
Apache:也支持反向代理和负载均衡功能,但配置相对复杂,性能可能不如NGINX高效。
2.6 社区和支持
NGINX:拥有活跃的开源社区,提供丰富的文档和教程。商业版NGINX Plus提供额外的功能和支持服务。
Apache:Apache HTTP Server项目由Apache Software Foundation维护,拥有长期的用户基础和丰富的资源支持,社区非常活跃。
2.7 安全性
NGINX:默认配置下具有较高的安全性,支持SSL/TLS加密、访问控制和限流功能,有效防止DDoS攻击和滥用。
Apache:通过配置和模块可以实现多种安全功能,如SSL/TLS加密、身份验证和访问控制,安全性较高。
2.8 使用场景
NGINX:适用于高并发的静态内容服务、反向代理、负载均衡和缓存等场景,尤其在高流量的网站和应用中表现优异。
Apache:适用于需要灵活处理动态内容的网站和应用,模块化设计使其能够适应多种应用需求。
3 NGINX的两种部署方法
Linux是最常见的NGINX安装环境,支持通过包管理器和源代码编译安装。Linux提供了丰富的工具和资源,便于NGINX的配置和管理,源码包安装和包管理器安装各有优劣,选择哪种方式应根据具体的需求和使用场景来决定。一般来说,如果你需要对NGINX进行深度定制和优化,并且具备足够的技术能力,可以选择源码包安装;如果你追求安装和维护的简便性,包管理器安装则是一个更好的选择。
3.1 灵活性与自定义
3.1.1 源码包安装
优点:
高度灵活:可以根据需要定制NGINX的编译选项和模块。可以选择只编译需要的模块,减少内存和CPU占用。
自定义模块:可以编译和安装第三方模块,这在需要特殊功能时非常有用。
缺点:
复杂性:编译和安装过程复杂,需要处理依赖项和配置选项。
时间消耗:编译过程耗时较长,尤其是在资源有限的系统上。
3.1.2 包管理器安装
优点:
简单快捷:通过包管理器(如apt、yum、brew等)可以快速安装NGINX,并自动处理依赖项。
易于管理:包管理器提供了统一的工具来管理软件的安装、升级和卸载,方便维护。
缺点:
灵活性有限:安装的NGINX版本和模块通常是预编译的,不能进行深度定制。
版本控制:可能无法立即获取到最新版本,需要等待包管理器维护者更新软件库。
3.2 性能与优化
3.2.1 源码包安装
优点:
性能优化:可以根据系统环境和具体需求,进行编译时的优化配置,从而提升性能。
精细控制:可以关闭不需要的模块,减小可执行文件的体积,提高执行效率。
缺点:
调试复杂:由于是手动编译的版本,出现问题时需要自己调试和解决。
3.2.2 包管理器安装
优点:
稳定性高:包管理器提供的版本通常经过了充分测试,具备较高的稳定性。
社区支持:使用包管理器安装的版本更容易获得社区支持和帮助。
缺点:
性能优化有限:预编译版本的性能优化程度不如手动编译。
3.3 升级与维护
3.3.1 源码包安装
优点:
定制升级:可以针对需要的版本进行升级,灵活选择新版本特性。
独立维护:可以独立管理不同版本,适合高级用户和特殊需求。
缺点:
维护成本高:每次升级都需要重新编译和配置,耗时且复杂。
3.3.2 包管理器安装
优点:
自动升级:包管理器通常提供自动升级功能,可以方便地保持软件的最新状态。
低维护成本:包管理器处理依赖项和配置文件的变更,降低维护工作量。
缺点:
定制性差:无法选择特定版本或特定功能进行升级。
4 nginx快速部署
4.1 环境介绍
| 系统版本 | IP地址 | NGINX版本 |
|---|---|---|
| Rocky 9.6 | 192.168.8.4 | 1.26.2 |
4.2 准备软件包仓库
这里的centos仓库,适用于rhel类型的所有分支,这里向系统添加了一个名为ngin的仓库
cat > /etc/yum.repos.d/nginx.repo <<EOF
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/9/x86_64/
gpgcheck=0
enabled=1
EOF
[root@loadbalance ~]# cd /etc/yum.repos.d/
[root@loadbalance yum.repos.d]# vim nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/9/x86_64/
gpgcheck=0
enabled=1
尝试生成仓库索引,如果可以成功,就说明仓库可用
[root@loadbalance ~]# dnf makecache
nginx repo 20 kB/s | 52 kB 00:02
Rocky Linux 9 - BaseOS 4.0 kB/s | 4.1 kB 00:01
Rocky Linux 9 - AppStream 4.3 kB/s | 4.5 kB 00:01
Rocky Linux 9 - Extras 2.9 kB/s | 2.9 kB 00:01
Metadata cache created.
4.3 安装NGINX软件
# 从输出看,已经从nginx仓库中,安装了1.28.0
[root@loadbalance ~]# yum -y install nginx-1.26.2
......
Installed:
nginx-2:1.26.2-2.el9.ngx.x86_64
Complete!
4.4 准备测试页面
NGINX已经安装好了,试试是否能够提供网页,nginx的服务默认需要将网页放到/usr/share/nginx/html目录中,首页需要以index.html或者index.htm命名
准备了一个内容为Hello nginx, I’m China的网页作为其首页
[root@loadbalance ~]# echo "Hello nginx,I'm China" > /usr/share/nginx/html/index.html
[root@loadbalance ~]# cat /usr/share/nginx/html/index.html
Hello nginx,I'm China
4.5 启用并启动服务
用enable --now的语法,将nginx的服务执行enable和start操作,以便于马上启动nginx服务,并通知服务器,将nginx服务在开机时自动启动
[root@loadbalance ~]# systemctl enable nginx --now
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.
[root@loadbalance ~]# systemctl status nginx
● nginx.service - nginx - high performance web server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: disabled)
Active: active (running) since Tue 2025-09-23 20:00:11 CST; 8s ago
Docs: http://nginx.org/en/docs/
Process: 5313 ExecStart=/usr/sbin/nginx -c ${conffile} (code=exited, status=0/SUCCESS)
Main PID: 5314 (nginx)
Tasks: 5 (limit: 10850)
Memory: 4.7M
CPU: 10ms
CGroup: /system.slice/nginx.service
├─5314 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf"
├─5315 "nginx: worker process"
├─5316 "nginx: worker process"
├─5317 "nginx: worker process"
└─5318 "nginx: worker process"
Sep 23 20:00:11 loadbalance.luovip.cn systemd[1]: Starting nginx - high performance web server...
Sep 23 20:00:11 loadbalance.luovip.cn systemd[1]: Started nginx - high performance web server.
4.6 开通防火墙并测试访问
[root@loadbalance ~]# firewall-cmd --add-service=http --permanent
success
[root@loadbalance ~]# firewall-cmd --reload
success
[root@loadbalance ~]# curl http://192.168.8.4
Hello nginx,I'm China
4.7 优雅重载NGINX
如果后续修改了配置文件,可用下面的方法优雅重载nginx,比如下面告诉nginx来重新加载配置文件,而不中断服务
# 给nginx发送reload信号,可以不中断nginx进程的情况下重载配置文件
[root@loadbalance ~]# nginx -s reload