跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
编程语言

企业级高性能 Web 服务器:Nginx 核心架构与实战配置

Nginx 作为高并发 Web 服务器的核心,采用 Master-Worker 模型与事件驱动机制,通过零拷贝、多路复用等技术解决 C10K 问题。其安装编译、进程架构、核心配置指令及反向代理、负载均衡等高级功能,涵盖从基础 IO 模型到 LNMP 集成的完整实战方案,助力构建稳定高效的线上服务环境。

Pythonist发布于 2026/4/9更新于 2026/9/458 浏览

一、Web 服务基础介绍

Apache 经典 Web 服务端

Apache 历经 1.X、2.X 两大版本,支持编译安装定制功能。其核心有三种工作模型,均基于多进程/线程架构,各有适用场景:

模型核心原理优点缺点适用场景
prefork(预派生)主进程生成多个独立子进程,单进程单线程,select 模型,最大并发 1024稳定性极高,进程独立互不影响内存占用大,并发能力弱,每个请求对应一个进程访问量小、对稳定性要求高的场景
worker(多进程多线程)主进程启动子进程,子进程包含固定线程,线程处理请求,线程不足时新建子进程内存占用比 prefork 少,并发能力更高keepalive 长连接会占用线程至超时,高并发下易无可用线程中等访问量场景
event(事件驱动)2.4.X 版本正式支持,epoll 模型,与 worker 类似,新增专门线程管理 keepalive 线程单线程响应多请求,内存占用最低,高并发表现优秀,解决 keepalive 线程资源浪费无线程安全控制高并发访问场景

Apache 模型示意图

Nginx 高性能 Web 服务端

基础信息

  • 开发者:伊戈尔・赛索耶夫,为俄罗斯 rambler.ru 开发,2004 年首次公开发布,2019 年被 F5 以 6.7 亿美元收购。
  • 版本分类:开发版、稳定版、过期版,核心模块代码量约 19.8 万行。
  • 官网:www.nginx.org。
  • 行业应用:天猫、淘宝、京东、小米等一线互联网公司均使用或二次开发。

核心优势与功能

  • 高性能:解决 C10K(万级连接)问题,低内存消耗(10000 个 keep-alive 非活动连接仅需 2.5M 内存)。
  • 功能丰富:可作为 HTTP/HTTPS 服务器、反向代理、邮件代理、TCP/UDP 代理;支持 FastCGI、SSL、虚拟主机、URL 重写、Gzip、负载均衡(1.9 + 开启 stream 模块),支持第三方扩展。
  • 高可靠性:模块化设计、支持热部署(不停机更新配置/升级/换日志)。

典型工作场景

Nginx 前置处理请求,静态资源直接返回,动态资源转发至 Tomcat 等应用服务器,数据存储至 MySQL,图片等资源由专用存储服务器提供,实现动静分离与服务分层。

服务端 I/O 流程

核心概念

  • I/O:Input/Output,指用户空间进程与内核空间的数据交换,需将内核内存数据复制到用户进程内存。
  • IOPS:每秒输入输出量,衡量磁盘性能的核心指标,指单位时间内处理的读/写请求数。
  • 服务器 I/O 类型:磁盘 I/O(进程请求磁盘资源,内核加载后复制至进程)、网络 I/O(对 socket 文件的读写,网络协议栈与用户进程的数据交换)。

通用 I/O 阶段

无论磁盘/网络 I/O,均分为两个阶段:

  1. 数据从文件/网卡加载至内核内存缓冲区,等待数据准备完成(耗时较长);
  2. 数据从内核缓冲区复制至用户空间进程内存(耗时较短)。

I/O 模型

I/O 模型的核心区分维度为同步/异步(消息通信机制,是否主动通知处理结果)、阻塞/非阻塞(等待结果时的进程状态,是否被挂起),主流有 5 种网络 I/O 模型,前 4 种为同步 I/O,仅异步 I/O 为纯异步。

核心概念

  • 同步:被调用者不主动通知结果,调用者需主动查询;
  • 异步:被调用者通过状态/通知/回调主动告知调用者运行状态;
  • 阻塞:IO 操作完成前,进程被挂起,无法执行其他操作;
  • 非阻塞:IO 操作调用后立即返回状态,进程不挂起,可执行其他操作。

5 种网络 I/O 模型详解

  1. 阻塞型 I/O(blocking IO)

    • 原理:用户线程发起系统调用后,全程阻塞,直至数据从内核复制至用户空间;
    • 优点:程序简单,阻塞期间基本不占用 CPU;
    • 缺点:单连接单进程/线程,并发高时内存、线程切换开销大(Apache prefork 基于此)。
  2. 非阻塞型 I/O(nonblocking IO)

    • 原理:用户线程发起调用后立即返回,无数据则返回错误,通过轮询反复发起调用,直到获取数据;
    • 缺点:轮询消耗大量 CPU,上下文切换频繁,实际极少单独使用。
  3. 信号驱动式 I/O(signal-driven IO)

    • 原理:通过 sigaction 注册信号处理函数,进程继续执行,内核数据就绪时发送 SIGIO 信号,进程在回调中获取数据;
    • 优点:等待数据时进程不阻塞,资源利用率高;
    • 缺点:大量 IO 操作时信号队列易溢出,无法通知。
  4. 异步 I/O(asynchronous IO)

    • 原理:用户线程发起 aio_read 后立即返回,内核完成数据准备 + 复制全流程后,主动通知进程;
    • 优点:充分利用 DMA 特性,I/O 与计算重叠,全程非阻塞;
    • 缺点:操作系统实现复杂,Linux 2.6 才引入,AIO 不完善,常用开源库(libevent、libev)实现。
  5. 多路复用 I/O(I/O multiplexing)

    • 原理:单个线程通过 select/poll/epoll 系统调用,同时监控多个文件描述符(socket),内核发现任一描述符就绪后通知线程,线程再处理对应请求;
    • 核心实现:select(数组,最大连接 1024/2048)、poll(链表,无连接上限)、epoll(哈希表,无连接上限,事件回调);
    • 优点:单线程处理多连接,节省系统资源;
    • 缺点:连接数少时效率低于多线程 + 阻塞 I/O,需两次系统调用;
    • 适用场景:多连接、多协议、多服务的服务器场景(Nginx 核心模型)。

