摘要
本文基于用户提供的文档资料,系统性地整理了 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/O(Input/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 编译安装
推荐使用源码编译安装,以便自定义功能和路径。
bash
# 安装依赖
dnf install gcc pcre-devel zlib-devel openssl-devel -y
创建运行用户
useradd -s /sbin/nologin -M nginx
解压并配置
./configure
--prefix=/usr/local/nginx
--user=nginx
--group=nginx
--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(配置文件)、html(Web 文件)、logs(日志)、sbin(二进制程序)。
5. Nginx 核心配置与反向代理
5.1 配置文件结构
主配置文件 nginx.conf 包含全局块、events 块、http 块等。http 块内可包含多个 server 块定义虚拟主机。
nginx
# 全局配置
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 反向代理
反向代理接收客户端请求,转发给后端服务器,并将响应返回给客户端,客户端感知不到后端的存在。
nginx
http {
upstream backend_servers {
server 192.168.1.101:8080 weight=5;
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 模块支持四层(传输层)代理。
nginx
# TCP 负载均衡示例(MySQL)
stream {
upstream mysql_backend {
server 172.25.254.20:3306 max_fails=3 fail_timeout=30s;
server 172.25.254.30:3306 max_fails=3 fail_timeout=30s;
}
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_fails=3 fail_timeout=30s;
server 172.25.254.30:53 max_fails=3 fail_timeout=30s;
}
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 与 FastCGI
- CGI:通用网关接口,Web 服务器与外部应用程序的接口标准。每个请求创建一个新进程,效率低。
- FastCGI:CGI 的改进版,进程处理完请求后不销毁,可复用,大大提升了性能。
- PHP-FPM:PHP 的 FastCGI 进程管理器,负责管理 worker 进程,解析 PHP 代码。
6.2 Nginx 配置 PHP-FPM
通过 ngx_http_fastcgi_module 模块将 PHP 请求转发给 PHP-FPM 处理。
nginx
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实现缓存读写。
nginx
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 OpenResty
OpenResty 是基于 Nginx 与 Lua 的高性能 Web 平台,内部集成了大量 Lua 库和第三方模块。它将 Nginx 转变为一个强大的通用 Web 应用平台,开发者可以使用 Lua 脚本语言调用各种 C 及 Lua 模块,快速构建高并发应用。
官网 :OpenResty® - 基于 Nginx 与 LuaJIT 的开源 Web 平台
7.2 Tengine
由淘宝网发起的 Web 服务器项目,在 Nginx 的基础上添加了许多高级功能和特性,如动态模块加载、更灵活的负载均衡算法等,经历了淘宝、天猫等大型网站的检验。
8. 总结
Nginx 凭借其事件驱动、异步非阻塞的架构,在高并发连接处理上表现出色。本文从 Web 基础、I/O 模型入手,深入剖析了 Nginx 的架构原理、安装配置、核心功能(反向代理、负载均衡)以及如何与 PHP-FPM 协同工作。此外,还介绍了通过缓存和 OpenResty 进行性能扩展和功能增强的方法。掌握 Nginx 是构建高性能、高可用 Web 服务架构的关键技能。