23-nginx基础篇

常见Web服务器介绍
常见的Web服务器有很多种,以下是一些较为常见的介绍:
Apache HTTP Server
- 基本信息:Apache HTTP Server是世界上使用最广泛的Web服务器之一,由Apache软件基金会开发和维护。它开源、跨平台,可运行在Windows、Linux、Unix等多种操作系统上。
- 特点
- 高度稳定:能够长时间稳定运行,处理大量的并发请求,很少出现崩溃等问题。
- 模块丰富:拥有大量的模块,可通过模块扩展实现各种功能,如SSL加密、动态内容支持等。
- 配置灵活:管理员可以根据不同的需求对服务器进行详细的配置。
- 应用场景:适用于各种规模的网站,尤其是对稳定性和兼容性要求较高的静态网站、企业级网站等。
Nginx
- 基本信息:Nginx是一款轻量级的高性能Web服务器、反向代理服务器以及电子邮件(IMAP/POP3)代理服务器,由Igor Sysoev开发。它在处理高并发连接方面表现出色,且内存占用少。
- 特点
- 高并发处理能力:能够高效地处理大量并发请求,支持数以万计的并发连接。
- 反向代理功能强大:可以作为反向代理服务器,实现负载均衡、缓存等功能,提高网站的性能和可扩展性。
- 低资源消耗:在处理大量请求时,对服务器的CPU、内存等资源占用较少。
- 应用场景:常用于高并发的网站、大型互联网应用、流媒体服务等场景,如电商网站、视频网站等。
IIS(Internet Information Services)
- 基本信息:IIS是微软公司开发的Web服务器,集成在Windows Server操作系统中。它与Windows系统紧密集成,提供了方便的管理界面和丰富的功能。
- 特点
- 与Windows集成度高:可以方便地利用Windows系统的各种功能和服务,如用户认证、文件系统等。
- 图形化管理界面:通过直观的图形化界面,管理员可以轻松地进行配置和管理。
- 支持多种技术:支持ASP、ASP.NET、PHP等多种动态网页技术。
- 应用场景:主要应用于Windows环境下的企业级网站、基于.NET技术开发的网站等。
Tomcat
- 基本信息:Tomcat是由Apache软件基金会开发的开源Web应用服务器,它是一个轻量级的应用服务器,主要用于运行Java Web应用程序。
- 特点
- 支持Servlet和JSP:能够很好地支持Java Servlet和JavaServer Pages(JSP)技术,为Java Web应用提供运行环境。
- 可扩展性强:可以通过插件和扩展机制,方便地实现功能扩展。
- 开源免费:成本较低,适合各种规模的企业和开发团队使用。
- 应用场景:广泛应用于Java Web开发领域,如企业级应用、电子商务系统、门户网站等。
Lighttpd
- 基本信息:Lighttpd是一款轻量级的开源Web服务器软件,其设计目标是提供高效、安全、快速的Web服务。它在低资源环境和嵌入式系统中表现出色。
- 特点
- 快速高效:具有较低的内存占用和快速的处理能力,能够快速响应客户端请求。
- 支持多种技术:支持FastCGI、CGI、SSL等多种技术,可满足不同的应用需求。
- 配置简单:配置文件简洁明了,易于管理员进行配置和管理。
- 应用场景:适用于对性能要求较高、资源有限的场景,如嵌入式设备、小型网站等。
Apache

Apache是世界主流的Web服务器,世界上大多著名网站都是Apache搭建,优势在于开放源代码,开发维护团队强大、支持跨平台应用(Unix、Linux、Windows),强大的移植性等优点。
Apache属于重量级产品,功能以模块化定制,消耗内存较高,性能稍弱于其他轻量级Web服务器。
Lighttpd

Lighttpd是一款高安全性、快速、且灵活的Web服务器产品,专为高性能环境而设计,相比其他Web服务器,内存占用量小,能够有效管理CPU负载,支持(FastCGI、SCGI,Auth,输出压缩,url重写,别名)等重要功能,是Nginx的重要对手之一。
Tomcat服务器


Tomcat是一个开源、运行基于Java的Web应用软件的容器,Tomcat Server根据servlet和JSP规范执行,但是Tomcat对于平台文件、高并发处理较弱。
要使用Tomcat需要对Java的应用部署有足够的了解。
IBM WebSphere Application Server

WebSphere Applicaiton Server是一种强大的Web应用服务器,基于Java的应用环境、建立、部署和管理网站应用。
Microsoft IIS

微软的IIS是一种灵活,安全易管理的Web服务器,从流媒体到Web应用程序,IIS提供了图形化的管理界面,用于配置和管理网络服务。
IIS是一整套Web组件,包含了Web服务器,FTP服务器,SMTP服务器等常用的网页浏览、文件传输,邮件新闻等功能。
缺点是只能运行在Windows平台,还得购买商业化的操作系统。
Nginx(选它)
Nginx 是一款轻量级、高性能的开源软件,集 Web 服务器、反向代理服务器及电子邮件(IMAP/POP3)代理服务器等多种功能于一身,在互联网领域应用广泛。以下从基本情况、特点、工作原理、应用场景几个方面详细介绍:
基本情况
- 诞生背景:由俄罗斯工程师伊戈尔·赛索耶夫(Igor Sysoev)为应对当时访问量极大的 Rambler.ru 网站而开发,2004 年首次公开发布。
- 开源与跨平台:以开源形式发布,遵循类 BSD 许可证,用户可以自由使用、修改和分发。能在多种操作系统上运行,如 Linux、Windows、Mac OS 等。
特点
- 高并发处理能力:采用事件驱动的异步非阻塞架构,在处理大量并发连接时表现卓越,能够轻松支持数以万计的并发连接,且内存占用少、资源消耗低。例如,在一些大型电商促销活动期间,Nginx 可以稳定地处理海量的用户请求。
- 反向代理和负载均衡:可以作为反向代理服务器,将客户端的请求转发到后端的多个服务器上,实现负载均衡,提高系统的可用性和性能。通过合理分配请求,避免单个服务器负载过高。
- 低内存消耗:Nginx 的设计非常高效,在处理大量请求时,对服务器的 CPU、内存等资源占用较少,能够在有限的硬件资源下提供稳定的服务。
- 热部署:在不停止服务的情况下,可以平滑地升级或更新配置文件,保证服务的连续性,减少对用户的影响。
- 模块化设计:具有高度模块化的结构,用户可以根据需要选择不同的模块来扩展功能,如 SSL 模块、缓存模块等。
工作原理
- 多进程模型:Nginx 有一个主进程(master process)和多个工作进程(worker processes)。主进程负责读取和评估配置文件,管理工作进程;工作进程则负责处理实际的客户端请求。
- 事件驱动机制:工作进程采用事件驱动的方式处理请求,通过异步非阻塞 I/O 模型,在等待某个请求的 I/O 操作完成时,不会阻塞其他请求的处理,从而提高并发处理能力。
应用场景
- 静态资源服务:可以高效地处理静态文件(如 HTML、CSS、JavaScript、图片等)的请求,将这些静态资源快速地返回给客户端,减轻后端服务器的负担。
- 反向代理和负载均衡:作为反向代理服务器,将客户端的请求转发到多个后端服务器上,实现负载均衡。常用于大型网站和应用系统中,提高系统的可用性和性能。
- 缓存加速:可以对经常访问的内容进行缓存,当有相同请求时,直接从缓存中返回结果,减少后端服务器的压力,提高响应速度。
- 流媒体服务:支持对视频、音频等流媒体文件的高效传输和分发,能够处理大量并发的流媒体请求。

Nginx是俄罗斯人Igor Sysoev(伊戈尔·塞索耶夫)开发的一款高性能的HTTP和反向代理服务器。
Nginx以高效的epoll、kqueue、eventport作为网络IO模型,在高并发场景下,Nginx能够轻松支持5w并发连接数的响应,并且消耗的服务器内存、CPU等系统资源消耗却很低,运行非常稳定。
Nginx支持多少并发
Nginx 支持的并发连接数并没有一个固定的数值,它受到多种因素的综合影响,在不同的环境和配置下,其并发处理能力会有很大差异。以下为你详细介绍相关影响因素以及一些常见场景下的并发数据:
影响因素
- 硬件资源
- CPU:CPU 的核心数和处理能力会影响 Nginx 处理并发请求的速度。多核 CPU 可以并行处理多个请求,提高并发处理能力。例如,在高并发场景下,拥有更多核心的服务器能够更高效地运行 Nginx。
- 内存:足够的内存可以保证 Nginx 能够缓存更多的数据,减少磁盘 I/O 操作,从而提高并发处理能力。如果内存不足,可能会导致频繁的磁盘交换,影响性能。
- 网络带宽:网络带宽决定了服务器能够处理的数据传输量。如果网络带宽有限,即使 Nginx 本身具备很高的并发处理能力,也会因为网络瓶颈而无法充分发挥。
- 操作系统:不同的操作系统对网络 I/O 的处理能力不同,会影响 Nginx 的并发性能。例如,Linux 系统采用了高效的网络 I/O 模型(如 epoll),相比 Windows 系统,更适合高并发场景下的 Nginx 运行。
- Nginx 配置
- worker_processes:该参数指定了 Nginx 工作进程的数量。一般将其设置为与服务器 CPU 核心数相同或相近的值,以充分利用 CPU 资源。
- worker_connections:该参数定义了每个工作进程可以同时处理的最大连接数。通过调整这个参数,可以直接影响 Nginx 的并发处理能力。
- 后端服务器性能:当 Nginx 作为反向代理服务器时,后端服务器的性能也会影响整体的并发处理能力。如果后端服务器处理请求的速度较慢,即使 Nginx 能够接收大量的并发请求,也会因为后端服务器的瓶颈而导致性能下降。
常见场景并发数据
- 测试环境:在理想的测试环境中,经过优化配置的 Nginx 服务器,单个工作进程可以处理上万甚至数万的并发连接。例如,在一些性能测试中,单个工作进程在配置合理的情况下,能够处理 5 - 10 万的并发连接。
- 实际生产环境:实际生产环境中,由于受到各种因素的限制,Nginx 支持的并发连接数会有所下降。一般来说,对于普通的 Web 应用,Nginx 可以轻松处理几千到上万的并发连接;对于高并发的大型网站或应用系统,通过合理的硬件配置和优化,Nginx 可以支持数万甚至数十万的并发连接。例如,一些知名的电商网站在促销活动期间,Nginx 能够处理数十万的并发请求。
当前想让nginx支持5万并发,甚至百万级的并发,都是可以的,但需要做很多的优化工作,如
想至少支持5万并发的基本调优 50000万,一定时间内,处理5W,线上企业级配置参考。阿里云上配置参考。
1.服务器内存、CPU硬件支持,如8核16线程、32G内存的服务器
2.磁盘使用SSD、或者购买至少15000转的SAS企业级硬盘,做成RAID 0
3.安装光纤网口
4.使用linux系统,如centos9 ubuntu22.04 +,优化内核参数,对TCP连接的设置
5.优化nginx.conf中并发相关的参数,如等
worker_processes 16;
worker_connections 50000;
6.未完待续,nginx百万级并发优化篇的知识..面试造火箭必备
国内著名站点,新浪博客、网易、淘宝、豆瓣、迅雷等大型网站都在使用Nginx作为Web服务器或是反向代理服务器。
为何选择Nginx