select/poll/epoll 对比

特性selectpollepoll
操作方式线性遍历线性遍历事件回调
底层实现数组链表哈希表
IO 效率O(n)O(n)O(1)
最大连接数1024(x86)/2048(x64)无上限无上限
IO 拷贝每次调用均从用户态拷贝至内核态每次调用均从用户态拷贝至内核态仅 epoll_ctl 时拷贝,epoll_wait 不拷贝

零拷贝

传统 Linux I/O 问题

标准 I/O 接口(read/write)基于数据拷贝,需经过用户态 - 内核态多次切换,数据拷贝耗时占比达 57.1%,严重消耗 CPU,降低传输性能。

零拷贝核心思想

并非真正'0 拷贝',而是通过减少用户态与内核态之间的拷贝、降低上下文切换,缓解 CPU 压力,核心技术为 MMAP 和 SENDFILE。

核心零拷贝技术

SENDFILE:数据直接在内核缓冲区与 socket 缓冲区之间传输,全程不经过用户态,彻底消除用户态 - 内核态的拷贝,适合静态文件传输(Nginx 默认启用)。

MMAP(内存映射):将磁盘文件映射至进程虚拟地址空间,进程可直接访问内核缓冲区(page cache),减少一次内核态到用户态的拷贝,适合大量数据传输。

二、Nginx 架构和安装

Nginx 概述

  1. 命名:engine X,轻量级高性能服务器,分为社区版(开源免费)和商业版(Nginx Plus);
  2. 二次发行版:
    • Tengine:淘宝发起,基于 Nginx 添加高级功能,适用于大访问量网站;
    • OpenResty:章亦春团队开发,基于 Nginx+Lua,高性能 Web 平台,支持超高并发;
  3. 核心定位:HTTP/HTTPS 服务器、反向代理、TCP/UDP 代理、邮件代理,解决 C10K 问题。

Nginx 核心功能

  1. 静态资源服务:高效处理 HTML、图片、JS、CSS 等静态文件;
  2. 反向代理:支持 HTTP/HTTPS、TCP/UDP、FastCGI/uWSGI/SCGI、imap4/pop3 等协议;
  3. 基础特性:模块化设计、高可靠性、热部署、低内存消耗、事件驱动(epoll)+AIO+MMAP+SENDFILE;
  4. Web 相关功能:虚拟主机、keep-alive、访问日志、URL 重写、IP/用户访问控制、速率/并发限制、在线升级。

Nginx 进程架构

Nginx 采用Master-Worker多进程模型,主进程与工作进程分工明确,进程间通过管道、共享内存通信,支持平滑升级和故障重启。

进程结构与功能

进程类型核心功能
Master(主进程)读取/验证配置、管理 Worker 进程、监控 Worker 状态(异常自动重启)、绑定/关闭 socket、接收外部指令(重启/升级/退出)、实现平滑升级、开启日志文件
Worker(工作进程)处理实际网络请求、平等竞争新连接、I/O 调用、与后端服务器通信、缓存数据、发送响应结果、接收主进程指令;数量一般等于 CPU 核心数,避免进程竞争 CPU

进程间通信

  1. Master 与 Worker:Master 通过单向管道向 Worker 发送指令,Worker 捕获管道可读事件并执行操作;Master 通过 fork() 生成 Worker,维护工作进程表;
  2. Worker 之间:通过 Master 转发管道信息实现通信,或通过共享内存(如 upstream zone、limit_req)通信。

Nginx 启动与 HTTP 连接建立

  1. Master 进程加载配置文件,初始化监听 socket;
  2. Master fork 出多个 Worker 进程;
  3. Worker 进程竞争新连接,获胜方通过 TCP 三次握手建立连接,处理请求。

Nginx 模块体系

Nginx 高度模块化,模块是功能实现的核心,1.9.11 版本开始支持动态装载/卸载,模块分为五大类:

模块类型核心功能示例
核心模块Nginx 运行必备,负责基础功能错误日志、配置解析、事件驱动、进程管理
标准 HTTP 模块HTTP 协议解析,基础 Web 功能端口配置、网页编码、HTTP 响应头设置
可选 HTTP 模块扩展 HTTP 功能,需编译指定Gzip 压缩、SSL、GeoIP 解析、Flash 传输
邮件服务模块支持邮件代理协议POP3、IMAP、SMTP 协议处理
Stream 服务模块实现 TCP/UDP 反向代理四层负载均衡、TCP 协议转发
第三方模块开发者自定义功能Lua 支持、Json 解析、Rds-json

Nginx 安装

推荐源码编译安装(可自定义路径、功能,yum 版本较旧),需提前安装依赖库,编译后生成四大核心目录。

编译安装准备

  1. 依赖库:GCC(编译器)、pcre-devel(rewrite 功能)、zlib-devel(gzip 功能)、openssl-devel(SSL 功能)、Automake(自动生成 Makefile);
  2. 源码下载:https://nginx.org/en/download.html;
  3. 创建运行用户:useradd -s /sbin/nologin -M nginx。

编译安装步骤

# 安装依赖
dnf install gcc pcre-devel zlib-devel openssl-devel -y
# 解压源码
tar zxf nginx-1.24.0.tar.gz && cd nginx-1.24.0
# 配置编译参数(自定义路径、功能)
./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
# 编译并安装
make && make install

