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/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 模型

  1. 阻塞型 I/O:进程发起 read 调用后一直阻塞,直到数据就绪并拷贝完成。简单但并发能力差。
  2. 非阻塞型 I/O:调用立即返回,进程需不断轮询(polling)检查数据是否就绪。浪费 CPU 资源。
  3. 信号驱动式 I/O:内核在数据就绪时发送信号通知进程,进程再发起 read 操作。进程在等待期间不被阻塞。
  4. 异步 I/O:进程发起 aio_read 后立即返回,内核完成数据准备和拷贝后通知进程。两个阶段进程均非阻塞。
  5. 多路复用 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 应用性能。

  1. 安装 PHP Memcache 扩展 :通过 pecl 或源码编译安装。
  2. 配置 Nginx 与 Memcached 集成 :利用第三方模块如 srcache-nginx-modulememc-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 的基础上添加了许多高级功能和特性,如动态模块加载、更灵活的负载均衡算法等,经历了淘宝、天猫等大型网站的检验。

官网The Tengine Web Server

8. 总结

Nginx 凭借其事件驱动、异步非阻塞的架构,在高并发连接处理上表现出色。本文从 Web 基础、I/O 模型入手,深入剖析了 Nginx 的架构原理、安装配置、核心功能(反向代理、负载均衡)以及如何与 PHP-FPM 协同工作。此外,还介绍了通过缓存和 OpenResty 进行性能扩展和功能增强的方法。掌握 Nginx 是构建高性能、高可用 Web 服务架构的关键技能。

相关推荐
用户3169353811832 小时前
ry.bat和ry.sh部署
运维
mennekes2 小时前
自动化产线临时配电:明装工业插座 vs 面板式工业插座 vs 模块化插座箱取舍
运维·科技·安全·制造
tedcloud1233 小时前
book-to-skill 怎么部署?把技术书和项目文档变成 AI Agent 可复用知识
linux·运维·服务器·人工智能·开源
旗开得胜马到成功3 小时前
SK海力士SSD售后翻车:企业备份介质裸奔风险与中科热备技术选型拆解
运维·服务器·网络
fatcoder3 小时前
玩转Nginx 09 — 运维排障:三场"火灾"实战演练
前端·后端·nginx
7177773 小时前
厘清 Gitee Test 能力边界:测试管理、自动化与 DevSecOps 协同路径
运维·gitee·自动化
brian00313 小时前
虚拟机vmware文件的后缀名汇总介绍
运维·vmware·后缀名
2301_800954994 小时前
Linux 常用系统信息与进程管理命令速查
linux·运维·服务器
ITyunwei09874 小时前
CPU 100% 排查实战复盘:4步从确认到根治(附命令)
运维·企业微信
优化Henry4 小时前
学习笔记之爱立信站点指向证书执行
运维·服务器·网络·笔记·学习·信息与通信