Nginx 全面解析:从基础到高级应用

发布时间:2026/8/20 10:54:19
Nginx 全面解析:从基础到高级应用 摘要本文基于用户提供的文档资料系统性地整理了 Nginx 的核心知识体系。内容涵盖 Web 服务基础、I/O 模型、Nginx 架构、安装部署、核心模块、反向代理、负载均衡、FastCGI 配置以及与 PHP 的集成等关键主题。旨在为读者提供一个结构清晰、内容全面的 Nginx 学习指南。1. Web 服务基础1.1 Web 服务访问流程一次典型的 Web 服务访问流程涉及客户端发起请求经过网络传输到达 Web 服务器。服务器处理请求后返回响应数据给客户端。1.2 Apache Web 服务器模型Apache 是经典的 Web 服务器主要有三种工作模型Prefork 模型多进程模型每个请求由一个独立的子进程处理。稳定但并发能力有限适用于访问量不大的场景。Worker 模型多进程多线程混合模型。相比 Prefork 内存占用更少能处理更高并发但长连接场景下线程可能被长时间占用。Event 模型Apache 2.4 引入的事件驱动模型。解决了 Worker 模型中长连接线程浪费的问题在高并发场景下表现更优。2. Nginx 高性能 Web 服务器2.1 Nginx 简介Nginx 由 Igor Sysoev 于 2004 年首次发布是一个高性能的 HTTP、反向代理、邮件及 TCP/UDP 代理服务器。2019 年被 F5 Networks 以约 6.7 亿美元收购。核心特性事件驱动、异步非阻塞架构、高并发、低内存消耗、热部署等。被淘宝、京东、新浪等众多大型互联网公司广泛使用。2.2 服务端 I/O 流程I/OInput/Output是计算机与外部世界如磁盘、网络交换数据的过程。磁盘 I/O进程请求磁盘数据内核将数据从磁盘加载到内核缓冲区再复制到用户空间进程内存。网络 I/O本质是对 socket 文件的读写数据从网络协议栈传输到用户空间进程。每次 I/O 操作都包含两个阶段1) 数据准备等待数据加载到内核缓冲区2) 数据拷贝从内核缓冲区复制到用户空间。3. I/O 模型详解3.1 基本概念同步 vs 异步关注被调用者是否主动通知调用者结果。同步调用者需主动询问结果。异步被调用者通过状态、通知或回调主动告知调用者。阻塞 vs 非阻塞关注调用者在等待结果时的状态。阻塞调用者被挂起直到 I/O 操作彻底完成。非阻塞调用后立即返回一个状态调用者可继续执行其他任务。3.2 网络 I/O 模型阻塞型 I/O进程发起 read 调用后一直阻塞直到数据就绪并拷贝完成。简单但并发能力差。非阻塞型 I/O调用立即返回进程需不断轮询polling检查数据是否就绪。浪费 CPU 资源。信号驱动式 I/O内核在数据就绪时发送信号通知进程进程再发起 read 操作。进程在等待期间不被阻塞。异步 I/O进程发起 aio_read 后立即返回内核完成数据准备和拷贝后通知进程。两个阶段进程均非阻塞。多路复用 I/O单个进程通过 select/poll/epoll 系统调用同时监控多个文件描述符。当某个描述符就绪时进程再进行处理。这是 Nginx 高性能的核心属于异步阻塞模型。五种 I/O 模型对比前四种属于同步 I/O只有异步 I/O 模型符合 POSIX 定义的异步 I/O。多路复用 I/O 是实际高并发场景中最常用的模型。3.3 零拷贝技术传统 I/O 涉及多次数据拷贝和用户态/内核态切换消耗大量 CPU。零拷贝技术旨在减少或消除不必要的数据拷贝。MMAP内存映射将文件映射到进程地址空间进程可直接通过指针读写内存减少一次内核到用户空间的拷贝。sendfile数据直接从内核缓冲区发送到网络套接字无需经过用户空间。Nginx 广泛使用 sendfile 等零拷贝技术来提升静态文件传输性能。4. Nginx 架构与安装4.1 Nginx 功能与特性主要功能静态 Web 资源服务器。HTTP/HTTPS、TCP/UDP 反向代理。结合 FastCGI/uWSGI/SCGI 代理动态资源请求。支持虚拟主机、访问日志、URL 重写、访问控制、速率限制等。基础特性模块化设计、高可靠性、支持热部署、低内存消耗、事件驱动、支持 AIO、mmap、sendfile。4.2 Nginx 进程结构Nginx 采用多进程模型Master 进程管理 Worker 进程读取验证配置平滑升级开启日志等。Worker 进程平等的子进程实际处理网络请求。数量通常设置为 CPU 核心数。进程间通信Master 与 Worker 通过单向管道传递指令Worker 之间通过 Master 中转或共享内存通信。4.3 Nginx 模块核心模块错误日志、配置解析、事件驱动、进程管理等。标准 HTTP 模块HTTP 协议解析相关功能。可选 HTTP 模块扩展 HTTP 功能如 SSL、压缩等。邮件服务模块支持 POP3、IMAP、SMTP 协议。Stream 模块实现 TCP/UDP 反向代理。第三方模块如 JSON 支持、Lua 支持OpenResty。4.4 Nginx 编译安装推荐使用源码编译安装以便自定义功能和路径。# 安装依赖 dnf install gcc pcre-devel zlib-devel openssl-devel -y 创建运行用户 useradd -s /sbin/nologin -M nginx 解压并配置 ./configure --prefix/usr/local/nginx --usernginx --groupnginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module 编译并安装 make make install安装后主要目录conf配置文件、htmlWeb 文件、logs日志、sbin二进制程序。5. Nginx 核心配置与反向代理5.1 配置文件结构主配置文件nginx.conf包含全局块、events 块、http 块等。http 块内可包含多个 server 块定义虚拟主机。# 全局配置 user nginx; worker_processes auto; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; # 虚拟主机示例 server { listen 80; server_name localhost; location / { root html; index index.html index.htm; } } }5.2 HTTP 反向代理反向代理接收客户端请求转发给后端服务器并将响应返回给客户端客户端感知不到后端的存在。http { upstream backend_servers { server 192.168.1.101:8080 weight5; server 192.168.1.102:8080; server 192.168.1.103:8080 backup; } server { listen 80; server_name proxy.example.com; location / { proxy_pass http://backend_servers; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } }负载均衡算法轮询默认、权重weight、IP 哈希ip_hash、最少连接least_conn等。5.3 TCP/UDP 负载均衡Nginx 的 Stream 模块支持四层传输层代理。# TCP 负载均衡示例MySQL stream { upstream mysql_backend { server 172.25.254.20:3306 max_fails3 fail_timeout30s; server 172.25.254.30:3306 max_fails3 fail_timeout30s; } server { listen 172.25.254.10:3306; proxy_pass mysql_backend; proxy_connect_timeout 30s; proxy_timeout 300s; } } UDP 负载均衡示例DNS stream { upstream dns_servers { server 172.25.254.20:53 max_fails3 fail_timeout30s; server 172.25.254.30:53 max_fails3 fail_timeout30s; } server { listen 172.25.254.10:53 udp; proxy_pass dns_servers; proxy_timeout 1s; proxy_responses 1; } }6. Nginx 与 FastCGI (PHP-FPM)6.1 CGI 与 FastCGICGI通用网关接口Web 服务器与外部应用程序的接口标准。每个请求创建一个新进程效率低。FastCGICGI 的改进版进程处理完请求后不销毁可复用大大提升了性能。PHP-FPMPHP 的 FastCGI 进程管理器负责管理 worker 进程解析 PHP 代码。6.2 Nginx 配置 PHP-FPM通过ngx_http_fastcgi_module模块将 PHP 请求转发给 PHP-FPM 处理。server { listen 80; server_name php.example.com; root /data/php; location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; # PHP-FPM 监听地址 fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }6.3 PHP 缓存优化使用 Memcached 等缓存可以显著提升 PHP 应用性能。安装 PHP Memcache 扩展通过pecl或源码编译安装。配置 Nginx 与 Memcached 集成利用第三方模块如srcache-nginx-module和memc-nginx-module实现缓存读写。upstream memcache { server 127.0.0.1:11211; keepalive 512; } server { ... location /memc { internal; memc_connect_timeout 100ms; memc_pass memcache; set $memc_key $query_string; set $memc_exptime 300; } location ~ \.php$ { set $key $uri$args; srcache_fetch GET /memc $key; # 尝试从缓存读取 srcache_store PUT /memc $key; # 存储结果到缓存 fastcgi_pass 127.0.0.1:9000; ... } }7. Nginx 二次开发版本7.1 OpenRestyOpenResty 是基于 Nginx 与 Lua 的高性能 Web 平台内部集成了大量 Lua 库和第三方模块。它将 Nginx 转变为一个强大的通用 Web 应用平台开发者可以使用 Lua 脚本语言调用各种 C 及 Lua 模块快速构建高并发应用。官网OpenResty® - 基于 Nginx 与 LuaJIT 的开源 Web 平台7.2 Tengine由淘宝网发起的 Web 服务器项目在 Nginx 的基础上添加了许多高级功能和特性如动态模块加载、更灵活的负载均衡算法等经历了淘宝、天猫等大型网站的检验。官网The Tengine Web Server8. 总结Nginx 凭借其事件驱动、异步非阻塞的架构在高并发连接处理上表现出色。本文从 Web 基础、I/O 模型入手深入剖析了 Nginx 的架构原理、安装配置、核心功能反向代理、负载均衡以及如何与 PHP-FPM 协同工作。此外还介绍了通过缓存和 OpenResty 进行性能扩展和功能增强的方法。掌握 Nginx 是构建高性能、高可用 Web 服务架构的关键技能。