一、Nginx 概念
Nginx 是一款轻量级的高性能 Web 服务器、反向代理服务器以及电子邮件(IMAP/POP3)代理服务器。它可以在大多数 Unix/Linux 操作系统上运行,也有 Windows 版本。主要用于处理高并发连接,能够快速、高效地为用户提供静态和动态内容。
二、特点
- 高并发性能
- 采用事件驱动的异步非阻塞模型,能够轻松处理数以万计的并发连接,大大提高服务器的资源利用率和处理能力。
- 相比传统的服务器架构,在相同硬件条件下可以支持更多的并发请求。
- 内存占用少
- 代码设计高效,对系统资源的消耗很低,在处理大量请求时,其内存占用远低于其他同类服务器软件。
- 稳定性高
- 具有良好的稳定性,在长期运行过程中不容易出现崩溃等问题,可以持续为用户提供可靠的服务。
- 功能丰富
- 除了作为 Web 服务器和反向代理服务器外,还可以实现负载均衡、缓存等多种功能,满足复杂网络架构的需求。
三、架构
- Master 进程
- 负责读取配置文件,创建和管理 worker 进程等。它是整个 Nginx 服务器的控制中心,监控 worker 进程的运行状态。
- Worker 进程
- 实际处理网络请求的进程。多个 worker 进程相互独立工作,接收来自客户端的连接,进行请求处理和响应返回。这种多进程架构可以充分利用多核 CPU 的优势,提高处理效率。
四、关键工作机制
- 事件驱动模型
- Nginx 使用事件驱动的异步非阻塞模型。例如,当有新的网络连接请求时,Nginx 不会阻塞等待这个请求处理完成,而是继续监听其他连接请求。当连接上有数据可读或可写时,相应的事件被触发,然后由相应的模块进行处理。
- 模块体系
- Nginx 由一系列模块组成,包括核心模块、事件模块、HTTP 模块、mail 模块等。每个模块负责特定的功能,比如 HTTP 模块处理 HTTP 请求和响应,通过模块的组合实现丰富的功能。
五、正向代理和反向代理
- 正向代理
- 客户端知道代理服务器的存在,并主动配置使用代理服务器来访问目标服务器。代理服务器代替客户端向目标服务器发起请求,对于目标服务器来说,它只知道请求来自代理服务器,而不知道真正的客户端。例如,在企业内部网络中,员工通过代理服务器访问外部网站,以实现访问控制和提高访问效率等目的。
- 反向代理
- 客户端并不知道代理服务器的存在,客户端向目标服务器发送请求时,请求会先被反向代理服务器接收。反向代理服务器根据配置将请求转发到后端真正的服务器进行处理,然后将处理结果返回给客户端。对于客户端来说,它只知道自己在与目标服务器通信,而不知道后端有多个服务器。比如,在大型网站架构中,使用反向代理服务器可以实现负载均衡和隐藏后端服务器的真实架构。
六、nginx主配置文件分析
1.全局块(main)
- 配置指令:通常位于配置文件的开头部分。例如
user nobody;
、worker_processes auto;
等。 - 功能说明:
user
指令:指定 Nginx 工作进程运行的用户和用户组。合理设置用户可以增强系统安全性,防止 Nginx 进程因权限过高带来潜在风险。例如,如果设置为nobody
用户,Nginx 将以较低权限运行,限制了其对系统资源的不当访问。worker_processes
指令:确定 Nginx 工作进程的数量。设置为auto
时,Nginx 会自动根据 CPU 核心数来确定合适的工作进程数量。增加工作进程数量可以提高 Nginx 的并发处理能力,但过多的进程也可能导致资源竞争。error_log
指令:定义错误日志的路径和日志级别。例如error_log /var/log/nginx/error.log;
会将错误信息记录到指定路径下的文件中。日志级别可以是debug
、info
、warn
、error
等,不同级别决定了记录错误信息的详细程度。较低的日志级别(如debug
)会记录更多的信息,有助于排查复杂问题,但会占用更多的磁盘空间。
2. events 块
- 配置指令:例如
events { use epoll; worker_connections 1024; }
。 - 功能说明:
use
指令:指定 Nginx 使用的事件驱动模型。在 Linux 系统中,常用的是epoll
,它是一种高效的 I/O 多路复用机制。这种机制允许 Nginx 在单个线程内同时处理多个连接的 I/O 事件,提高了服务器的并发处理能力。worker_connections
指令:定义每个 worker 进程可以同时处理的最大连接数。这里设置为1024
只是一个示例值,实际应用中可根据服务器硬件资源和预期的并发量进行调整。合理设置此值可以充分利用服务器资源,同时避免因连接数过多导致系统崩溃。
3. http 块
- 配置指令:这是 Nginx 配置中内容最丰富的部分,包含了多个子块和指令,如
server
、location
、upstream
等。 - 功能说明:
server
子块:用于定义虚拟服务器。一个 Nginx 可以配置多个虚拟服务器,每个虚拟服务器可以对应不同的域名或 IP 地址。例如:
server {listen 80;server_name example.com;root /var/www/html;location / {try_files $uri $uri/ =404;}
}
-
listen
指令:指定服务器监听的端口号,这里是80
,表示监听 HTTP 协议的默认端口。 -
server_name
指令:设置服务器的域名或 IP 地址,这里是example.com
。当客户端请求的域名与server_name
匹配时,Nginx 会将请求路由到这个虚拟服务器进行处理。 -
root
指令:定义服务器的根目录,即服务器查找文件的起始目录。这里设置为/var/www/html
,当客户端请求一个 URL 时,Nginx 会在这个目录下查找相应的文件。 -
location
子块:用于对特定的 URL 路径进行配置。在这个例子中,location /
表示对所有请求路径进行处理。try_files
指令尝试按照顺序查找文件,如果找不到则返回404
错误。 -
upstream
子块:主要用于实现后端服务器的负载均衡。例如:
upstream backend_pool {server backend1.example.com;server backend2.example.com weight=2;
}
这里定义了一个名为 backend_pool
的后端服务器组,其中包含两个后端服务器。weight
参数可以设置服务器的权重,权重越高的服务器被分配到请求的概率越大。在这个例子中,backend2.example.com
的权重为 2
,意味着它比 backend1.example.com
更有可能接收到请求。
include
指令:可以在 http 块中使用,用于引入其他配置文件。例如include /etc/nginx/conf.d/*.conf;
会将指定目录下所有以.conf
结尾的文件内容包含到当前配置中,这种方式可以方便地对配置进行模块化管理。