在互联网的快速普及,全球化、物联网的迅速发展,世界排名前3的分别是Apache、IIS、Nginx,而Nginx一直在呈现增长趋势。
在线自动生成nginx配置文件
https://www.digitalocean.com/community/tools/nginx?global.app.lang=zhCN
可以自由选择所需的应用,生成nginx配置作为参考。
第一章、nginx介绍
1.nginx是什么
1.nginx是一个高性能的HTTP服务器、反向代理服务器。
2.主要特点
- 开源源代码
- 高性能,并发性能、处理tcp连接性能极高
- 可靠,服务稳定,得到了全世界的验证。
2.为什么选nginx
1.每一家公司都会用到nginx
2.技术成熟,是企业最常见且必须的工具
3.适用于任意架构,单机环境,集群环境,微服务架构、云原生架构等
3.nginx重要特性
1.官网直接获取源码,免费用,讲道理这种高性能的软件,是很贵的。
2.高性能,官网提供测试数据,性能残暴,1秒内能支持5万个tcp连接
3.消耗资源很低,有数据证明在生产环境下3万左右的并发tcp连接,开启10个nginx进程消耗不到150M。
4.有能力可以自己对nginx进行二次开发,如淘宝的tengine。
5.模块化管理,nginx有大量的模块(插件),运维根据公司的业务需求,按需编译安装设置即可。
模块插件是为了提供额外的功能,如
- url重写,根据域名、url、客户端的不同,转发http请求到不同的机器
- https证书的支持
- 支持静态资源压缩
- 支持热部署、无须重启,更新配置文件
- 支持二次开发新插件
4.企业用nginx做什么
1.提供静态页面展示,网页服务
2.提供多个网站、多个域名的网页服务
3.提供反向代理服务(结合动态应用程序)
4.提供简单资源下载服务(密码认证)
5.用户行为分析(日志功能)
Nginx 是一款轻量级的高性能 Web 服务器、反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在企业场景中应用广泛,主要用于以下几个方面:
静态资源服务
- 网站页面展示:企业的官方网站通常包含大量的静态资源,如 HTML、CSS、JavaScript 文件,以及图片、视频等。Nginx 能够高效地处理这些静态文件的请求,将它们快速地传输给客户端浏览器。例如,一家电商企业的商品展示页面,用户访问时,Nginx 可以迅速响应并提供页面所需的各类静态资源,确保页面快速加载,提升用户体验。
- 文件下载服务:企业可能会提供一些文件供用户下载,如软件安装包、技术文档等。Nginx 可以作为文件下载服务器,通过配置合适的缓存策略和带宽限制,确保文件下载的稳定性和高效性。
反向代理
- 隐藏真实服务器:在企业网络中,为了提高安全性,通常会使用反向代理来隐藏内部服务器的真实 IP 地址。Nginx 可以作为反向代理服务器,接收客户端的请求,并将请求转发到内部的应用服务器上,客户端只能看到 Nginx 服务器的 IP 地址,从而保护了内部服务器的安全。例如,企业的 Web 应用部署在内部局域网中,通过 Nginx 反向代理,外部用户只能访问到 Nginx 服务器,无法直接访问内部应用服务器。
- 负载均衡:当企业的应用访问量较大时,单台服务器可能无法满足需求,此时可以使用多台服务器来分担负载。Nginx 可以通过负载均衡算法(如轮询、加权轮询、IP 哈希等)将客户端的请求均匀地分发到多个后端服务器上,提高系统的并发处理能力和可用性。例如,一家在线教育企业在课程直播期间,会有大量用户同时访问,通过 Nginx 的负载均衡功能,可以将用户请求分配到多个服务器上,避免单台服务器过载。
缓存服务
- 减少后端服务器压力:Nginx 可以对经常访问的内容进行缓存,当客户端再次请求相同的内容时,Nginx 可以直接从缓存中返回响应,而不需要再次访问后端服务器。这样可以大大减少后端服务器的负载,提高系统的响应速度。例如,企业的新闻网站,对于一些热门新闻文章,Nginx 可以将其缓存起来,当有新用户访问时,直接从缓存中提供文章内容,减少数据库查询和服务器处理时间。
- 加速内容访问:通过在企业网络的边缘节点部署 Nginx 缓存服务器,可以将内容缓存到离用户最近的位置,减少数据传输的延迟,提高用户访问内容的速度。
虚拟主机
- 多个网站共享服务器资源:企业可能拥有多个不同的网站或应用,使用 Nginx 的虚拟主机功能,可以在一台服务器上同时托管多个网站,每个网站可以有独立的域名和配置,实现资源的共享和隔离。例如,一家集团企业旗下有多个子公司,每个子公司都有自己的官方网站,通过 Nginx 的虚拟主机功能,可以将这些网站部署在同一台服务器上,降低服务器成本。
- 灵活配置和管理:Nginx 允许管理员根据不同的需求对每个虚拟主机进行独立的配置,如端口号、SSL 证书、访问日志等,方便对多个网站进行统一管理。
安全防护
- 访问控制:Nginx 可以通过配置访问控制规则,限制特定 IP 地址或 IP 段的访问,防止恶意攻击和非法访问。例如,企业可以设置只允许内部网络的 IP 地址访问某些敏感页面,或者限制来自特定国家或地区的访问。
- 防止 DDoS 攻击:Nginx 可以通过限制连接速率、并发连接数等方式,对 DDoS(分布式拒绝服务)攻击进行一定程度的防护。当检测到异常的大量请求时,Nginx 可以自动拒绝这些请求,保护后端服务器的正常运行。
第二章、nginx进程架构
nginx是多进程架构,当启动nginx会使用root创建master进程,由master进程创建多个worker进程。
[root@yuchao-tx-server ~]#ps -ef|grep nginx |grep -v grep
root 8382 1 0 5月01 ? 00:00:00 nginx: master process /usr/sbin/nginx
wordpre+ 16566 8382 0 5月01 ? 00:00:02 nginx: worker process
Nginx采用多进程架构,这种架构设计有助于提升服务器的性能、稳定性和可维护性。Nginx主要包含两种类型的进程:一个主进程(Master Process)和多个工作进程(Worker Processes),下面为你详细介绍:
主进程(Master Process)
- 作用
- 读取并验证配置文件:在Nginx启动时,主进程会读取配置文件(通常是
nginx.conf),检查配置文件的语法是否正确,确保各项配置参数合法有效。如果配置文件存在错误,主进程会输出相应的错误信息,阻止Nginx启动。 - 管理工作进程:主进程负责创建、监控和管理工作进程的生命周期。它可以根据系统负载、配置变化等情况,动态地调整工作进程的数量。例如,当需要增加处理能力时,主进程可以创建新的工作进程;当某个工作进程出现异常时,主进程会及时将其终止并重新创建一个新的工作进程。
- 信号处理:主进程负责接收外界发送的各种信号,并根据信号的类型执行相应的操作。例如,接收到
SIGHUP信号时,主进程会重新加载配置文件,实现平滑的配置更新,而不会中断正在处理的请求。
- 读取并验证配置文件:在Nginx启动时,主进程会读取配置文件(通常是
- 工作方式:主进程通常处于特权模式下运行,它不直接处理客户端的请求,而是专注于管理和协调工作进程。
工作进程(Worker Processes)
- 作用
- 处理客户端请求:工作进程是实际处理客户端请求的进程。当有客户端连接到Nginx服务器时,工作进程会接收请求,根据配置文件的规则进行处理,如返回静态文件、转发请求到后端服务器等。
- 执行具体任务:工作进程负责执行与请求处理相关的具体任务,包括读取请求头、解析请求内容、访问文件系统、与后端服务器进行通信等。它们通过高效的事件驱动机制,实现高并发的请求处理。
- 工作方式
- 独立运行:每个工作进程都是独立的,它们之间相互隔离,一个工作进程的崩溃不会影响其他工作进程的正常运行。这种设计提高了系统的稳定性和可靠性。
- 事件驱动:工作进程采用事件驱动的方式来处理请求,使用
epoll(Linux系统)或kqueue(FreeBSD、macOS系统)等高效的事件通知机制,能够在不创建大量线程或进程的情况下,处理大量的并发连接。 - 数量可配置:工作进程的数量可以通过配置文件进行调整。通常建议将工作进程的数量设置为与服务器的CPU核心数相等或相近,以充分利用服务器的硬件资源。
缓存加载进程(Cache Loader Process)和缓存管理器进程(Cache Manager Process)
- 缓存加载进程(Cache Loader Process)
- 作用:主要负责在Nginx启动时,将磁盘上的缓存数据加载到内存中,以便后续工作进程可以快速访问缓存内容。这样可以减少工作进程在处理请求时访问磁盘的时间,提高缓存的命中率和响应速度。
- 缓存管理器进程(Cache Manager Process)
- 作用:定期检查缓存数据的状态,清理过期的缓存文件,释放磁盘空间。同时,它还会根据缓存的使用情况,对缓存进行优化和整理,确保缓存系统的高效运行。
架构示意图
+-------------------+
| Master Process |
| |
| - 读取并验证配置 |
| - 管理工作进程 |
| - 信号处理 |
+-------------------+
|
| 管理
v
+-------------------+
| Worker Processes |
| |
| - 处理客户端请求 |
| - 执行具体任务 |
+-------------------+
| Cache Loader |
| - 加载缓存数据 |
+-------------------+
| Cache Manager |
| - 管理缓存清理 |
+-------------------+
Nginx的进程架构通过主进程的集中管理和工作进程的分布式处理,实现了高效、稳定和可扩展的服务器性能。缓存加载进程和缓存管理器进程则进一步优化了缓存系统的性能和管理。
1.master主进程原理
1.启动时检查nginx.conf是否正确,语法错误;
2.根据配置文件的参数创建、且监控worker进程的数量和状态;
3.监听socket,接收client发起的请求,然后worker竞争抢夺链接,获胜的可以处理且响应请求。
4.接收运维超哥发送的管理nginx进程的信号,并且将信号通知到worker进程。
5.如果运维超哥发送了reload命令,则读取新配置文件,创建新的worker进程,结束旧的worker进程。

Nginx 的 Master Process(主进程)在整个 Nginx 架构中起着核心的管理和协调作用,下面详细介绍其工作原理:
启动阶段
1. 初始化环境
- 主进程启动后,会进行一系列的初始化操作,包括设置进程的运行环境,如用户权限、工作目录等。它会根据配置文件中的
user指令设置运行 Nginx 进程的用户和用户组,以确保进程以合适的权限运行,提高系统安全性。2. 解析配置文件
- 主进程会读取并解析 Nginx 的配置文件(通常是
nginx.conf),检查配置文件的语法是否正确。它会将配置文件中的各项指令解析成内部的数据结构,以便后续使用。如果配置文件存在语法错误,主进程会输出详细的错误信息并终止启动过程。3. 创建监听套接字
- 根据配置文件中指定的监听地址和端口,主进程会创建相应的监听套接字。这些套接字用于接收客户端的连接请求。例如,配置文件中设置
listen 80;,主进程会创建一个监听在 80 端口的 TCP 套接字。4. 创建工作进程
- 主进程根据配置文件中指定的工作进程数量(通过
worker_processes指令设置),使用fork()系统调用创建多个工作进程。每个工作进程都会继承主进程创建的监听套接字,从而可以处理客户端的连接请求。
运行阶段
1. 信号处理
- 主进程会持续监听系统信号,根据接收到的不同信号执行相应的操作:
- SIGHUP(重新加载配置):当主进程接收到
SIGHUP信号时,它会重新读取配置文件,并验证配置的有效性。如果配置文件合法,主进程会逐步通知旧的工作进程停止接收新的连接,同时创建新的工作进程,使用新的配置处理后续的请求。旧的工作进程在处理完已有的连接后会自动退出,从而实现平滑的配置更新。- nginx -s reload
- SIGTERM 或 SIGINT(正常关闭):接收到这两个信号时,主进程会向所有工作进程发送
SIGTERM信号,通知它们正常关闭。工作进程会停止接收新的连接,并在处理完当前正在处理的请求后退出。主进程在所有工作进程退出后,也会退出。- nginx -s stop
- SIGQUIT(优雅关闭):主进程接收到
SIGQUIT信号后,会通知工作进程优雅地关闭。工作进程会停止接收新的连接,等待当前连接处理完成后再退出,同时主进程会等待所有工作进程退出后才退出。- nginx -s quit
- SIGUSR1(重新打开日志文件):当需要对 Nginx 的日志文件进行轮转(如按天分割日志)时,可以向主进程发送
SIGUSR1信号。主进程会通知所有工作进程关闭当前的日志文件,并重新打开新的日志文件,从而实现日志文件的切换。- 学到日志再说。
2. 管理工作进程
- 学到日志再说。
- SIGHUP(重新加载配置):当主进程接收到
- 监控状态:主进程会实时监控工作进程的状态。通过
waitpid()等系统调用,主进程可以得知工作进程是否正常运行。如果某个工作进程意外退出(如由于程序崩溃),主进程会收到相应的信号,并立即创建一个新的工作进程来替代它,以保证系统的稳定性和可用性。 - 动态调整数量:在某些情况下,主进程可以根据系统的负载情况或管理员的配置动态调整工作进程的数量。例如,当系统负载升高时,可以通过修改配置文件并发送
SIGHUP信号,让主进程创建更多的工作进程来提高处理能力;当负载降低时,可以减少工作进程的数量以节省系统资源。
关闭阶段
- 当主进程接收到关闭信号(如
SIGTERM、SIGINT或SIGQUIT)时,它会进入关闭流程。首先,主进程会向所有工作进程发送关闭信号,通知它们停止接收新的连接,并处理完当前的请求。然后,主进程会等待所有工作进程正常退出。当所有工作进程都退出后,主进程会关闭监听套接字,释放相关的系统资源,最后退出。
通过以上的工作原理,Nginx 的主进程实现了对整个 Nginx 服务器的高效管理和稳定运行,确保了系统在各种情况下都能正常工作。
事件驱动模型
事件驱动模型是一种在计算机编程和系统设计中广泛使用的编程范式,它以事件的发生作为程序执行流程的主要驱动因素。下面从基本概念、工作原理、优势、应用场景等多个方面详细介绍如何理解事件驱动模型。
基本概念
- 事件:可以把事件看作是系统中发生的特定事情或状态变化。比如在图形用户界面(GUI)程序里,用户点击按钮、按下键盘按键就是事件;在网络编程中,客户端发起连接请求、服务器接收到数据也属于事件。
- 事件源:产生事件的对象或实体。例如在 GUI 中,按钮、文本框等控件就是事件源;在网络编程中,套接字就是事件源,它会产生连接、读写等事件。
- 事件处理器:负责处理特定事件的代码块或函数。当事件发生时,系统会调用相应的事件处理器来执行特定的操作。例如,当用户点击按钮时,与之关联的事件处理器会被触发,执行按钮点击后的业务逻辑。
工作原理
事件驱动模型的工作流程一般包含以下几个步骤:
- 事件注册:程序在初始化阶段会将事件处理器与特定的事件源和事件类型进行关联。例如,在一个 Web 服务器中,会将处理客户端连接请求的函数注册到监听套接字的 “新连接事件” 上。
- 事件循环:程序进入一个无限循环,不断地检查是否有事件发生。这个循环会持续运行,直到程序终止。在事件循环中,通常会使用某种机制(如操作系统提供的 I/O 多路复用技术,像 Linux 下的
epoll、Windows 下的IOCP)来高效地等待事件的到来。 - 事件检测与分发:当事件发生时,事件循环会检测到该事件,并根据事件的类型和事件源,将其分发给对应的事件处理器进行处理。
- 事件处理:事件处理器接收到事件后,会执行相应的业务逻辑。处理完成后,程序会继续回到事件循环,等待下一个事件的发生。
事件驱动模型和 epoll 的联系与区别
- 联系
- epoll 是实现事件驱动模型的一种具体技术手段,它为事件驱动模型提供了高效的事件检测机制。在 Linux 系统中,很多采用事件驱动模型的网络应用(如 Nginx、Redis 等)都使用 epoll 来处理大量并发连接。
- epoll 帮助事件驱动模型实现了高效的事件循环和事件分发,使得程序能够及时响应各种事件的发生。
- 区别
- 概念范畴:事件驱动模型是一种编程范式,是一种抽象的设计思想,适用于各种场景和操作系统;而 epoll 是 Linux 系统特有的一种系统调用和机制,是实现事件驱动模型的具体技术。
- 跨平台性:事件驱动模型可以通过不同的技术在不同的操作系统上实现,如 Windows 系统的
IOCP、BSD 系统的kqueue;而 epoll 只能在 Linux 系统上使用。
麦当劳和事件驱动
可以通过将事件驱动模型中的epoll与麦当劳点餐流程进行对比,来更形象地理解epoll的工作机制。下面从多个方面进行详细类比:
整体流程类比
- 麦当劳点餐流程 顾客来到麦当劳餐厅,在点餐区排队等待点餐。收银员负责接收顾客的点餐需求,当轮到某位顾客时,收银员会为其服务,记录点餐内容并告知后厨准备相应的餐品。后厨根据订单制作餐品,完成后通知前台取餐,收银员再将餐品交给对应的顾客。
- epoll事件驱动模型流程
程序创建一个epoll实例,就像麦当劳有一个专门的点餐区域。将需要监听的文件描述符(如套接字)及其对应的事件(如可读、可写)添加到epoll实例中,如同顾客在排队等待点餐。程序进入事件循环,通过
epoll_wait函数等待事件发生,就像收银员等待顾客点餐。当有事件发生时,epoll_wait返回就绪的文件描述符列表,程序根据事件类型调用相应的事件处理程序,类似于收银员根据顾客的点餐需求进行处理,后厨制作餐品并通知前台取餐,最后将餐品交给顾客。
具体环节类比
1. 事件注册 - 顾客排队
- epoll:使用
epoll_ctl函数将需要监听的文件描述符和对应的事件添加到epoll实例中。例如,在一个网络服务器中,将监听套接字的可读事件(新连接请求)注册到epoll实例。#include <sys/epoll.h> int epoll_fd = epoll_create(10); // 创建epoll实例 struct epoll_event ev; ev.events = EPOLLIN; // 可读事件 ev.data.fd = listen_fd; // 监听套接字 epoll_ctl(epoll_fd, EPOLL_CTL_ADD, listen_fd, &ev); // 注册事件 - 麦当劳:顾客来到餐厅后,在点餐区排队等待。每个顾客都代表一个潜在的“事件”,他们的点餐需求就是不同的“事件类型”。
2. 事件循环 - 收银员等待
- epoll:程序通过
epoll_wait函数进入事件循环,阻塞等待事件发生。当有事件发生时,epoll_wait返回就绪的文件描述符列表。#define MAX_EVENTS 10 struct epoll_event events[MAX_EVENTS]; while (1) { int nfds = epoll_wait(epoll_fd, events, MAX_EVENTS, -1); // 等待事件 for (int i = 0; i < nfds; i++) { // 处理事件 } } - 麦当劳:收银员在点餐台持续等待顾客上前点餐。只要有顾客来到点餐台,收银员就会开始为其服务。
3. 事件分发与处理 - 收银员服务与后厨制作餐品
- epoll:当
epoll_wait返回时,程序会根据事件类型(如EPOLLIN、EPOLLOUT)调用相应的事件处理程序。例如,对于新连接事件,接受连接并将新的套接字添加到epoll实例中;对于可读事件,读取数据并进行处理。if (events[i].data.fd == listen_fd) { // 处理新连接事件 int conn_fd = accept(listen_fd, ...); struct epoll_event new_ev; new_ev.events = EPOLLIN; new_ev.data.fd = conn_fd; epoll_ctl(epoll_fd, EPOLL_CTL_ADD, conn_fd, &new_ev); } else if (events[i].events & EPOLLIN) { // 处理可读事件 char buffer[1024]; int n = read(events[i].data.fd, buffer, sizeof(buffer)); // 处理读取的数据 } - 麦当劳:当轮到某位顾客时,收银员会根据顾客的点餐需求进行记录,并将订单信息传递给后厨。后厨根据订单制作相应的餐品,制作完成后通知前台取餐,收银员再将餐品交给顾客。
4. 事件移除 - 顾客离开
- epoll:当某个文件描述符不再需要监听时,使用
epoll_ctl函数将其从epoll实例中移除。epoll_ctl(epoll_fd, EPOLL_CTL_DEL, fd, NULL); - 麦当劳:顾客拿到餐品后离开餐厅,不再占用排队的位置。
优势类比
- epoll的高效性:epoll采用事件驱动的方式,只关注那些有事件发生的文件描述符,避免了传统
select和poll机制的轮询开销,能够高效地处理大量并发连接。 - 麦当劳的高效服务:收银员只需要关注正在排队等待点餐的顾客,当有新顾客到来时及时服务,而不需要不断地询问所有顾客是否要点餐,从而提高了服务效率,能够同时处理大量顾客的点餐需求。
理解epoll
以下将详细为你图解 Nginx Worker 进程与 Epoll 的工作原理,包括原理概述、关键流程以及对应的 mermaid 图。
原理概述
Nginx 是一个高性能的 Web 服务器,采用多进程模型,其中包含一个主进程(Master Process)和多个工作进程(Worker Process)。每个 Worker 进程独立处理客户端请求,并且使用 Epoll 作为 I/O 多路复用机制来高效地处理大量并发连接。
Epoll 是 Linux 内核提供的一种 I/O 事件通知机制,它通过事件驱动的方式,允许程序在多个文件描述符上等待 I/O 事件的发生,而不需要像传统的 select 和 poll 那样轮询所有的文件描述符。
关键流程
1. 主进程初始化
主进程负责读取配置文件、创建监听套接字等初始化工作,然后 fork 出多个 Worker 进程。
2. Worker 进程启动
每个 Worker 进程创建一个 Epoll 实例,并将监听套接字添加到 Epoll 实例中进行监控。
3. 事件循环
Worker 进程进入一个无限循环,不断调用 epoll_wait 函数等待事件的发生。当有新的连接请求或者已连接的套接字有数据可读/可写时,epoll_wait 函数会返回相应的事件列表。
4. 事件处理
Worker 进程遍历事件列表,根据事件类型(如 EPOLLIN 表示可读,EPOLLOUT 表示可写)进行相应的处理。对于新的连接请求,接受连接并将新的套接字添加到 Epoll 实例中进行监控;对于已连接的套接字,读取或写入数据。
图解
graph LR
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
classDef io fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;
subgraph Master Process
style Master Process fill:#ffffff,stroke:#000000,stroke-width:2px
A(读取配置文件):::process --> B(创建监听套接字):::process
B --> C(fork 多个 Worker 进程):::process
end
subgraph Worker Process 1
style Worker Process 1 fill:#ffffff,stroke:#000000,stroke-width:2px
D(创建 Epoll 实例):::process --> E(将监听套接字添加到 Epoll 实例):::process
E --> F(进入事件循环):::process
F --> G{epoll_wait 返回事件列表?}:::process
G -- 是 --> H(遍历事件列表):::process
H --> I{事件类型是新连接请求?}:::process
I -- 是 --> J(接受连接):::process
J --> K(将新套接字添加到 Epoll 实例):::process
I -- 否 --> L(处理读写事件):::process
G -- 否 --> F
K --> F
L --> F
end
subgraph Worker Process 2
style Worker Process 2 fill:#ffffff,stroke:#000000,stroke-width:2px
D2(创建 Epoll 实例):::process --> E2(将监听套接字添加到 Epoll 实例):::process
E2 --> F2(进入事件循环):::process
F2 --> G2{epoll_wait 返回事件列表?}:::process
G2 -- 是 --> H2(遍历事件列表):::process
H2 --> I2{事件类型是新连接请求?}:::process
I2 -- 是 --> J2(接受连接):::process
J2 --> K2(将新套接字添加到 Epoll 实例):::process
I2 -- 否 --> L2(处理读写事件):::process
G2 -- 否 --> F2
K2 --> F2
L2 --> F2
end
C --> D
C --> D2
M(客户端):::io --> B(监听套接字):::process
M --> J(新连接套接字):::process
M --> J2(新连接套接字):::process
通过上述的图解和伪代码示例,你可以更清晰地理解 Nginx Worker 进程与 Epoll 的工作原理。
2.Worker Processes工作进程原理
1.实际处理client网络请求的是worker
2.master根据nginx.conf决定worker的数量
3.有client用户请求到达时,worker之间进程竞争,获胜者和client建立连接且处理用户请求;
4.接收用户请求后,若需要代理转发给后端,则后端处理完毕后接收处理结果,再响应给用户
5.接收并处理master发来的进程信号,如启动、重启、重载、停止。
Nginx 的 Worker Processes(工作进程)是实际处理客户端请求的核心组件,以下详细介绍其工作原理:
初始化与继承
- 从主进程继承:在 Nginx 启动时,Master Process(主进程)通过
fork()系统调用创建多个 Worker Processes。每个 Worker Process 会继承主进程创建的监听套接字,这些套接字绑定到配置文件中指定的 IP 地址和端口,用于接收客户端的连接请求。 - 自身初始化:Worker Process 创建后,会进行一些自身的初始化操作,如设置进程的信号处理机制、分配内存等。它会忽略一些信号(如
SIGHUP),因为这些信号是由主进程处理的,而专注于处理与请求处理相关的任务。
事件驱动模型
- 高效的事件通知机制:Worker Process 采用事件驱动的方式来处理请求,利用操作系统提供的高效事件通知机制,如 Linux 系统的
epoll、FreeBSD 和 macOS 系统的kqueue。这些机制允许 Worker Process 在一个线程中同时监听多个套接字的事件(如连接建立、数据可读、数据可写等),而无需为每个连接创建一个单独的线程或进程,从而大大提高了系统的并发处理能力。 - 事件循环:Worker Process 会进入一个无限的事件循环中,不断地从事件通知机制中获取就绪的事件,并根据事件的类型执行相应的处理逻辑。例如,当有新的客户端连接到达时,Worker Process 会接收到
EPOLLIN事件(对于epoll机制),然后调用相应的函数来处理这个新连接。
处理客户端请求
1. 接受连接
- 当有客户端发起连接请求时,监听套接字会产生可读事件,Worker Process 会从事件循环中获取这个事件,并调用
accept()系统调用接受新的连接。此时,会创建一个新的连接套接字,用于与客户端进行数据交互。2. 读取请求
- 连接建立后,Worker Process 会开始读取客户端发送的请求数据。它会从连接套接字中读取请求头和请求体,将其解析成内部的数据结构,以便后续处理。在读取过程中,Worker Process 会根据 HTTP 协议的规则进行解析,提取出请求的方法(如
GET、POST)、请求的 URI、请求头字段等信息。3. 处理请求
- 静态资源处理:如果请求的是静态资源(如 HTML 文件、图片、CSS 文件等),Worker Process 会根据配置文件中指定的文件路径,从磁盘上读取相应的文件,并将文件内容发送给客户端。在读取文件时,会使用
sendfile()系统调用,避免了数据在用户空间和内核空间之间的多次拷贝,提高了传输效率。 - 反向代理:如果配置了反向代理,Worker Process 会根据配置将请求转发到后端的服务器。它会与后端服务器建立连接,将客户端的请求数据发送给后端服务器,并接收后端服务器的响应。然后,将后端服务器的响应返回给客户端。
4. 发送响应
- 处理完请求后,Worker Process 会根据处理结果生成 HTTP 响应头和响应体,并通过连接套接字将响应数据发送给客户端。在发送响应时,会根据客户端的请求和处理结果设置合适的响应状态码(如 200、404、500 等)、响应头字段(如
Content-Type、Content-Length等)。
并发处理与负载均衡
- 并发处理:由于采用了事件驱动模型,一个 Worker Process 可以同时处理多个客户端连接。当一个连接上的数据处理暂时阻塞时(如等待磁盘 I/O 或后端服务器响应),Worker Process 可以立即处理其他连接上的事件,从而实现高效的并发处理。
- 负载均衡:多个 Worker Process 之间通过共享监听套接字的方式来实现负载均衡。当有新的客户端连接到达时,操作系统会将连接请求分配给其中一个 Worker Process 进行处理,从而将负载均匀地分布到各个 Worker Process 上。
资源管理与退出
- 资源管理:Worker Process 在运行过程中会管理自己的资源,如内存、文件描述符等。它会在处理完一个请求后,及时释放相关的资源,避免资源泄漏。例如,在关闭一个连接后,会关闭相应的连接套接字,释放分配的内存。
- 退出处理:当主进程接收到关闭信号并通知 Worker Process 退出时,Worker Process 会停止接收新的连接,并处理完当前正在处理的请求。然后,释放所有占用的资源,关闭监听套接字和其他文件描述符,最后退出进程。
综上所述,Nginx 的 Worker Processes 通过事件驱动模型和高效的请求处理机制,实现了高并发、高性能的服务器功能。
2.nginx进程间通信图

以下为你详细介绍 Nginx 进程间通信的方式,并给出对应的 mermaid 图代码及解释。
Nginx 进程间通信方式概述
Nginx 主要包含主进程(Master Process)和多个工作进程(Worker Processes),此外还有可能存在缓存加载进程(Cache Loader Process)和缓存管理进程(Cache Manager Process)。它们之间的通信方式和目的如下:
- 主进程与工作进程:主进程主要负责管理工作进程的生命周期,通过信号进行通信。例如,主进程可以向工作进程发送信号来控制其启动、停止、重新加载配置等操作。
- 缓存加载进程、缓存管理进程与主进程:这两个进程由主进程创建和管理,它们之间的通信也主要是基于主进程对它们的状态监控和控制,也会用到信号机制。
mermaid 图代码
graph LR
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A(Master Process):::process -->|创建并监控| B(Worker Process 1):::process
A -->|创建并监控| C(Worker Process 2):::process
A -->|创建并监控| D(Worker Process N):::process
A -->|创建并管理| E(Cache Loader Process):::process
A -->|创建并管理| F(Cache Manager Process):::process
B -.->|信号: 状态报告| A
C -.->|信号: 状态报告| A
D -.->|信号: 状态报告| A
E -.->|信号: 状态报告| A
F -.->|信号: 状态报告| A
A -.->|信号: 控制指令| B
A -.->|信号: 控制指令| C
A -.->|信号: 控制指令| D
A -.->|信号: 控制指令| E
A -.->|信号: 控制指令| F
B <-->|共享监听套接字| G(客户端请求)
C <-->|共享监听套接字| G
D <-->|共享监听套接字| G
代码解释
- 节点定义:
A代表主进程(Master Process),它是整个 Nginx 进程管理的核心。B、C、D分别代表多个工作进程(Worker Process),这些进程实际处理客户端的请求。E是缓存加载进程(Cache Loader Process),负责在启动时加载缓存数据。F是缓存管理进程(Cache Manager Process),负责管理缓存的清理和优化。G表示客户端请求,它通过共享监听套接字与各个工作进程进行交互。
- 进程创建关系:
- 主进程通过实线箭头创建并监控工作进程、缓存加载进程和缓存管理进程。这体现了主进程在 Nginx 架构中的管理地位。
- 信号通信关系:
- 工作进程、缓存加载进程和缓存管理进程通过虚线箭头向主进程发送状态报告信号,让主进程了解它们的运行状态。
- 主进程通过虚线箭头向这些进程发送控制指令信号,实现对它们的启动、停止、重新加载等操作。
- 客户端请求交互:
- 各个工作进程通过共享监听套接字与客户端请求进行双向交互,处理客户端的连接和请求。
这个图清晰地展示了 Nginx 不同进程之间的创建、管理和通信关系,以及它们与客户端请求的交互方式。
3.nginx处理http请求

以下使用 Mermaid 绘制 Nginx 处理 HTTP 请求的流程图,同时给出对应的代码和详细解释。
Mermaid 代码
graph LR
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A(客户端发起请求):::process --> B(监听端口接收连接):::process
B --> C{分配工作进程}:::process
C -->|工作进程1| D1(读取请求头):::process
C -->|工作进程2| D2(读取请求头):::process
C -->|工作进程N| D3(读取请求头):::process
D1 --> E1(解析请求头):::process
D2 --> E2(解析请求头):::process
D3 --> E3(解析请求头):::process
E1 --> F1{匹配虚拟主机}:::process
E2 --> F2{匹配虚拟主机}:::process
E3 --> F3{匹配虚拟主机}:::process
F1 --> G1{匹配Location}:::process
F2 --> G2{匹配Location}:::process
F3 --> G3{匹配Location}:::process
G1 --> H1{处理方式}:::process
G2 --> H2{处理方式}:::process
G3 --> H3{处理方式}:::process
H1 -->|静态资源| I1(读取静态文件):::process
H1 -->|反向代理| J1(转发请求到后端服务器):::process
H1 -->|其他模块| K1(与应用服务器通信):::process
H2 -->|静态资源| I2(读取静态文件):::process
H2 -->|反向代理| J2(转发请求到后端服务器):::process
H2 -->|其他模块| K2(与应用服务器通信):::process
H3 -->|静态资源| I3(读取静态文件):::process
H3 -->|反向代理| J3(转发请求到后端服务器):::process
H3 -->|其他模块| K3(与应用服务器通信):::process
I1 --> L1(生成响应):::process
J1 --> L1
K1 --> L1
I2 --> L2(生成响应):::process
J2 --> L2
K2 --> L2
I3 --> L3(生成响应):::process
J3 --> L3
K3 --> L3
L1 --> M1(发送响应):::process
L2 --> M2(发送响应):::process
L3 --> M3(发送响应):::process
M1 --> N1{是否保持连接}:::process
M2 --> N2{是否保持连接}:::process
M3 --> N3{是否保持连接}:::process
N1 -->|是| B
N1 -->|否| O1(关闭连接):::process
N2 -->|是| B
N2 -->|否| O2(关闭连接):::process
N3 -->|是| B
N3 -->|否| O3(关闭连接):::process
代码解释
- 客户端发起请求:客户端(如浏览器)向 Nginx 服务器发起 HTTP 请求。
- 监听端口接收连接:Nginx 主进程根据配置监听指定的端口,等待客户端连接请求的到来。
- 分配工作进程:操作系统将连接请求分配给某个工作进程,多个工作进程共享监听套接字实现负载均衡。
- 读取请求头:工作进程从连接套接字中读取客户端发送的 HTTP 请求头。
- 解析请求头:对读取到的请求头进行解析,提取请求方法、URI、协议版本等关键信息。
- 匹配虚拟主机:根据请求头中的
Host字段,在配置文件中查找匹配的虚拟主机配置。 - 匹配 Location:在确定虚拟主机后,根据请求的 URI 查找匹配的
location块,location块定义了不同 URI 路径的处理规则。 - 处理方式选择:根据
location块的配置,决定请求的处理方式,可能是静态资源处理、反向代理或其他模块处理。 - 具体处理操作
- 静态资源:工作进程从磁盘读取相应的静态文件。
- 反向代理:将请求转发到后端服务器。
- 其他模块:与应用服务器(如 FastCGI、uWSGI 服务器)进行通信。
- 生成响应:根据处理结果构建 HTTP 响应头和响应体。
- 发送响应:将生成的响应通过连接套接字发送给客户端。
- 是否保持连接:根据 HTTP 协议的
Connection头字段和配置决定是否保持连接。如果保持连接,则继续等待下一个请求;否则关闭连接。
该流程图清晰地展示了 Nginx 处理 HTTP 请求的完整流程,包括请求接收、解析、处理、响应生成和发送等关键步骤。
4.nginx重要模块
https://nginx.org/en/docs/index.html
https://nginx.org/en/linux_packages.html#Ubuntu
https://nginx.org/en/docs/configure.html 源码编译nginx,添加模块,添加参数。
以下为你展示 Nginx 中一些重要模块及其关系的 Mermaid 图,同时给出相应的代码和解释。Nginx 的这些重要模块在处理 HTTP 请求、实现负载均衡、保障安全等方面发挥着关键作用。
Mermaid 代码
graph LR
classDef module fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A(核心模块):::module --> B(HTTP 模块):::module
A --> C(邮件模块):::module
A --> D(流模块):::module
B --> B1(HTTP 核心模块):::module
B --> B2(HTTP 日志模块):::module
B --> B3(HTTP 缓存模块):::module
B --> B4(HTTP 代理模块):::module
B --> B5(HTTP 负载均衡模块):::module
B --> B6(HTTP 安全模块):::module
B4 --> B41(反向代理):::module
B4 --> B42(正向代理):::module
B5 --> B51(轮询算法):::module
B5 --> B52(加权轮询算法):::module
B5 --> B53(IP 哈希算法):::module
B6 --> B61(访问控制):::module
B6 --> B62(SSL/TLS 加密):::module
B6 --> B63(防 DDoS 攻击):::module
C --> C1(IMAP 代理模块):::module
C --> C2(POP3 代理模块):::module
D --> D1(TCP 代理模块):::module
D --> D2(UDP 代理模块):::module
代码解释
核心模块
- 是 Nginx 的基础,为其他模块提供基本的功能和服务,如进程管理、配置解析、信号处理等,是整个 Nginx 架构的基石,它与 HTTP 模块、邮件模块、流模块等主要功能模块相连,为它们提供底层支持。
HTTP 模块
- HTTP 核心模块:负责处理 HTTP 请求的基本流程,包括请求解析、路由匹配、响应生成等,是 HTTP 处理的核心部分。
- HTTP 日志模块:用于记录 HTTP 请求和响应的相关信息,如访问时间、请求 URL、响应状态码等,方便后续的分析和排查问题。
- HTTP 缓存模块:对经常访问的内容进行缓存,减少后端服务器的负载,提高响应速度,当有相同请求时可直接从缓存中获取响应。
- HTTP 代理模块
- 反向代理:隐藏后端服务器的真实 IP 地址,接收客户端请求并转发到后端服务器,常用于保护内部服务器安全和实现负载均衡。
- 正向代理:客户端通过正向代理服务器访问外部资源,可用于突破网络限制等。
- HTTP 负载均衡模块
- 轮询算法:按顺序依次将请求分配到后端服务器,实现简单的负载均衡。
- 加权轮询算法:根据后端服务器的性能等因素为其分配不同的权重,权重高的服务器接收更多请求。
- IP 哈希算法:根据客户端的 IP 地址进行哈希计算,将相同 IP 的请求始终分配到同一台后端服务器,可保持会话的一致性。
- HTTP 安全模块
- 访问控制:通过配置规则限制特定 IP 地址或 IP 段的访问,防止非法访问。
- SSL/TLS 加密:对 HTTP 通信进行加密,保障数据传输的安全性,常用于 HTTPS 网站。
- 防 DDoS 攻击:通过限制连接速率、并发连接数等方式,抵御分布式拒绝服务攻击。
邮件模块
- IMAP 代理模块:实现 IMAP(Internet 邮件访问协议)的代理功能,允许客户端通过 Nginx 访问邮件服务器。
- POP3 代理模块:实现 POP3(邮局协议版本 3)的代理功能,用于客户端接收邮件。
流模块
- TCP 代理模块:对 TCP 连接进行代理,可用于转发 TCP 流量,如数据库连接的代理。
- UDP 代理模块:对 UDP 数据包进行代理,可用于转发 UDP 流量,如 DNS 查询的代理。
这个图清晰地展示了 Nginx 中各个重要模块的层次结构和相互关系,有助于理解 Nginx 的整体功能架构。
[root@yuchao-tx-server ~]#nginx -V 该命令可见nginx已安装的模块,也是默认比较重要的模块
--prefix=/usr/share/nginx
--sbin-path=/usr/sbin/nginx
--modules-path=/usr/lib64/nginx/modules
--conf-path=/etc/nginx/nginx.conf
--error-log-path=/var/log/nginx/error.log
--http-log-path=/var/log/nginx/access.log
--http-client-body-temp-path=/var/lib/nginx/tmp/client_body
--http-proxy-temp-path=/var/lib/nginx/tmp/proxy
--http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi
--http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi
--http-scgi-temp-path=/var/lib/nginx/tmp/scgi
--pid-path=/run/nginx.pid
--lock-path=/run/lock/subsys/nginx
--user=nginx
--group=nginx
--with-compat
--with-debug
--with-file-aio
--with-google_perftools_module
--with-http_addition_module
--with-http_auth_request_module
--with-http_dav_module
--with-http_degradation_module
--with-http_flv_module
--with-http_gunzip_module
--with-http_gzip_static_module
--with-http_image_filter_module=dynamic
--with-http_mp4_module
--with-http_perl_module=dynamic
--with-http_random_index_module
--with-http_realip_module
--with-http_secure_link_module
--with-http_slice_module
--with-http_ssl_module
--with-http_stub_status_module
--with-http_sub_module
--with-http_v2_module
--with-http_xslt_module=dynamic
--with-mail=dynamic
--with-mail_ssl_module
--with-pcre
--with-pcre-jit
--with-stream=dynamic
--with-stream_ssl_module
--with-stream_ssl_preread_module
--with-threads
--with-cc-opt=-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -m64 -mtune=generic
--with-ld-opt=-Wl,-z,relro -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -Wl,-E
模块解释
Nginx模块名称 模块作用
ngx_http_access_module 四层基于IP的访问控制,可以通过匹配客户端源IP地址进行限制
ngx_http_auth_basic_module 状态页,使用basic机制进行用户认证,在编译安装nginx的时候需要添加编译参数--withhttp_stub_status_module,否则配置完成之后监测会是提示语法错误
ngx_http_stub_status_module 状态统计模块
ngx_http_gzip_module 文件的压缩功能
ngx_http_gzip_static_module 静态压缩模块
ngx_http_ssl_module nginx 的https 功能
ngx_http_rewrite_module 重定向模块,解析和处理rewrite请求
ngx_http_referer_module 防盗链功能,基于访问安全考虑
ngx_http_proxy_module 将客户端的请求以http协议转发至指定服务器进行处理
ngx_stream_proxy_module tcp负载,将客户端的请求以tcp协议转发至指定服务器处理
ngx_http_fastcgi_module 将客户端对php的请求以fastcgi协议转发至指定服务器助理
ngx_http_uwsgi_module 将客户端对Python的请求以uwsgi协议转发至指定服务器处理
ngx_http_headers_module 可以实现对头部报文添加指定的key与值
ngx_http_upstream_module 负载均衡模块,提供服务器分组转发、权重分配、状态监测、调度算法等高级功能
ngx_stream_upstream_module 后端服务器分组转发、权重分配、状态监测、调度算法等高级功能
ngx_http_fastcgi_module 实现通过fastcgi协议将指定的客户端请求转发至php-fpm处理
ngx_http_flv_module 为flv伪流媒体服务端提供支持
模块官网
官网文档
https://nginx.org/en/docs/ 所有模块都在这了
nginx核心功能都以插件的形式,是否安装插件,开启该功能决定是否有各种功能。
核心模块如下

重定向模块

公司使用php作为后端,nginx反向代理php的模块

反向代理模块

负载均衡模块

第三章、nginx部署实践
1.安装方式
- 源码编译
- 版本随意、安装复杂、定制化强、升级繁琐
- nginx升级
- 升级nginx二进制命令,替换原有/usr/bin/nginx
- 数据目录,配置文化,不变。
- nginx支持平滑升级,不重启升级。
Apt仓库
- apt install
- 版本较低,安装简单,定制化差、默认配置较多,不易读
官网仓库
- apt install
- nginx官方source源
- 版本最新,安装简单,配置易读
编译安装
2.编译安装
以下是使用 Mermaid 绘制的 Nginx 编译安装流程图示及相关代码和解释,该流程涵盖了从准备工作到最终完成安装的主要步骤。
Mermaid 代码
graph LR
classDef step fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A(准备工作):::step --> B(下载源码包):::step
B --> C(解压源码包):::step
C --> D(配置编译选项):::step
D --> E(编译):::step
E --> F(安装):::step
F --> G(创建配置文件):::step
G --> H(设置服务启动项):::step
H --> I(启动 Nginx):::step
I --> J{检查是否启动成功}:::step
J -->|是| K(完成安装):::step
J -->|否| L(排查错误):::step
L --> D(配置编译选项):::step
代码解释
- 准备工作
- 这是编译安装 Nginx 的起始步骤,需要确保系统具备编译所需的基本环境,例如安装必要的编译工具(如
gcc、make等),以及安装依赖库(如pcre、zlib等)。
- 这是编译安装 Nginx 的起始步骤,需要确保系统具备编译所需的基本环境,例如安装必要的编译工具(如
- 下载源码包
- 从 Nginx 官方网站或其他可靠源下载适合的 Nginx 源码压缩包,通常以
.tar.gz格式存在。
- 从 Nginx 官方网站或其他可靠源下载适合的 Nginx 源码压缩包,通常以
- 解压源码包
- 使用
tar命令将下载的源码包解压到指定目录,以便后续对源码进行操作。
- 使用
- 配置编译选项
- 进入解压后的源码目录,使用
./configure脚本进行配置。可以通过传递不同的参数来启用或禁用特定的功能模块,例如启用 SSL 模块、指定安装路径等。
- 进入解压后的源码目录,使用
- 编译
- 在配置完成后,使用
make命令对源码进行编译。该过程会将源码转换为可执行文件和相关的库文件。
- 在配置完成后,使用
- 安装
- 使用
make install命令将编译好的文件安装到之前配置指定的目录中。
- 使用
- 创建配置文件
- 在安装完成后,需要创建或编辑 Nginx 的配置文件(通常是
nginx.conf),根据实际需求配置 Nginx 的监听端口、虚拟主机、日志路径等参数。
- 在安装完成后,需要创建或编辑 Nginx 的配置文件(通常是
- 设置服务启动项
- 为了方便管理 Nginx 的启动和停止,可以将 Nginx 配置为系统服务,使用
systemctl或init.d脚本来管理服务的启动、停止、重启等操作。
- 为了方便管理 Nginx 的启动和停止,可以将 Nginx 配置为系统服务,使用
- 启动 Nginx
- 使用相应的命令(如
systemctl start nginx)启动 Nginx 服务。
- 使用相应的命令(如
- 检查是否启动成功
- 通过访问 Nginx 监听的端口(如
http://localhost)或使用systemctl status nginx命令检查 Nginx 是否正常启动。
- 通过访问 Nginx 监听的端口(如
- 完成安装
- 如果 Nginx 启动成功,则表示编译安装过程顺利完成,可以开始使用 Nginx 提供服务。
- 排查错误
- 如果启动失败,则需要查看日志文件(通常位于
/var/log/nginx目录下),分析错误原因,可能需要重新检查编译选项或配置文件,然后再次尝试编译安装。
- 如果启动失败,则需要查看日志文件(通常位于
这个流程图清晰地展示了 Nginx 编译安装的完整过程,以及在安装过程中可能遇到的问题和处理方式。
脚本化编译nginx
以下是一个适用于 Ubuntu 系统的编译部署 Nginx 的 Bash 脚本,其功能与上述适用于 CentOS 的脚本类似,会完成下载 Nginx 源码、安装依赖、编译、安装、配置和启动 Nginx 等一系列操作。同样,运行此脚本建议以 root 用户身份。
#!/bin/bash
# 定义变量
# 定义什么变量?
# 为什么超哥定义这些变量呢?
# 偷懒,记不住。。
NGINX_VERSION="1.26.3" # 你可以根据需要修改 Nginx 版本
SOURCE_DIR="/usr/local/src"
INSTALL_DIR="/usr/local/nginx"
LOG_DIR="/var/log/nginx"
CONF_DIR="$INSTALL_DIR/conf"
CONF_FILE="$CONF_DIR/nginx.conf"
# /usr/local/nginx/nginx.conf
# /usr/local/nginx/conf/
# 更新系统软件包列表
echo "正在更新系统软件包列表..."
apt-get update || {
echo "更新软件包列表失败,请检查网络或系统配置。"
exit 1
}
# 安装依赖
echo "正在安装编译所需的依赖..."
apt-get install -y build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev || {
echo "依赖安装失败,请检查网络或系统配置。"
exit 1
}
# 创建必要的目录
echo "正在创建必要的目录..."
mkdir -p $SOURCE_DIR $INSTALL_DIR $LOG_DIR
# 下载 Nginx 源码
echo "正在下载 Nginx 源码..."
# 脚本中,定义操作路径
cd $SOURCE_DIR
# wget https://nginx.org/download/nginx-1.26.3.tar.gz
wget https://nginx.org/download/nginx-$NGINX_VERSION.tar.gz || {
echo "Nginx 源码下载失败,请检查网络或版本号。"
exit 1
}
# 解压源码
# 输出什么?
#pwd /usr/local/src
echo "正在解压 Nginx 源码..."
tar -zxvf nginx-$NGINX_VERSION.tar.gz
# 进入源码目录,准备编译安装
cd nginx-$NGINX_VERSION
# 配置编译选项
echo "正在配置编译选项..."
./configure \
--prefix=$INSTALL_DIR \
--with-http_ssl_module \
--with-http_gzip_static_module \
--error-log-path=$LOG_DIR/error.log \
--http-log-path=$LOG_DIR/access.log || {
echo "配置编译选项失败,请检查配置参数。"
exit 1
}
# 编译和安装
echo "正在编译和安装 Nginx..."
make && make install || {
echo "编译或安装 Nginx 失败,请检查编译日志。"
exit 1
}
# 编译安装结束
# 创建 Nginx 服务文件
echo "正在创建 Nginx 服务文件..."
cat << EOF > /etc/systemd/system/nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=network.target nss-lookup.target
[Service]
Type=forking
PIDFile=$INSTALL_DIR/logs/nginx.pid
ExecStartPre=$INSTALL_DIR/sbin/nginx -t
ExecStart=$INSTALL_DIR/sbin/nginx
ExecReload=$INSTALL_DIR/sbin/nginx -s reload
ExecStop=$INSTALL_DIR/sbin/nginx -s stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
# 重新加载 systemd 管理器配置
systemctl daemon-reload
# 启动 Nginx 服务并设置开机自启
echo "正在启动 Nginx 服务并设置开机自启..."
systemctl start nginx
systemctl enable nginx
# 检查 Nginx 服务状态
echo "正在检查 Nginx 服务状态..."
if systemctl is-active --quiet nginx; then
echo "Nginx 服务已成功启动。"
else
echo "Nginx 服务启动失败,请检查日志文件 $LOG_DIR/error.log。"
fi
# 检查nginx进程端口
ps -ef |grep nginx
apt install net-tools -y
netstat -tunlp|grep nginx
脚本说明:
- 变量定义:和之前脚本一样,定义了 Nginx 的版本号、源码目录、安装目录、日志目录、配置目录和配置文件路径等。
- 更新软件包列表:使用
apt-get update命令更新系统的软件包列表,确保能获取到最新的软件包信息。 - 依赖安装:使用
apt-get命令安装编译所需的依赖包,包括build-essential、libpcre3、libpcre3-dev等。 - 目录创建:创建必要的目录,包含源码目录、安装目录和日志目录。
- 源码下载和解压:从 Nginx 官方网站下载指定版本的源码包,并解压到指定目录。
- 配置编译选项:使用
./configure脚本配置编译选项,启用了 SSL 模块和 Gzip 静态模块,同时指定了错误日志和访问日志的路径。 - 编译和安装:使用
make和make install命令进行编译和安装。 - 服务文件创建:创建一个
systemd服务文件/etc/systemd/system/nginx.service,用于管理 Nginx 服务的启动、停止、重启等操作。 - 服务启动和开机自启:重新加载
systemd管理器配置,启动 Nginx 服务并设置开机自启。 - 服务状态检查:检查 Nginx 服务是否成功启动,并输出相应的提示信息。
使用方法:
- 将上述脚本保存为一个文件,例如
nginx_install_ubuntu.sh。 - 给脚本添加执行权限:
chmod +x nginx_install_ubuntu.sh。 - 运行脚本:
./nginx_install_ubuntu.sh。
注意事项:
- 运行脚本前要确保系统已连接到互联网,以便下载源码和依赖包。
- 若在执行过程中遇到权限问题,请以
root用户身份运行脚本,或者使用sudo命令。
官网
https://nginx.org/en/docs/configure.html
超哥的文档
1.创建用户
groupadd www -g 666
useradd www -u 666 -g 666 -M -s /sbin/nologin
2.安装依赖环境
[root@web-9 ~]#yum install pcre pcre-devel openssl openssl-devel zlib zlib-devel gzip gcc gcc-c++ make wget httpd-tools vim -y
3.下载源码 https://nginx.org/download/,且解压缩
mkdir /yuchao-linux-data/ -p ;wget -O /yuchao-linux-data/nginx-1.19.0.tar.gz https://nginx.org/download/nginx-1.19.0.tar.gz
cd /yuchao-linux-data/ && tar -zxf nginx-1.19.0.tar.gz
开始编译,编译三部曲来了
0.查看编译参数帮助信息
[root@web-9 /yuchao-linux-data/nginx-1.19.0]#./configure --help
1.编译参数
[root@web-9 /yuchao-linux-data/nginx-1.19.0]#./configure --user=www --group=www --prefix=/opt/nginx-1-19-0 --with-http_stub_status_module --with-http_ssl_module --with-pcre
2.编译安装
[root@web-9 /yuchao-linux-data/nginx-1.19.0]#make && make install
创建软连接
[root@web-9 /yuchao-linux-data/nginx-1.19.0]#ln -s /opt/nginx-1-19-0/ /opt/nginx
[root@web-9 /yuchao-linux-data/nginx-1.19.0]#
[root@web-9 /yuchao-linux-data/nginx-1.19.0]#ll -d /opt/nginx
lrwxrwxrwx 1 root root 18 May 7 17:12 /opt/nginx -> /opt/nginx-1-19-0/
默认的nginx安装目录
[root@web-9 /yuchao-linux-data/nginx-1.19.0]#ls /opt/nginx
conf html logs sbin
3.检查语法
[root@web-9 /opt]#/opt/nginx/sbin/nginx -t
nginx: the configuration file /opt/nginx-1-19-0/conf/nginx.conf syntax is ok
nginx: configuration file /opt/nginx-1-19-0/conf/nginx.conf test is successful
4.启动nginx
先不着急配置PATH,先绝对路径启动
-c 参数指定配置文件启动
[root@web-9 /opt]#/opt/nginx/sbin/nginx -c /opt/nginx/conf/nginx.conf
[root@web-9 /opt]#ps -ef|grep nginx
root 50976 1 0 17:26 ? 00:00:00 nginx: master process /opt/nginx/sbin/nginx -c /opt/nginx/conf/nginx.conf
www 50977 50976 0 17:26 ? 00:00:00 nginx: worker process
root 50979 45214 0 17:26 pts/0 00:00:00 grep --color=auto nginx
5.停止nginx
[root@web-9 /opt]#/opt/nginx/sbin/nginx -s stop
6.测试nginx
[root@web-9 /opt]#/opt/nginx/sbin/nginx -c /opt/nginx/conf/nginx.conf

官方nginx apt源
机器上,同时存在多个nginx的时候,如何运行,且管理。
- 编译nginx
- apt安装了nginx
- 取保它们不能冲突,配置文件,数据目录,运行端口,PATH
- 合理修改PATH,这2个nginx同时运行,先后顺序。
https://nginx.org/en/linux_packages.html#Ubuntu 页面详细介绍了在 Ubuntu 系统上配置 Nginx 官方软件源及安装 Nginx 的相关内容。下面为你整理其核心步骤和要点:
1. 安装前准备
在添加 Nginx 软件源之前,需要导入 Nginx 官方的 GPG 密钥,以确保下载和安装的软件包的完整性和真实性。
sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
2. 配置 Nginx 软件源
根据不同的 Ubuntu 版本和需求,有两种不同的配置方式,分别是使用稳定版(Stable)和主线版(Mainline)的 Nginx 软件源。
稳定版(Stable)
稳定版通常提供经过充分测试的 Nginx 版本,适合对稳定性要求较高的生产环境。
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
主线版(Mainline)
主线版会包含最新的功能和改进,但可能相对不够稳定,适合需要尝新特性的测试或开发环境。
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/mainline/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
3. 设置版本锁定(可选)
为了确保系统始终从 Nginx 官方软件源获取软件包,避免从 Ubuntu 默认软件源安装或更新 Nginx,可以设置版本锁定。
echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" \
| sudo tee /etc/apt/preferences.d/99nginx
4. 更新软件包列表
在配置好软件源后,需要更新系统的软件包列表,以便让系统识别新添加的 Nginx 软件源。
sudo apt update
5. 安装 Nginx
使用 apt 命令安装 Nginx。
sudo apt install nginx
6. 其他操作
启动 Nginx 服务
# 编译安装时,也生成服务脚本
# 编译安装的nginx,服务脚本/etc/systemd/system/nginx.service
# apt安装 /lib/systemd/system/nginx.service
sudo systemctl start nginx
# 同时管理2个nginx
root@web01:/etc/systemd/system# mv nginx.service build-nginx.service
root@web01:/etc/systemd/system# systemctl daemon-reload
root@web01:/etc/systemd/system# systemctl start build-nginx.service
root@web01:/etc/systemd/system# systemctl is-active build-nginx.service
active
#修改编译安装nginx的配置信息,修改网站的数据存储目录
# 以及修改网页首页内容文件 index.html
# 启动一个apt安装的nginx,区别2个端口和主页
root@web01:/build-nginx/html# vim /usr/local/nginx/conf/nginx.conf
35 server {
36 listen 80;
37 server_name localhost;
38
39 #charset koi8-r;
40
41 #access_log logs/host.access.log main;
42 # 找到server配置快,找到location配置
43 location / {
44 # 定义网页目录在哪
45 root /build-nginx/html;
46 index index.html index.htm;
47 }
# 创建网页目录,以及数据
mkdir -p /build-nginx/html
root@web01:/build-nginx/html# cat index.html
<meta charset=utf-8>
我是编译安装的nginx首页,你学废了吗
# 重载服务!读取新配置!
root@web01:/build-nginx/html# systemctl reload build-nginx.service
root@web01:/build-nginx/html#
# 访问即可
root@web01:/build-nginx/html# curl 127.0.0.1:80
<meta charset=utf-8>
我是编译安装的nginx首页,你学废了吗
# 远程访问 http://10.211.55.2:80/
####################################
# apt安装nginx启动
# 找到配置目录
root@web01:/etc/nginx# ls
conf.d fastcgi_params mime.types modules nginx.conf scgi_params uwsgi_params
# 找配置文件
31 include /etc/nginx/conf.d/*.conf;
root@web01:/etc/nginx/conf.d# ls
default.conf
# 修改如下
# 这是nginx定义网页功能的 虚拟主机的配置
server {
listen 81;
server_name localhost;
#access_log /var/log/nginx/host.access.log main;
location / {
root /apt-nginx/html;
index index.html index.htm;
}
# 创建数据目录
root@web01:/apt-nginx/html# cat index.html
<meta charset=utf-8>
我是apt安装的nginx,哈哈,你认识我了吗
# 启动服务
root@web01:/apt-nginx/html# vim /lib/systemd/system/nginx.service
root@web01:/apt-nginx/html#
root@web01:/apt-nginx/html# systemctl start nginx
root@web01:/apt-nginx/html# netstat -tunlp|grep nginx
tcp 0 0 0.0.0.0:81 0.0.0.0:* LISTEN 196385/nginx: maste
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 194528/nginx: maste
# 总结,区分好2个nginx的,启动脚本,数据目录,nginx.conf配置文件!
# 区分2个服务名字
root@web01:/apt-nginx/html# systemctl is-active build-nginx.service
active
root@web01:/apt-nginx/html#
root@web01:/apt-nginx/html#
root@web01:/apt-nginx/html# systemctl is-active nginx.service
active
systemctl status build-nginx.service
● build-nginx.service - The NGINX HTTP and reverse proxy server
Loaded: loaded (/etc/systemd/system/build-nginx.service; disabled; vendor preset: enabled)
# systemctl daemon-reload
设置 Nginx 开机自启
sudo systemctl enable nginx
检查 Nginx 服务状态
sudo systemctl status nginx
停止 Nginx 服务
sudo systemctl stop nginx
重启 Nginx 服务
sudo systemctl restart nginx
重新加载 Nginx 配置
sudo systemctl reload nginx
7. 卸载 Nginx
如果需要卸载 Nginx,可以使用以下命令:
sudo apt remove nginx
若要同时删除配置文件等相关数据,可以使用:
sudo apt purge nginx
编译安装nginx
# 安装目录,删除
root@web01:/usr/local/nginx# ls
client_body_temp conf fastcgi_temp html logs proxy_temp sbin scgi_temp uwsgi_temp
# 日志清理
# 启动脚本清理
# 清理PATH变量
注意事项
- 确保服务器可以访问
nginx.org网站,否则可能无法正常下载软件包。 - 在选择稳定版或主线版时,要根据实际的使用场景进行合理选择。如果是生产环境,建议优先使用稳定版;如果是测试或开发环境,可以尝试主线版以体验新功能。
yum源安装
epel源安装就不操作了
1.配置阿里云yum epel源
2.yum install nginx -y
1. 官网nginx源
官网文档
https://nginx.org/en/linux_packages.html#RHEL-CentOS
于超老师的文档
1.安装yum工具包
sudo yum install yum-utils
2.设置yum仓库
最新稳定版,线上用这个
cat > /etc/yum.repos.d/nginx.repo << 'EOF'
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
EOF
最新开发版,但是并不稳定
cat > /etc/yum.repos.d/yuchao-nginx.repo << 'EOF'
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
EOF
3.yum安装的nginx服务
yum clean all
yum install pcre pcre-devel openssl openssl-devel zlib zlib-devel gzip gcc gcc-c++ make wget httpd-tools vim nginx -y
4.启动nginx
注意,当前有nginx进程吗?
[root@web-9 /opt]#/opt/nginx/sbin/nginx -s stop
[root@web-9 /opt]#systemctl start nginx
2.测试nginx版本
[root@web-9 /opt]#curl -I 127.0.0.1
HTTP/1.1 200 OK
Server: nginx/1.20.2
Date: Sat, 07 May 2022 09:40:44 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 16 Nov 2021 15:03:30 GMT
Connection: keep-alive
ETag: "6193c842-264"
Accept-Ranges: bytes
3.yum自动设置了PATH
yum自动设置了PATH
[root@web-9 /opt]#which nginx
/usr/sbin/nginx
4.测试访问nginx
[root@web-9 /opt]#echo '超哥带你学linux' >> /usr/share/nginx/html/index.html
[root@web-9 /opt]#curl 127.0.0.1
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
超哥带你学linux
注意两个版本的nginx管理
1.nginx配置文件的读取
两个版本的nginx,使用的配置文件区别
yum安装的
[root@web-9 /opt]#nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
源码编译的
[root@web-9 /opt]#/opt/nginx/sbin/nginx -t
nginx: the configuration file /opt/nginx-1-19-0/conf/nginx.conf syntax is ok
nginx: configuration file /opt/nginx-1-19-0/conf/nginx.conf test is successful
指定配置文件检测语法
[root@web-9 /opt]#/opt/nginx/sbin/nginx -t -c /opt/nginx/conf/nginx.conf
nginx: the configuration file /opt/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /opt/nginx/conf/nginx.conf test is successful
2.nginx命令小结
以下是 Nginx 常见命令的总结表格,涵盖了服务管理、配置检查、重载等多个方面的命令,方便你在不同场景下对 Nginx 进行操作和管理。
| 命令分类 | 命令格式 | 功能描述 | 示例 |
|---|---|---|---|
| 服务管理 | sudo systemctl start nginx |
启动 Nginx 服务 | sudo systemctl start nginx |
sudo systemctl stop nginx |
停止 Nginx 服务 | sudo systemctl stop nginx |
|
sudo systemctl restart nginx |
重启 Nginx 服务 | sudo systemctl restart nginx |
|
sudo systemctl reload nginx |
重新加载 Nginx 配置文件,不中断正在处理的请求 | sudo systemctl reload nginx |
|
sudo systemctl enable nginx |
设置 Nginx 服务开机自启 | sudo systemctl enable nginx |
|
sudo systemctl disable nginx |
取消 Nginx 服务开机自启 | sudo systemctl disable nginx |
|
sudo systemctl status nginx |
查看 Nginx 服务的当前状态 | sudo systemctl status nginx |
|
| 配置检查 | nginx -t |
检查 Nginx 配置文件的语法是否正确 | nginx -t |
nginx -T |
检查配置文件语法并输出最终的合并配置 | nginx -T |
|
| 进程管理 | nginx |
启动 Nginx 服务(直接使用二进制文件启动) | nginx |
nginx -s stop |
快速停止 Nginx 服务,不等待正在处理的请求完成 | nginx -s stop |
|
nginx -s quit |
优雅地停止 Nginx 服务,等待所有请求处理完成后再停止 | nginx -s quit |
|
nginx -s reload |
重新加载 Nginx 配置文件,不中断正在处理的请求 | nginx -s reload |
|
nginx -s reopen |
重新打开日志文件,常用于日志切割 | nginx -s reopen |
|
| 版本信息 | nginx -v |
显示 Nginx 的版本号 | nginx -v |
nginx -V |
显示 Nginx 的详细版本信息,包括编译选项等 | nginx -V |
|
| 帮助信息 | nginx -h 或 nginx --help |
显示 Nginx 命令的帮助信息 | nginx -h |
编译安装的
1.查看帮助信息
/opt/nginx/sbin/nginx -h
2.查看语法
/opt/nginx/sbin/nginx -t # 检测默认路径配置文件
/opt/nginx/sbin/nginx -t -c /opt/nginx/conf/nginx.conf # 指定配置文件检测语法
3.重载配置文件
/opt/nginx/sbin/nginx -s reload # 重载默认路径下的配置文件
4.停止服务(注意nginx命令的路径)
/opt/nginx/sbin/nginx -s stop
yum安装的
/usr/sbin/nginx -t
systemctl start/restart/reload/stop nginx
第四章、Nginx配置文件
1.重要文件
[root@web-9 /opt]#rpm -ql nginx
/etc/logrotate.d/nginx # nginx日志切割配置文件
/etc/nginx/conf.d # 子配置文件目录
/etc/nginx/conf.d/default.conf # 默认配置文件模板
/etc/nginx/fastcgi_params # 翻译nginx的变量为php可识别的变量
/etc/nginx/mime.types # 支持的媒体文件类型
/etc/nginx/nginx.conf # nginx主配置文件
/etc/nginx/uwsgi_params # 翻译nginx变量为python可识别的变量
/usr/lib/systemd/system/nginx.service # systemctl管理nginx的脚本
/usr/sbin/nginx # nginx命令
/usr/share/nginx/html # 网站根目录
/var/log/nginx # nginx默认日志目录
2.查看已安装nginx的详细信息
[root@web-9 /etc/nginx]#nginx -V
nginx version: nginx/1.20.2
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: 。。。
3.nginx.conf 核心解释
以下是使用 Mermaid 绘制的 Nginx 配置文件结构图示,同时给出对应的代码和详细解释,该图示展示了 Nginx 配置文件的主要层级和常见指令模块。
Mermaid 代码
graph LR
classDef config fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A(全局配置):::config --> B(事件模块):::config
A --> C(HTTP 模块):::config
A --> D(邮件模块):::config
A --> E(流模块):::config
B --> B1(worker_connections):::config
B --> B2(use):::config
C --> C1(HTTP 全局配置):::config
C --> C2(虚拟主机配置):::config
C1 --> C11(sendfile):::config
C1 --> C12(tcp_nopush):::config
C2 --> C21(server 块 1):::config
C2 --> C22(server 块 2):::config
C21 --> C211(location 块 1):::config
C21 --> C212(location 块 2):::config
C211 --> C2111(rewrite):::config
C211 --> C2112(proxy_pass):::config
D --> D1(IMAP 配置):::config
D --> D2(POP3 配置):::config
E --> E1(TCP 配置):::config
E --> E2(UDP 配置):::config
代码解释
全局配置
是 Nginx 配置文件的最顶层,包含影响整个 Nginx 服务器的设置,它为其他模块提供了基础的运行环境和通用的配置参数,并且与事件模块、HTTP 模块、邮件模块和流模块相连,对这些模块进行整体的管理和配置。
事件模块
- worker_connections:用于设置每个工作进程可以处理的最大连接数,该参数会影响 Nginx 的并发处理能力。
- use:指定 Nginx 使用的事件驱动模型,如
epoll(适用于 Linux 系统)、kqueue(适用于 FreeBSD、macOS 系统)等。
HTTP 模块
- HTTP 全局配置
- sendfile:开启
sendfile功能,可提高文件传输效率,避免数据在用户空间和内核空间之间的多次拷贝。 - tcp_nopush:与
sendfile结合使用,确保数据包在发送前尽可能填满,减少网络开销。
- sendfile:开启
- 虚拟主机配置
- server 块:用于定义虚拟主机,每个
server块可以配置不同的域名、端口和处理规则。 - location 块:在
server块内部,用于匹配不同的 URI 路径,并对匹配的请求进行特定的处理。- rewrite:用于 URL 重写,可将一个 URL 地址重定向到另一个地址。
- proxy_pass:用于配置反向代理,将请求转发到后端的服务器。
- server 块:用于定义虚拟主机,每个
邮件模块
- IMAP 配置:对 IMAP(Internet 邮件访问协议)服务进行配置,如设置 IMAP 代理的相关参数。
- POP3 配置:对 POP3(邮局协议版本 3)服务进行配置,用于客户端接收邮件。
流模块
- TCP 配置:用于配置 TCP 代理,可将 TCP 流量转发到指定的目标地址和端口。
- UDP 配置:用于配置 UDP 代理,处理 UDP 数据包的转发。
这个图清晰地展示了 Nginx 配置文件的层次结构和各个模块之间的关系,有助于理解如何通过配置文件来定制 Nginx 的功能。
nginx.conf是纯文本类型的文件
[root@web-9 /etc/nginx]#file /etc/nginx/nginx.conf
/etc/nginx/nginx.conf: ASCII text
nginx以区块的形式组织各区域的配置参数

nginx配置文件主要区分三大区域
- coremodule
- 核心模块
- EventModul
- 事件驱动模块
- HttpCoreModule
- http内核模块
4.核心模块配置
Nginx核心模块是构成Nginx强大功能的基础,它们各自承担着不同的职责,相互协作以实现高效的Web服务、反向代理等功能。以下为你详细介绍一些主要的核心模块:
基础核心模块
ngx_core_module
- 功能概述:这是Nginx最基础、最重要的核心模块,负责初始化Nginx服务器的全局配置,包括进程管理、工作目录设置、用户权限设置等。它定义了Nginx的基本运行环境和全局参数。
- 关键指令:
user:指定Nginx工作进程运行的用户和用户组,增强安全性。例如user nginx nginx;表示Nginx工作进程以nginx用户和用户组的身份运行。worker_processes:设置Nginx工作进程的数量,通常建议设置为服务器CPU核心数,以充分利用服务器资源。如worker_processes auto;会自动根据CPU核心数进行设置。error_log:用于指定Nginx错误日志的存储路径和日志级别。例如error_log /var/log/nginx/error.log warn;表示将警告级别及以上的错误信息记录到指定文件中。
ngx_events_module
- 功能概述:该模块负责处理Nginx的事件驱动机制,通过高效的事件通知机制(如Linux的
epoll、FreeBSD的kqueue),使Nginx能够在单线程中处理大量并发连接,提高服务器的并发处理能力。 - 关键指令:
worker_connections:设置每个工作进程可以处理的最大连接数。例如worker_connections 1024;表示每个工作进程最多可处理1024个连接。use:指定Nginx使用的事件驱动模型。例如use epoll;表示在Linux系统上使用epoll模型。
HTTP相关核心模块
ngx_http_core_module
- 功能概述:是HTTP模块的核心,负责处理HTTP请求的基本流程,包括请求解析、路由匹配、响应生成等。它定义了HTTP协议的基本行为和全局配置。
- 关键指令:
server:用于定义虚拟主机,一个Nginx服务器可以配置多个虚拟主机,每个虚拟主机可以有独立的域名、端口和配置。例如:server { listen 80; server_name example.com; root /var/www/example; }
location:在server块内部,用于匹配不同的URI路径,并对匹配的请求进行特定的处理。例如:
location /images/ {
root /var/www;
}
location /packages/ {
root /xxx;
}
index:设置默认的索引文件,当客户端请求一个目录时,Nginx会尝试返回该目录下指定的索引文件。如index index.html index.htm;
ngx_http_log_module
- 功能概述:主要用于记录HTTP请求和响应的相关信息,方便管理员进行日志分析和问题排查。
- 关键指令:
access_log:指定访问日志的存储路径和日志格式。例如access_log /var/log/nginx/access.log main;表示将访问日志记录到指定文件,并使用main日志格式。log_format:用于定义日志的输出格式。例如:log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';
ngx_http_proxy_module
- 功能概述:实现Nginx的代理功能,包括反向代理和正向代理。反向代理常用于将客户端请求转发到后端服务器,隐藏后端服务器的真实IP地址;正向代理则允许客户端通过Nginx访问外部资源。
- 关键指令:
proxy_pass:用于配置反向代理,指定请求转发的目标地址。例如proxy_pass http://backend_server;表示将请求转发到名为backend_server的后端服务器。proxy_set_header:用于修改或添加请求头信息,在转发请求时传递给后端服务器。例如proxy_set_header Host $host;表示将客户端请求的Host头信息传递给后端服务器。
邮件相关核心模块
ngx_mail_core_module
- 功能概述:是邮件模块的核心,负责初始化邮件代理服务的基本配置,支持IMAP、POP3等邮件协议的代理功能。
- 关键指令:
mail:用于定义邮件代理服务的全局配置。例如:mail { server_name mail.example.com; auth_http localhost:8080/auth; }
server:在mail块内部,用于定义具体的邮件协议代理服务器。例如:
server {
protocol imap;
listen 143;
proxy on;
}
流相关核心模块
ngx_stream_core_module
- 功能概述:提供Nginx的流代理功能,可对TCP和UDP流量进行代理和负载均衡,常用于处理非HTTP协议的流量,如数据库连接、游戏服务器连接等。
- 关键指令:
stream:用于定义流代理服务的全局配置。例如:stream { log_format basic '$remote_addr [$time_local] ' '$protocol $status $bytes_sent $bytes_received ' '$session_time'; access_log /var/log/nginx/stream-access.log basic; }
server:在stream块内部,用于定义具体的流代理服务器。例如:
server {
listen 3306;
proxy_pass mysql_backend;
}

5. 事件驱动配置
Nginx的事件驱动机制是其能够高效处理大量并发连接的关键因素之一,它通过配置事件模块来实现。下面将详细介绍Nginx事件驱动的相关配置。
1. 事件模块的基本配置位置
事件驱动相关的配置通常位于Nginx主配置文件 nginx.conf 的全局配置部分,也就是在 events 块中进行设置。以下是一个基本的 events 块结构示例:
events {
# 事件驱动相关配置指令将写在这里
}
2. 常用的事件驱动配置指令
worker_connections
- 功能:该指令用于设置每个Nginx工作进程可以处理的最大连接数。这个数值会直接影响Nginx的并发处理能力。
- 示例:
上述配置表示每个工作进程最多可以同时处理1024个连接。你可以根据服务器的硬件资源和实际需求来调整这个数值。events { worker_connections 1024; }
use
- 功能:指定Nginx使用的事件驱动模型。不同的操作系统支持不同的事件驱动模型,Nginx会根据系统自动选择合适的模型,但你也可以手动指定。
- 常用模型及适用系统:
epoll:适用于Linux系统,是Linux下性能较高的事件驱动模型,它采用事件通知机制,能够高效地处理大量并发连接。kqueue:适用于FreeBSD、macOS等系统,同样提供了高效的事件处理能力。select和poll:是比较传统的事件驱动模型,性能相对较低,一般在不支持epoll或kqueue的系统中使用。
- 示例:
此配置明确指定在Linux系统上使用events { use epoll; worker_connections 1024; }epoll事件驱动模型。
multi_accept
- 功能:该指令用于控制工作进程是否一次性接受多个新连接。当设置为
on时,工作进程会在接收到新的连接事件时,尽可能多地接受新连接,而不是一次只接受一个连接,这样可以提高处理效率。 - 示例:
events { use epoll; worker_connections 1024; multi_accept on; }
3. 综合配置示例
以下是一个完整的事件驱动配置示例,结合了上述几个常用指令,适用于Linux系统:
# 全局配置部分
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# 事件驱动配置
events {
use epoll;
worker_connections 2048;
multi_accept on;
}
# HTTP模块配置
http {
# HTTP相关配置内容
}
在这个示例中,Nginx使用 epoll 事件驱动模型,每个工作进程最多可处理2048个连接,并且会一次性接受多个新连接。同时,还展示了全局配置和后续HTTP模块配置的基本结构。
4. 配置注意事项
- 资源评估:
worker_connections的设置需要根据服务器的内存、CPU等硬件资源进行合理评估。如果设置过大,可能会导致服务器资源耗尽;设置过小,则会限制Nginx的并发处理能力。 - 系统兼容性:在手动指定
use指令时,要确保所选的事件驱动模型与服务器的操作系统兼容,否则可能会导致配置错误。 - 配置测试:在修改事件驱动配置后,建议使用
nginx -t命令检查配置文件的语法是否正确,然后使用nginx -s reload命令重新加载配置,使新配置生效。
6. http区域
网站的配置都在这了

在 Nginx 配置文件中,http{} 块是一个核心部分,用于配置与 HTTP 协议相关的各种设置,包括全局设置、虚拟主机配置等。以下是对 http{} 块的深度解释:
1. http{} 块的作用
http{} 块是 Nginx 配置文件中用于处理 HTTP 请求和响应的主要配置区域。它可以包含全局的 HTTP 设置,以及多个 server{} 块,每个 server{} 块代表一个虚拟主机,可以处理特定域名或 IP 地址的请求。
2. 常见的全局 HTTP 设置
日志设置
access_log:用于指定访问日志的存储路径和格式。例如:
这里将访问日志存储在http { access_log /var/log/nginx/access.log combined; }/var/log/nginx/access.log文件中,使用combined日志格式,该格式包含客户端 IP、请求时间、请求方法、URI、HTTP 版本、响应状态码、响应字节数等信息。error_log:指定错误日志的存储路径和日志级别。例如:
表示将警告级别及以上的错误信息记录到http { error_log /var/log/nginx/error.log warn; }/var/log/nginx/error.log文件中。
连接设置
keepalive_timeout:设置客户端与服务器之间保持连接的超时时间。例如:
表示如果在 65 秒内客户端和服务器没有新的数据传输,连接将被关闭。http { keepalive_timeout 65; }sendfile:开启sendfile功能可以提高文件传输效率,避免数据在用户空间和内核空间之间的多次拷贝。例如:http { sendfile on; }
MIME 类型设置
include:用于包含 MIME 类型文件,定义不同文件扩展名对应的 MIME 类型。例如:http { include /etc/nginx/mime.types; default_type application/octet-stream; }include指令包含了mime.types文件,default_type指令设置了默认的 MIME 类型。
缓存设置
proxy_cache_path:用于配置反向代理缓存的路径和相关参数。例如:
这里定义了一个名为http { proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off; }my_cache的缓存区域,缓存数据存储在/var/cache/nginx目录下,缓存空间大小为 10GB,缓存项在 60 分钟内没有被访问将被移除。
3. server{} 块
server{} 块用于定义虚拟主机,一个 http{} 块中可以包含多个 server{} 块,每个 server{} 块可以处理不同域名或 IP 地址的请求。
监听地址和端口
listen:指定虚拟主机监听的地址和端口。例如:
表示该虚拟主机监听 80 端口,处理http { server { listen 80; server_name example.com; } }example.com域名的请求。
根目录设置
root:指定虚拟主机的根目录,当客户端请求一个文件时,Nginx 会在该目录下查找。例如:http { server { listen 80; server_name example.com; root /var/www/example; } }
location{} 块
location{} 块用于匹配不同的 URI 路径,并对匹配的请求进行特定的处理。例如:
http {
server {
listen 80;
server_name example.com;
root /var/www/example;
location /images/ {
alias /var/www/images/;
}
location /api/ {
proxy_pass http://backend_server;
}
}
}
- 第一个
location块将以/images/开头的请求映射到/var/www/images/目录。 - 第二个
location块将以/api/开头的请求转发到backend_server后端服务器。
4. 模块配置
http{} 块还可以包含各种 Nginx 模块的配置,例如:
反向代理模块
http {
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend_server;
}
}
}
这里设置了反向代理的连接超时、发送超时和读取超时时间,并将所有请求转发到 backend_server。
SSL 模块
http {
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location / {
root /var/www/example;
}
}
}
此配置启用了 SSL 加密,设置了支持的 SSL 协议和加密套件,并指定了 SSL 证书和私钥的路径。
综上所述,http{} 块是 Nginx 配置文件中非常重要的部分,通过合理配置其中的各项指令,可以实现灵活的 HTTP 服务和反向代理功能。
7.小结
主要区域块如下