核心目录说明

目录功能
/usr/local/nginx/conf所有配置文件,核心为 nginx.conf
/usr/local/nginx/html静态 Web 文件,包含默认错误页面(50x.html)
/usr/local/nginx/logs访问日志、错误日志、PID 文件
/usr/local/nginx/sbin二进制启动脚本(nginx),支持多种命令参数

Nginx 常用命令

nginx -v # 查看版本
nginx -V # 查看版本 + 编译参数
nginx -t # 测试配置文件有效性
nginx -s reload # 平滑重载配置
nginx -s quit # 优雅退出
nginx -s stop # 强制停止
nginx -g "worker_processes 6;" # 临时指定全局指令

系统服务配置(systemd)

创建 /lib/systemd/system/nginx.service,实现 systemctl 管理:

[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

启用服务:systemctl daemon-reload && systemctl enable --now nginx。

Nginx 平滑升级和回滚

无需停机,实现版本升级/回滚,核心通过信号控制(SIGUSR2、WINCH、QUIT、HUP),保证业务不中断。

平滑升级流程

  1. 备份旧版 Nginx 二进制文件:cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old;
  2. 编译新版本源码(仅 make,不 make install),将新二进制文件替换旧文件;
  3. 向旧 Master 进程发送 SIGUSR2:旧 Master 重命名 PID 文件为 nginx.pid.oldbin,启动新 Master 进程;
  4. 向旧 Master 发送 WINCH:旧 Worker 进程平滑停止,新请求由新 Worker 处理;
  5. 验证升级成功后,向旧 Master 发送 QUIT:关闭旧 Master,完成升级。

回滚流程

  1. 将备份的旧版二进制文件替换新版文件;
  2. 向旧 Master(nginx.pid.oldbin)发送 HUP:重新拉起旧 Worker 进程;
  3. 向新 Master 发送 WINCH:新 Worker 进程平滑停止;
  4. 向新 Master 发送 QUIT:关闭新 Master,完成回滚。

三、Nginx 核心配置详解

Nginx 配置文件为纯文本格式,采用指令 + 指令块结构,支持 include 引入子配置、注释(#)、变量($),核心分为四大配置段:main(全局)、event(事件驱动)、http(HTTP/HTTPS)、stream(TCP/UDP),mail(邮件)为可选段。

配置文件基础规则

  1. 指令以分号; 结尾,指令与值之间用空格分隔;
  2. 指令块以 {} 包裹,支持嵌套(如 http 包含 server,server 包含 location);
  3. include 语句:组合多个配置文件,提升可维护性(如 include conf.d/*.conf);
  4. 变量:内置变量(模块提供,直接使用)、自定义变量(set $变量名 值;),引用方式为 $变量名;
  5. 部分指令支持正则表达式,用于 URL 匹配、条件判断。

全局配置段(main)

对所有配置段生效,核心为 Nginx 运行的基础配置,分为必备配置、性能优化配置、调试配置三类。

核心配置指令

指令功能推荐值
user nginx nginx;启动 Worker 进程的用户和组专用 nginx 用户
worker_processes n;Worker 进程数量等于 CPU 核心数(或 auto)
worker_cpu_affinity 掩码;将 Worker 进程绑定到指定 CPU 核心如 4 核心:0001 0010 0100 1000
error_log 路径 级别;错误日志路径与级别/usr/local/nginx/logs/error.log error
pid 路径;PID 文件保存路径/usr/local/nginx/logs/nginx.pid
worker_priority n;Worker 进程优先级0(范围 -20~20,值越高优先级越高)
worker_rlimit_nofile n;Worker 进程最大打开文件数65536(与系统 ulimit -n 一致)
daemon on/off;是否以守护进程运行on(生产)/off(测试/容器)
master_process on/off;是否启用 Master-Worker 模型on(生产)/off(调试)

事件驱动配置段(event)

仅用于配置事件驱动相关功能,决定 Nginx 与客户端的网络连接方式,是高并发优化的核心配置段。

核心配置指令

指令功能推荐值
worker_connections n;单个 Worker 进程最大并发连接数65535
use 模型;事件驱动模型epoll(Linux)/kqueue(FreeBSD)
accept_mutex on/off;连接互斥锁,防止惊群效应on
multi_accept on/off;单个 Worker 进程是否同时接受多个连接on

高并发配置要点

  1. 调整系统内核:ulimit -n 65536(临时),修改 /etc/security/limits.conf(永久);
  2. 配置 worker_rlimit_nofile 65536:突破文件数限制;
  3. 关闭不必要的模块,减少资源占用;
  4. 开启 epoll、accept_mutex、multi_accept。

HTTP 配置段(http)

处理所有 HTTP/HTTPS 协议相关配置,是 Nginx 配置的核心,包含虚拟主机、缓存、代理、日志、压缩等功能,可嵌套多个 server 指令块(虚拟主机)。

核心基础配置指令

指令功能推荐值
include mime.types;引入 MIME 类型映射文件必加
default_type 类型;未匹配 MIME 类型的默认文件类型application/octet-stream(下载)/text/html
sendfile on/off;启用零拷贝 SENDFILE 技术on
keepalive_timeout n [m];keep-alive 长连接超时时间65 60(服务器 65s,告知客户端 60s)
keepalive_requests n;单条长连接最大请求数500(默认 100)
log_format 名称 格式;定义访问日志格式包含、request、$status 等
access_log 路径 格式;访问日志路径与格式/usr/local/nginx/logs/access.log main

虚拟主机配置段(server)

属于 http 子配置段,一个 http 可包含多个 server,每个 server 对应一个虚拟主机,通过 listen(端口)、server_name(域名/IP)区分,核心用于部署多站点。

核心配置指令

server {
    listen 80; # 监听端口(可加 IP,如 192.168.1.100:80)
    server_name example.com www.example.com; # 虚拟主机域名,支持多个、通配符、正则
    root /webdata/nginx/example/html; # 站点根目录
    index index.html index.htm index.php; # 默认首页文件
    error_page 404 500 502 /error.html; # 自定义错误页面
    access_log /var/log/nginx/example.access.log main; # 独立访问日志
}

路径匹配配置段(location)

属于 server 子配置段,一个 server 可包含多个 location,根据用户请求的 URI进行匹配,实现路径映射、访问控制、反向代理等功能,是 Nginx 配置最灵活的部分。

location 匹配语法与优先级

语法:location [ = | ~ | ~* | ^~ ] uri { ... } 匹配优先级从高到低:= (精确匹配) > ^~(前缀匹配,终止正则) > ~(正则,区分大小写)/~*(正则,不区分大小写) > 普通前缀匹配(无符号)

修饰符功能示例
=精确匹配 URI,匹配成功立即停止location = /logo.png { ... }
^~前缀匹配,匹配成功后终止后续正则匹配location ^~ /static/ { ... }
~正则匹配,区分大小写location ~ .php$ { ... }
~*正则匹配,不区分大小写location ~* .(jpg
无普通前缀匹配,按匹配度最高匹配location /web/ { ... }

root 与 alias(路径映射)

均用于指定文件路径,核心区别:

  1. root:root 路径,文件绝对路径 = root 路径 + location URI(默认方式);示例:location /dirtest { root /mnt; } → 访问 /dirtest 对应 /mnt/dirtest;
  2. alias:alias 路径,直接替换 location URI 为指定路径,仅适用于 location;示例:location /alias { alias /mnt/dirtest; } → 访问 /alias 对应 /mnt/dirtest。

核心配置实战案例

多虚拟主机配置

基于域名部署两个站点,通过 include 引入子配置:

# 创建子配置目录
mkdir /usr/local/nginx/conf.d
# 主配置文件引入子配置
echo 'include conf.d/*.conf;' >> /usr/local/nginx/conf/nginx.conf
# 创建站点配置文件
vim /usr/local/nginx/conf.d/site1.conf
server {
    listen 80;
    server_name site1.example.com;
    root /webdata/nginx/site1/html;
    index index.html;
}

自定义错误页面

server {
    listen 80;
    server_name site1.example.com;
    root /webdata/nginx/site1/html;
    error_page 404 /404.html; # 404 错误指向 404.html
    error_page 500 502 503 504 /50x.html; # 服务器错误指向 50x.html
    # 错误页面独立路径
    location = /404.html {
        root /webdata/nginx/site1/errors;
    }
    location = /50x.html {
        root /webdata/nginx/site1/errors;
    }
}

文件存在检测(try_files)

按顺序检查文件/目录是否存在,返回第一个存在的,否则重定向至最后一个参数:

server {
    listen 80;
    server_name site1.example.com;
    root /webdata/nginx/site1/html;
    # 检查$uri → $uri.html → $uri/index.html,均不存在则指向/error/default.html
    try_files $uri $uri.html $uri/index.html /error/default.html;
}

下载服务器配置(autoindex)

启用自动目录索引,支持文件下载,可限速、显示文件信息:

server {
    listen 80;
    server_name site1.example.com;
    root /webdata/nginx/site1;
    location /download {
        autoindex on; # 启用自动索引
        autoindex_exact_size off; # 显示文件近似大小(K/M/G)
        autoindex_localtime on; # 显示服务器本地时间
        limit_rate 1024k; # 限速 1MB/s
    }
}

账户认证(auth_basic)

基于 ngx_http_auth_basic_module 实现 HTTP 基本认证,需生成密码文件:

# 安装 htpasswd,生成密码文件
yum install httpd-tools -y
htpasswd -cmb /usr/local/nginx/conf/.htpasswd admin 123456
location /admin {
    root /webdata/nginx/site1/html;
    auth_basic "Admin Login"; # 认证提示语
    auth_basic_user_file /usr/local/nginx/conf/.htpasswd; # 密码文件路径
}

四、Nginx 高级配置

Nginx 状态页(stub_status)

基于 ngx_http_stub_status_module 实现,查看 Nginx 运行状态(需编译时添加 --with-http_stub_status_module),显示全局状态,非单个虚拟主机。

配置示例

location /nginx_status {
    stub_status; # 启用状态页
    auth_basic "Nginx Status"; # 认证保护
    auth_basic_user_file /usr/local/nginx/conf/.htpasswd;
    allow 192.168.1.0/24; # 允许指定 IP 段访问
    allow 127.0.0.1;
    deny all; # 拒绝其他 IP
}

状态页核心指标

Active connections: 291 # 当前活动连接数(Reading+Writing+Waiting)
server accepts handled requests 16630948 16630948 31070465 # 接受连接数/处理连接数/总请求数
Reading: 6 Writing: 179 Waiting: 106 # 读取请求/发送响应/空闲等待连接数
  • Waiting:开启 keep-alive 时的空闲连接数,Waiting = Active - (Reading+Writing);
  • handled:一般等于 accepts,除非因 worker_connections 限制被拒绝。

Nginx 压缩功能(gzip)

基于 ngx_http_gzip_module 实现,对指定类型文件压缩后传输,降低带宽消耗(需消耗少量 CPU),默认内置模块,无需额外编译。

核心配置指令

http {
    gzip on; # 启用 gzip 压缩
    gzip_comp_level 5; # 压缩级别 1-9,5 为平衡值(值越高压缩比越高,CPU 消耗越大)
    gzip_min_length 1k; # 最小压缩文件大小,小于 1k 不压缩
    gzip_types text/plain text/html text/css application/javascript application/json image/png;
    gzip_vary on; # 响应头添加 Vary: Accept-Encoding,告知浏览器支持压缩
    gzip_disable "MSIE [1-6]."; # 禁用 IE6 及以下压缩(不支持)
    gzip_static on; # 启用预压缩(直接使用.gz 文件,无需实时压缩)
}

验证压缩

使用 curl 命令验证,响应头包含 Content-Encoding: gzip 即为压缩成功:

curl --head --compressed http://example.com/data.txt

Nginx 版本隐藏

隐藏响应头中的 Nginx 版本号,提升安全性,需修改源码重新编译:

// 编辑源码头文件
vim nginx-1.26.1/src/core/nginx.h
// 修改版本号
#define NGINX_VERSION "1.0"
// 可选:修改服务器标识
#define NGINX_VER "HAHA/" NGINX_VERSION
// 重新编译安装
make && make install

Nginx 变量使用

Nginx 变量分为内置变量(模块提供,获取请求/服务器信息)和自定义变量(用户定义,set 指令),用于配置判断、日志、URL 重写等场景。

常用内置变量

变量功能
$remote_addr客户端 IP 地址
$request_uri包含参数的完整 URI(如 /var?id=1)
$document_uri不包含参数的 URI(如 /var)
$host客户端请求的主机名
$server_name虚拟主机名
$server_port监听端口
$http_user_agent客户端浏览器信息
$argsURL 中的所有参数
$scheme请求协议(http/https)

自定义变量

通过 set $变量名 值; 定义,支持拼接内置变量:

location /var {
    default_type text/html;
    set $name lee; # 自定义变量
    set $web_addr $scheme://$host:$server_port; # 拼接内置变量
    echo $name; # 输出变量(需 ngx_http_echo_module)
    echo $web_addr;
}

Nginx Rewrite 功能

基于 ngx_http_rewrite_module 实现,通过正则表达式匹配 URI 并修改,支持 URL 重定向、地址伪装、防盗链等,核心依赖 PCRE 库(编译时需 --with-pcre)。

核心指令

  1. if 指令:条件判断,支持正则匹配、文件检测,不支持 else/elif;示例:if ($scheme = http) { rewrite ^(.*)$ https://$host$1 permanent; };
  2. set 指令:定义变量,用于条件判断和 Rewrite;
  3. break 指令:中断当前 location 的后续 Rewrite 规则,继续执行其他指令;
  4. return 指令:直接返回响应状态码/重定向,后续指令全部不执行;示例:return 301 http://www.baidu.com;(永久重定向)、return 403 "Forbidden";(禁止访问);
  5. rewrite 指令:核心 Rewrite 指令,语法:rewrite regex replacement [flag];。

Rewrite Flag(标志位)

控制 Rewrite 的循环机制,分为跳转型(客户端重定向)和代理型(服务器内部跳转):

Flag类型功能
redirect跳转型临时重定向(302),客户端重新发起请求,适用于临时调整
permanent跳转型永久重定向(301),客户端缓存重定向记录,适用于永久域名变更
break代理型停止当前 location 的后续 Rewrite,直接执行后续配置,结束循环
last代理型停止当前 location 的后续 Rewrite,对新 URI 启动新一轮 Rewrite 检查

Rewrite 实战案例

文件不存在重定向首页:访问不存在的 URL 时,重定向至网站首页:

server {
    listen 80;
    server_name www.example.com;
    root /webdata/nginx/www/html;
    if (!-e $request_filename) {
        rewrite .* /index.html redirect;
    }
}

HTTP 自动跳转 HTTPS:全站强制 HTTPS,避免死循环(添加 $scheme 判断):

server {
    listen 80;
    listen 443 ssl;
    server_name www.example.com;
    ssl_certificate /usr/local/nginx/certs/cert.pem;
    ssl_certificate_key /usr/local/nginx/certs/key.pem;
    if ($scheme = http) {
        rewrite ^(.*)$ https://$host$1 redirect;
    }
    root /webdata/nginx/www/html;
}

域名永久重定向:将 site1.example.com 永久重定向至 www.example.com:

server {
    listen 80;
    server_name site1.example.com;
    rewrite ^(.*)$ http://www.example.com$1 permanent;
}

Nginx 防盗链

基于 ngx_http_referer_module 实现,通过检查请求头的Referer 字段(记录请求来源),阻止其他网站直接链接本站资源(图片、视频、文件等)。

Referer 有效值

类型功能
none无 Referer(用户直接输入域名访问)
blockedReferer 无有效值(如为空)
server_namesReferer 包含本站域名($server_name)
通配符自定义域名,如 *.example.com
正则正则匹配 Referer,如~/.baidu/(允许百度搜索)

防盗链配置示例

server {
    listen 80;
    server_name www.example.com;
    root /webdata/nginx/www/html;
    # 对图片资源防盗链
    location ~* \.(jpg|png|gif|jpeg)$ {
        # 允许的 Referer
        valid_referers none blocked server_names *.example.com ~/.baidu/ ~/.google/;
        # 无效 Referer 返回 404 或重定向至防盗链图片
        if ($invalid_referer) {
            # return 404;
            rewrite ^/ http://www.example.com/daolian.png permanent;
        }
    }
}

五、Nginx 反向代理功能

反向代理是 Nginx 的核心功能之一,指代理服务器接收客户端请求,转发至后端服务器处理,将结果返回给客户端,代表服务端利益,与正向代理(代表客户端利益,如翻墙)本质区别。

Nginx 支持七层反向代理(HTTP/HTTPS,基于 ngx_http_proxy_module)和四层反向代理(TCP/UDP,基于 ngx_stream_proxy_module,1.9 + 支持),同时支持负载均衡、缓存、会话保持。

核心概念

  1. 同构代理:客户端请求通过 HTTP/TCP 协议直接转发至后端同类服务器(如 Nginx→Apache);
  2. 异构代理:客户端请求通过专用协议转发至后端应用服务器(如 Nginx→PHP-FPM,FastCGI 协议);
  3. 负载均衡:将客户端请求均匀分发至多个后端服务器,提升并发能力、实现故障转移;
  4. 动静分离:静态资源(HTML、图片、JS)由 Nginx 直接返回,动态资源(PHP、Java)转发至后端应用服务器,提升整体性能。

七层反向代理(HTTP/HTTPS)

基于 ngx_http_proxy_module 实现,核心指令为 proxy_pass,支持配置代理参数、缓存、会话保持。

同构代理:用户不需要其他程序的参与,直接通过 http 协议或者 tcp 协议访问后端服务器。 异构代理:用户访问的资源时需要经过处理后才能返回的,比如 php,Python,等等,这种访问资源需 要经过处理才能被访问。

核心代理指令

指令功能
proxy_pass 地址;核心指令,转发请求至后端服务器(IP: 端口/域名/upstream 组)
proxy_set_header 头名 值;修改/添加请求头,转发至后端服务器
proxy_connect_timeout n;Nginx 与后端服务器的连接超时时间
proxy_read_timeout n;Nginx 等待后端服务器响应的超时时间
proxy_hide_header 头名;隐藏后端服务器的响应头,不返回给客户端
proxy_pass_header 头名;透传后端服务器的响应头,返回给客户端

关键配置:proxy_pass 末尾/的影响

proxy_pass 末尾是否加 /,决定 URI 的转发规则,核心区别:

  1. 不加/:将 location 的 URI 拼接至后端地址后;示例:location /web { proxy_pass http://172.25.254.30:8080; } → 访问 /web/index.html 转发至 http://172.25.254.30:8080/web/index.html;
  2. 加/:将 location 的 URI 替换为后端地址的/,不拼接;示例:location /web { proxy_pass http://172.25.254.30:8080/; } → 访问 /web/index.html 转发至 http://172.25.254.30:8080/index.html。

客户端真实 IP 透传

Nginx 作为反向代理时,后端服务器获取的 IP 为 Nginx 的 IP,需通过 proxy_set_header 透传客户端真实 IP:

location / {
    proxy_pass http://172.25.254.30; # 透传客户端真实 IP
    proxy_set_header X-Forwarded-For $remote_addr; # 透传请求主机名
    proxy_set_header Host $host; # 透传请求协议
    proxy_set_header X-Forwarded-Proto $scheme;
}

后端服务器需配置日志格式,记录 X-Forwarded-For 字段。

反向代理缓存

启用代理缓存,将后端服务器的响应结果缓存至 Nginx 本地,减少后端请求,提升响应速度,核心指令为 proxy_cache。

核心缓存指令
http {
    # 定义缓存池,配置在 http 段
    proxy_cache_path /var/cache/nginx/proxy_cache \
        levels=1:2:2 \
        keys_zone=proxycache:20m \
        inactive=120s \
        max_size=10g;
    server {
        listen 80;
        server_name www.example.com;
        location / {
            proxy_pass http://172.25.254.30;
            proxy_cache proxycache; # 启用缓存池
            proxy_cache_key $request_uri; # 缓存 key(基于 URI)
            proxy_cache_valid 200 302 10m; # 200/302 状态码缓存 10 分钟
            proxy_cache_valid 404 1m; # 404 状态码缓存 1 分钟
            proxy_cache_valid any 1m; # 其他状态码缓存 1 分钟
            proxy_cache_use_stale error http_502 http_503; # 后端错误时使用过期缓存
        }
    }
}

七层负载均衡(http_upstream)

基于 ngx_http_upstream_module 实现,通过 upstream 指令定义后端服务器组,实现请求分发,支持多种调度算法和后端服务器状态管理,是高可用架构的核心。

upstream 核心配置

http {
    # 定义后端服务器组,名称为 webserver
    upstream webserver {
        server 172.25.254.20:80 weight=2; # 权重 2,优先级更高
        server 172.25.254.30:80 weight=1; # 权重 1
        server 172.25.254.40:80 backup; # 备份服务器,主服务器不可用时启用
        server 172.25.254.50:80 down; # 标记为下线,平滑移除
    }
    server {
        listen 80;
        server_name www.example.com;
        # 转发至 upstream 组
        location / {
            proxy_pass http://webserver;
            proxy_set_header X-Forwarded-For $remote_addr;
        }
    }
}

后端服务器参数

参数功能
weight=n调度权重,默认为 1,值越高被调度的概率越大
max_fails=n连续失败 n 次后,标记服务器为不可用
fail_timeout=n服务器不可用后,每隔 n 秒检测一次,恢复后重新加入调度
backup备份服务器,所有主服务器不可用时启用
down标记服务器为下线,不参与调度
max_conns=n服务器最大并发连接数,默认为 0(无限制)

调度算法

Nginx 内置多种调度算法,适用于不同场景:

算法原理适用场景
轮询(默认)按顺序依次分发请求至后端服务器后端服务器配置一致
加权轮询按权重分发,权重越高分发越多后端服务器配置不一致(性能差异)
ip_hash基于客户端 IP 哈希,固定 IP 转发至固定服务器需会话保持的场景(如登录状态)
least_conn分发至当前并发连接数最少的服务器后端服务器请求处理时间差异大
hash $key基于自定义 key 哈希(如、cookie)缓存服务器、需按 URL/COOKIE 会话保持
fair基于后端服务器响应时间分发,响应越快优先级越高第三方模块,需单独编译

四层反向代理(TCP/UDP)

基于 ngx_stream_proxy_module 实现(编译时需 --with-stream),工作在TCP/IP 四层协议栈,不解析应用层协议,支持 TCP/UDP 协议的负载均衡,适用于 MySQL、Redis、DNS 等非 HTTP 服务。

TCP 负载均衡(以 MySQL 为例)

# 四层配置段,与 http 同级
stream {
    # 定义 MySQL 后端服务器组
    upstream mysql_server {
        server 172.25.254.20:3306 max_fails=3 fail_timeout=30s;
        server 172.25.254.30:3306 max_fails=3 fail_timeout=30s;
    }
    # 监听 TCP 3306 端口,转发至 MySQL 组
    server {
        listen 172.25.254.10:3306 tcp;
        proxy_pass mysql_server;
        proxy_connect_timeout 30s; # 连接超时
        proxy_timeout 300s; # 转发超时
    }
}

UDP 负载均衡(以 DNS 为例)

stream {
    # 定义 DNS 后端服务器组
    upstream dns_server {
        server 172.25.254.20:53;
        server 172.25.254.30:53;
    }
    # 监听 UDP 53 端口,转发至 DNS 组
    server {
        listen 172.25.254.10:53 udp;
        proxy_pass dns_server;
        proxy_timeout 1s;
        proxy_responses 1; # UDP 协议,响应 1 个报文后终止会话
    }
}

六、Nginx 与 FastCGI 集成(LNMP 架构)

LNMP(Linux+Nginx+MySQL+PHP)是主流的动态网站架构,Nginx 不支持直接运行 PHP,需通过FastCGI 协议将 PHP 请求转发至PHP-FPM(FastCGI 进程管理器)处理,实现动态资源解析。

核心概念

  1. CGI:通用网关接口,Web 服务器与外部应用程序的通信标准,每请求创建一个进程,效率低;
  2. FastCGI:CGI 的升级版,采用长连接,进程处理完请求后不销毁,可重复使用,大幅提升效率;
  3. PHP-FPM:FastCGI 的 PHP 实现,负责管理 PHP 进程(Master+Worker),监听端口接收 Nginx 的 FastCGI 请求;
  4. LNMP 工作流程:客户端→Nginx(处理静态资源)→FastCGI→PHP-FPM(处理 PHP 代码)→MySQL(获取数据)→Nginx→客户端。

核心配置指令(ngx_http_fastcgi_module)

Nginx 通过 fastcgi_pass 指令转发 PHP 请求至 PHP-FPM,核心指令如下:

指令功能
fastcgi_pass 地址;转发 PHP 请求至 PHP-FPM(127.0.0.1:9000/本地套接字)
fastcgi_index index.php;PHP 默认首页文件
fastcgi_param 键 值;设置 FastCGI 参数,传递给 PHP-FPM
include fastcgi_params;引入 FastCGI 默认参数文件(必加)

LNMP 架构实战配置

PHP-FPM 配置

PHP-FPM 默认监听 127.0.0.1:9000,需确保配置正确,启动 PHP-FPM 服务。

Nginx 配置

server {
    listen 80;
    server_name php.example.com;
    root /webdata/nginx/php/html; # PHP 站点根目录
    index index.html index.php; # 支持 PHP 首页
    # 匹配所有.php 文件,转发至 PHP-FPM
    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000; # PHP-FPM 监听地址
        fastcgi_index index.php; # 定义 PHP 脚本文件路径,必须正确
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params; # 引入默认参数
    }
    # 处理静态资源,Nginx 直接返回
    location ~ \.(jpg|png|gif|css|js)$ {
        expires 30d; # 浏览器缓存 30 天
    }
}

测试 PHP 解析

在 PHP 站点根目录创建 info.php,访问测试 PHP 是否解析成功:

<?php phpinfo(); ?>

访问 http://php.example.com/info.php,显示 PHP 信息页面即为配置成功。

PHP 性能优化:缓存模块

为 PHP 添加内存缓存(如 Memcache、Redis),减少数据库请求,提升 PHP 处理效率,以 Memcache 为例:

  1. 安装 PHP Memcache 扩展;
  2. 部署 Memcached 服务;
  3. Nginx 配置缓存转发,PHP 代码调用 Memcache。

七、Nginx 二次开发版本

OpenResty

基础介绍

OpenResty 是由章亦春团队开发的高性能 Web 平台,基于Nginx+LuaJIT实现,将 Lua 虚拟机嵌入 Nginx,支持通过 Lua 脚本扩展 Nginx 功能,无需修改 Nginx 源码。

核心优势:

  • 超高并发:支持 10K~1000K 单机并发连接;
  • 灵活扩展:通过 Lua 脚本快速实现自定义功能(如限流、鉴权、缓存);
  • 丰富生态:内置大量 Lua 库和第三方模块,无需单独编译;
  • 低延迟:LuaJIT 即时编译,性能接近 C 语言。

官网:http://openresty.org/cn/

编译安装 OpenResty

# 安装依赖
dnf install gcc pcre-devel openssl-devel perl -y
# 创建运行用户
useradd -r -s /sbin/nologin nginx
# 下载源码并解压
wget https://openresty.org/download/openresty-1.17.8.2.tar.gz
tar xf openresty-1.17.8.2.tar.gz && cd openresty-1.17.8.2
# 配置编译参数
./configure --prefix=/apps/openresty \
 --user=nginx --group=nginx \
 --with-http_ssl_module --with-http_v2_module \
 --with-http_realip_module --with-http_stub_status_module
# 编译并安装
make && make install
# 配置环境变量
ln -s /apps/openresty/bin/* /usr/bin/
# 启动服务
openresty

Tengine

由淘宝网发起的 Nginx 二次开发版本,基于 Nginx 添加了大量高级功能(如动态模块、请求过滤、性能监控),专门针对大访问量网站优化,稳定性和性能经过淘宝、天猫等生产环境验证,开源免费。

官网:http://tengine.taobao.org/

目录

  1. 一、Web 服务基础介绍
  2. Apache 经典 Web 服务端
  3. Nginx 高性能 Web 服务端
  4. 基础信息
  5. 核心优势与功能
  6. 典型工作场景
  7. 服务端 I/O 流程
  8. 核心概念
  9. 通用 I/O 阶段
  10. I/O 模型
  11. 核心概念
  12. 5 种网络 I/O 模型详解
  13. select/poll/epoll 对比
  14. 零拷贝
  15. 传统 Linux I/O 问题
  16. 零拷贝核心思想
  17. 核心零拷贝技术
  18. 二、Nginx 架构和安装
  19. Nginx 概述
  20. Nginx 核心功能
  21. Nginx 进程架构
  22. 进程结构与功能
  23. 进程间通信
  24. Nginx 启动与 HTTP 连接建立
  25. Nginx 模块体系
  26. Nginx 安装
  27. 编译安装准备
  28. 编译安装步骤
  29. 安装依赖
  30. 解压源码
  31. 配置编译参数(自定义路径、功能)
  32. 编译并安装
  33. 核心目录说明
  34. Nginx 常用命令
  35. 系统服务配置(systemd)
  36. Nginx 平滑升级和回滚
  37. 平滑升级流程
  38. 回滚流程
  39. 三、Nginx 核心配置详解
  40. 配置文件基础规则
  41. 全局配置段(main)
  42. 核心配置指令
  43. 事件驱动配置段(event)
  44. 核心配置指令
  45. 高并发配置要点
  46. HTTP 配置段(http)
  47. 核心基础配置指令
  48. 虚拟主机配置段(server)
  49. 核心配置指令
  50. 路径匹配配置段(location)
  51. location 匹配语法与优先级
  52. root 与 alias(路径映射)
  53. 核心配置实战案例
  54. 多虚拟主机配置
  55. 创建子配置目录
  56. 主配置文件引入子配置
  57. 创建站点配置文件
  58. 自定义错误页面
  59. 文件存在检测(try_files)
  60. 下载服务器配置(autoindex)
  61. 账户认证(auth_basic)
  62. 安装 htpasswd,生成密码文件
  63. 四、Nginx 高级配置
  64. Nginx 状态页(stub_status)
  65. 配置示例
  66. 状态页核心指标
  67. Nginx 压缩功能(gzip)
  68. 核心配置指令
  69. 验证压缩
  70. Nginx 版本隐藏
  71. Nginx 变量使用
  72. 常用内置变量
  73. 自定义变量
  74. Nginx Rewrite 功能
  75. 核心指令
  76. Rewrite Flag(标志位)
  77. Rewrite 实战案例
  78. Nginx 防盗链
  79. Referer 有效值
  80. 防盗链配置示例
  81. 五、Nginx 反向代理功能
  82. 核心概念
  83. 七层反向代理(HTTP/HTTPS)
  84. 核心代理指令
  85. 关键配置:proxy_pass 末尾/的影响
  86. 客户端真实 IP 透传
  87. 反向代理缓存
  88. 核心缓存指令
  89. 七层负载均衡(http_upstream)
  90. upstream 核心配置
  91. 后端服务器参数
  92. 调度算法
  93. 四层反向代理(TCP/UDP)
  94. TCP 负载均衡(以 MySQL 为例)
  95. 四层配置段,与 http 同级
  96. UDP 负载均衡(以 DNS 为例)
  97. 六、Nginx 与 FastCGI 集成(LNMP 架构)
  98. 核心概念
  99. 核心配置指令(ngxhttpfastcgi_module)
  100. LNMP 架构实战配置
  101. PHP-FPM 配置
  102. Nginx 配置
  103. 测试 PHP 解析
  104. PHP 性能优化:缓存模块
  105. 七、Nginx 二次开发版本
  106. OpenResty
  107. 基础介绍
  108. 编译安装 OpenResty
  109. 安装依赖
  110. 创建运行用户
  111. 下载源码并解压
  112. 配置编译参数
  113. 编译并安装
  114. 配置环境变量
  115. 启动服务
  116. Tengine

更多推荐文章

查看全部
  • Python AI 三剑客:文档总结、代码生成与资料检索
  • CentOS 系统下 Python 环境安装与生产部署实战
  • 基于 SpringBoot+Vue 的酒店客房管理系统设计与实现
  • 基于 FPGA 与 W5500 的 SPI 以太网通信实现
  • VR + 具身智能 + 人形机器人:通往现实世界的智能接口
  • Java 中使用 OkHttp3 的网络请求教程与实战
  • Claude Skills 技能机制详解与实战指南
  • MAVROS 安装与基础知识梳理及 ROS C++ 仿真案例
  • Ambari Web 3.0.0 本地启动与二次开发环境搭建
  • 淘宝常用 CSS 样式初始化代码
  • DIY Layout Creator 跨平台开源电路设计工具指南
  • C++11 深度解析:重塑现代 C++ 的关键特性
  • 双指针算法初阶详解:移动零与复写零
  • 贪心算法详解:核心思想与活动选择问题实战
  • 贪心算法核心思想与 LeetCode 经典例题解析
  • 贪心算法实战:摆动序列与股票买卖详解
  • C++ 继承入门:从基础概念到默认成员函数
  • AI 驱动的图表生成器 Next-AI-Draw.io
  • 基于FPGA的微波炉控制器设计
  • OpenCode 开源 AI 编程助手完全使用指南

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online