nginx介绍与快速部署


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

文章作者: 罗宇
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 罗宇 !
  目录