文章目录
-
- [1 Nginx设计理念](#1 Nginx设计理念)
- [2 Nginx架构与进程](#2 Nginx架构与进程)
-
- [2.1 架构](#2.1 架构)
- [2.2 进程](#2.2 进程)
- [3 Nginx高性能的三大支柱](#3 Nginx高性能的三大支柱)
- [4 Nginx功能介绍](#4 Nginx功能介绍)
- [5 Nginx基本特性](#5 Nginx基本特性)
- [==6 Nginx扮演的角色及特性==](#==6 Nginx扮演的角色及特性==)
- [7 Nginx模块介绍](#7 Nginx模块介绍)
-
- [7.1 核心模块](#7.1 核心模块)
- [7.2 标准HTTP模块](#7.2 标准HTTP模块)
- [7.3 可选HTTP模块](#7.3 可选HTTP模块)
- [7.4 邮件服务模块](#7.4 邮件服务模块)
- [7.5 Stream服务模块](#7.5 Stream服务模块)
- [7.6 第三方模块](#7.6 第三方模块)
- [8 Nginx vs Apache 对比](#8 Nginx vs Apache 对比)
- [9 Nginx配置](#9 Nginx配置)
-
- [9.1 配置文件组成](#9.1 配置文件组成)
- [9.2 主配置文件结构](#9.2 主配置文件结构)
- [9.3 root与alias](#9.3 root与alias)
- [==9.4 location的匹配==](#==9.4 location的匹配==)
- [10 实践](#10 实践)
"Apache能干的Nginx能干,Nginx能干的Apache不一定能干"
Nginx是一个高性能的Web服务器/反向代理服务器,擅长处理高并发连接。
1 Nginx设计理念
核心思想:简单即高效
| 设计原则 | 说明 |
|---|---|
| 模块化 | 功能像积木一样,按需组合 |
| 事件驱动 | 来一个请求处理一个,不傻等 |
| 异步非阻塞 | 不卡壳,一个工人同时干多件事 |
| 内存省着用 | 省内存才能扛住更多用户 |
类比:Apache像"一个客人配一个服务员",Nginx像"一个服务员同时服务所有客人"
2 Nginx架构与进程
2.1 架构

架构特点:
- Master-Worker模式:1个老板 + N个员工
- 无共享锁:员工之间不抢资源,各干各的
- epoll机制(Linux):高效处理海量连接
2.2 进程
| 进程类型 | 数量 | 职责 |
|---|---|---|
| Master | 1个 | 读取配置、启动worker、平滑重启、热升级 |
| Worker | 多个 | 处理HTTP请求、代理、读写文件 |
Worker数建议 = CPU核心数,可通过
worker_processes auto自动设置
3 Nginx高性能的三大支柱
| 支柱 | 技术实现 | 解决的问题 | 性能收益 |
|---|---|---|---|
| IO多路复用 | epoll(Linux)、kqueue(BSD)、eventport(Solaris) | C10K并发问题 | 单线程管理10万+连接 |
| 零拷贝 | sendfile + DMA gather | 文件传输CPU占用高 | 10Gbps传输CPU<10% |
| 内存优化 | 内存池、连接池、 slab分配器 | 内存碎片、频繁malloc | 减少50%+内存占用 |
对比Apache的阻塞模型:
- Apache:每个连接 ==> 一个线程/进程(人多了卡死)
- Nginx:所有连接 ==> 一个进程轮询处理(人多也流畅)
4 Nginx功能介绍
四大核心功能:
| 功能 | 用途 | 场景 |
|---|---|---|
| Web服务器 | 托管静态网站 | 图片、CSS、JS、HTML |
| 反向代理 | 隐藏真实服务器,统一入口 | 负载均衡到多台后端 |
| 负载均衡 | 请求分发到多台机器 | 高并发网站、微服务 |
| 缓存加速 | 热点数据存内存 | 减少后端压力 |
5 Nginx基本特性
核心特性一览:
- 模块化设计,较好的扩展性
- 高并发:单机轻松10万+连接(C10K问题终结者)
- 低内存:1万个连接只占用2.5MB内存
- 热部署:不停机升级、重载配置
- 高可靠:Worker进程崩溃,Master自动重启
- 跨平台:Linux/Windows/macOS都支持
- 开源免费:BSD许可证,商用无忧
6 Nginx扮演的角色及特性
Web服务器
| 功能分类 | 具体功能 | 一句话说明 | 实际用途 |
|---|---|---|---|
| 基础服务 | 虚拟主机 | 一台机器托管多个网站 | 多域名共用服务器,省成本 |
| 静态资源服务 | 直接返回图片/CSS/JS/HTML | 前端网站、下载站、图片站 | |
| 目录索引 | 自动生成文件列表 | 文件服务器、FTP替代方案 | |
| 路径别名(Alias) | 隐藏真实文件路径 | 保护目录结构,简化URL | |
| 连接优化 | Keep-Alive | 一个连接传多个请求 | 省TCP握手时间,提速 |
| 管道连接 | 连续发请求不等回复 | 提升浏览器并发效率 | |
| HTTP/2支持 | 多路复用,更快 | 现代网站加速 | |
| 日志管理 | 访问日志 | 记录谁访问了什么 | 流量分析、问题排查 |
| 日志缓冲 | 批量写磁盘,提性能 | 高并发下减少磁盘IO | |
| 条件日志 | 特定请求不记录 | 静态资源日志过滤,省磁盘 | |
| 内容处理 | URL重写(Rewrite) | 改地址栏URL | 伪静态、跳转、SEO优化 |
| Gzip压缩 | 传输压缩省带宽 | 文本资源压缩70%+ | |
| 浏览器缓存 | 控制客户端缓存 | 减少重复请求,提速 | |
| 访问控制 | IP黑白名单 | 限制特定IP访问 | 封禁恶意IP,内部系统保护 |
| 用户认证 | 弹窗输入账号密码 | 后台管理页面保护 | |
| 防盗链 | 阻止其他网站引用资源 | 防止图片/视频被盗用 | |
| 流控保护 | 速率限制 | 限制下载速度 | 防带宽占满、防恶意下载 |
| 并发限制 | 限制单IP连接数 | 防爬虫、防CC攻击 | |
| 请求限流 | 限制单IP请求频率 | 防接口被刷、防暴力破解 | |
| 运维特性 | 热配置重载 | 不停机刷新配置 | 线上配置更新无感知 |
| 热升级 | 不停机升级版本 | Nginx版本更新不中断服务 | |
| 日志切割 | 重新打开日志文件 | 日志按天归档,配合crontab |
反向代理
| 功能分类 | 具体功能 | 一句话说明 | 实际用途 |
|---|---|---|---|
| 基础代理 | 隐藏后端IP | 用户不知道真实服务器 | 保护后端服务器安全 |
| 请求头传递 | 告诉后端真实信息 | 后端获取用户真实IP、协议 | |
| 协议转换 | HTTP/HTTPS/WebSocket | 支持多种协议转发 | |
| 安全增强 | SSL终端 | Nginx处理HTTPS解密 | 后端专注业务,不用管证书 |
| 访问控制 | 代理层统一鉴权 | 统一入口做权限校验 | |
| 超时控制 | 连接超时 | 防止后端卡死 | 快速失败,释放资源 |
| 读取超时 | 防止响应慢拖垮 | 避免长时间等待 | |
| 发送超时 | 防止客户端慢 | 清理慢连接 | |
| 容错处理 | 错误页拦截 | 后端错误显示友好页面 | 提升用户体验 |
| 错误重试 | 失败自动换一台 | 单点故障自动恢复 | |
| 健康检查 | 自动剔除故障机器 | 保证服务高可用 | |
| 高级代理 | WebSocket代理 | 支持实时通信 | 在线聊天、股票行情 |
| gRPC代理 | 支持微服务RPC | 云原生微服务架构 | |
| TCP/UDP代理 | 四层代理非HTTP | 数据库、游戏服务器代理 |
负载均衡
| 功能分类 | 具体功能 | 一句话说明 | 实际用途 |
|---|---|---|---|
| 调度算法 | 轮询(Round Robin) | 一人一次,平均分配 | 机器配置相同场景 |
| 加权轮询(Weight) | 高配机器多干活 | 机器配置不同,按能力分配 | |
| IP哈希(IP Hash) | 同IP固定到同一台 | 需要保持登录会话 | |
| 最少连接(Least Conn) | 谁空闲给谁 | 请求处理时长不一 | |
| 一致性哈希 | 带缓存场景用 | 缓存命中率优化 | |
| 后端管理 | 备份节点(Backup) | 平时standby,故障才上 | 灾备切换,高可用 |
| 下线节点(Down) | 临时标记不可用 | 维护时手动摘除 | |
| 长连接池 | 复用后端连接 | 减少后端连接压力 | |
| 会话保持 | Sticky Cookie | Cookie绑定后端 | 会话保持,登录状态不丢 |
| Sticky Route | 路由绑定后端 | 特定用户固定到特定机器 |
缓存服务器
| 功能分类 | 具体功能 | 一句话说明 | 实际用途 |
|---|---|---|---|
| 静态缓存 | 内存缓存 | 热点文件放内存 | 毫秒级响应静态资源 |
| 磁盘缓存 | 大文件缓存到磁盘 | 视频、安装包等大文件 | |
| 缓存失效 | 按时间自动清理 | 控制缓存新鲜度 | |
| 代理缓存 | 缓存路径配置 | 定义缓存存储位置 | 规划磁盘空间使用 |
| 缓存Zone定义 | 开辟内存存储缓存键 | 内存中快速查找缓存 | |
| 缓存有效期 | 不同状态码不同时间 | 200缓存10分钟,404缓存1分钟 | |
| 缓存绕过 | 特定请求不缓存 | 登录用户、实时数据不缓存 | |
| 缓存锁 | 防止缓存失效并发穿透 | 防雪崩,保护后端 | |
| 缓存刷新 | 主动清理特定URL | 内容更新后手动刷新 | |
| 缓存策略 | 缓存Key定义 | 自定义缓存标识 | 区分不同版本、不同参数 |
| vary支持 | 根据Header缓存多版本 | 移动端/PC端分开缓存 |
API网关
| 功能分类 | 具体功能 | 一句话说明 | 实际用途 |
|---|---|---|---|
| 路由管理 | 路径路由 | 不同路径到不同服务 | /users/→用户服务,/orders/→订单服务 |
| 域名路由 | 不同域名到不同服务 | api.a.com和api.b.com分开 | |
| 版本路由 | /v1/和/v2/分开 | API版本兼容,平滑升级 | |
| 认证鉴权 | Basic认证 | 基础用户名密码 | 内部系统快速保护 |
| JWT验证 | Token鉴权 | 现代前后端分离认证 | |
| 子请求鉴权 | 转发到鉴权服务 | 统一认证中心,复用已有系统 | |
| API Key | 密钥访问控制 | 开放API的调用管控 | |
| 流量控制 | 限流(Leaky Bucket) | 匀速处理请求 | 突发流量削峰填谷 |
| 限并发 | 限制同时处理数 | 保护系统资源不被耗尽 | |
| 黑白名单 | 特定IP拒绝/允许 | 封禁恶意调用方 | |
| 灰度发布 | 按IP灰度 | 特定IP走新版本 | 内部测试、白名单体验 |
| 按权重灰度 | 5%流量到新版本 | 小流量验证新版本稳定性 | |
| Cookie灰度 | 带特定Cookie走新版 | 用户自主选择版本 | |
| 请求处理 | 请求改写 | 改路径/参数/Header | 适配后端接口格式 |
| 响应改写 | 改返回内容/Header | 数据脱敏、格式统一 | |
| 请求体限制 | 限制上传大小 | 防止大文件攻击 | |
| 超时控制 | API专用超时 | 快速失败,提升体验 | |
| 可观测性 | 统一日志 | 记录所有API调用 | 审计、分析、计费 |
| 请求ID | 全链路追踪 | 分布式系统问题定位 | |
| 指标暴露 | Prometheus监控 | 实时监控网关状态 | |
| 容错保护 | 熔断降级 | 后端故障快速失败 | 防止故障扩散 |
| 超时熔断 | 超时就放弃 | 避免长时间等待拖垮系统 |
7 Nginx模块介绍
模块 = 功能插件,按需加载,相当于游戏加model、系统填补丁。

| 模块类型 | 核心功能 | 具体功能举例 | 是否必须 |
|---|---|---|---|
| 核心模块 | 服务器运行基础 | 错误日志、配置解析、事件驱动、进程管理 | 必须 |
| 标准HTTP模块 | HTTP协议基础功能 | 端口配置、编码设置、响应头、静态文件 | 默认开启 |
| 可选HTTP模块 | 扩展HTTP特殊功能 | SSL、Gzip、GeoIP、Flash流媒体 | 需手动开启 |
| 邮件服务模块 | 邮件代理服务 | POP3、IMAP、SMTP协议支持 | 邮件场景用 |
| Stream服务模块 | 四层代理转发 | TCP/UDP协议代理 | 非HTTP场景用 |
| 第三方模块 | 自定义扩展功能 | Lua、JSON、WAF等 | 需编译安装 |
7.1 核心模块
| 具体模块 | 功能说明 | 实际用途 |
|---|---|---|
ngx_core_module |
配置解析、日志系统、进程管理 | Nginx启动运行的基础 |
ngx_errlog_module |
错误日志记录 | 排查问题、记录异常 |
ngx_events_module |
事件驱动机制(epoll/kqueue) | 高并发连接处理核心 |
ngx_regex_module |
正则表达式支持 | URL匹配、重写规则 |
ngx_thread_pool_module |
线程池管理 | 异步文件IO |
核心模块是Nginx的"心脏",没有这些服务器无法运行
7.2 标准HTTP模块
| 具体模块 | 功能说明 | 实际用途 |
|---|---|---|
ngx_http_core_module |
HTTP核心(端口、server、location) | 虚拟主机配置基础 |
ngx_http_static_module |
静态文件服务 | 托管图片、CSS、JS |
ngx_http_index_module |
默认首页索引 | 自动找index.html |
ngx_http_log_module |
访问日志记录 | 分析流量来源 |
ngx_http_rewrite_module |
URL重写 | 伪静态、跳转、SEO |
ngx_http_proxy_module |
反向代理 | 负载均衡、隐藏后端 |
ngx_http_headers_module |
响应头设置 | 跨域、缓存控制 |
ngx_http_charset_module |
网页编码设置 | UTF-8/GBK等 |
标准模块编译时默认包含,无需额外操作
7.3 可选HTTP模块
| 具体模块 | 功能说明 | 实际用途 |
|---|---|---|
ngx_http_ssl_module |
HTTPS/SSL协议支持 | 网站加密、证书配置 |
ngx_http_gzip_module |
Gzip压缩传输 | 省带宽、提速 |
ngx_http_geoip_module |
GeoIP地理位置解析 | 按地区分流、限制 |
ngx_http_flv_module |
Flash视频流媒体 | 渐进式下载播放 |
ngx_http_mp4_module |
MP4视频流媒体 | 视频拖拽播放 |
ngx_http_secure_link_module |
防盗链安全链接 | 链接加密、时间限制 |
ngx_http_stub_status_module |
服务器状态监控 | 查看连接数、请求数 |
ngx_http_realip_module |
获取真实客户端IP | 经过代理后识别用户IP |
可选模块需在编译时添加
--with-http_xxx_module开启
7.4 邮件服务模块
| 具体模块 | 功能说明 | 实际用途 |
|---|---|---|
ngx_mail_core_module |
邮件代理核心 | 邮件服务基础 |
ngx_mail_pop3_module |
POP3协议支持 | 邮件接收 |
ngx_mail_imap_module |
IMAP协议支持 | 邮件同步 |
ngx_mail_smtp_module |
SMTP协议支持 | 邮件发送 |
ngx_mail_ssl_module |
邮件SSL加密 | 安全邮件传输 |
Nginx可作为邮件代理服务器,替代传统邮件网关
7.5 Stream服务模块
| 具体模块 | 功能说明 | 实际用途 |
|---|---|---|
ngx_stream_core_module |
TCP/UDP代理核心 | 四层转发基础 |
ngx_stream_proxy_module |
TCP/UDP代理 | MySQL、Redis代理 |
ngx_stream_ssl_module |
TCP SSL加密 | 数据库连接加密 |
ngx_stream_realip_module |
获取真实客户端IP | TCP连接识别来源 |
ngx_stream_limit_conn_module |
TCP连接限制 | 防止连接数过多 |
Stream模块让Nginx从七层代理扩展到四层,支持任意TCP/UDP协议
7.6 第三方模块
| 模块名称 | 功能说明 | 安装方式 |
|---|---|---|
ngx_lua_module |
Lua脚本扩展(OpenResty核心) | 编译添加 |
ngx_http_json_module |
JSON格式支持 | 编译添加 |
nginx-module-vts |
流量监控面板 | 编译添加 |
ngx_pagespeed |
自动网页优化 | 编译添加 |
ngx_http_waf_module |
Web应用防火墙 | 编译添加 |
ngx_http_echo_module |
调试输出 | 编译添加 |
ngx_http_upstream_check_module |
后端健康检查 | 编译添加 |
第三方模块需手动下载源码,重新编译Nginx
8 Nginx vs Apache 对比
核心差异
| Nginx | Apache | |
|---|---|---|
| 设计哲学 | 快、省、异步 | 全、稳、进程 |
| 擅长场景 | 高并发、静态资源、反向代理 | 动态内容、.htaccess、模块丰富 |
| 资源占用 | 内存省(万连接≈2MB) | 内存高(一个连接一个进程) |
| 配置方式 | 中央集权(nginx.conf) | 分布式(.htaccess随处放) |
功能对比表
| 对比项 | Nginx | Apache |
|---|---|---|
| 静态文件速度 | 极快(直接sendfile) | 快 |
| 动态内容(PHP等) | 需转发给后端(FPM) | 内置mod_php,开箱即用 |
| 并发处理能力 | 10万+无压力 | 几千就吃力 |
| 内存占用 | 极低 | 较高 |
| 配置灵活性 | 改配置需重载 | .htaccess实时生效 |
| 模块生态 | 精而少 | 多而全 |
| Windows性能 | 一般 | 较好 |
| 热部署/平滑升级 | 原生支持 | 较复杂 |
选择推荐
| 场景 | 推荐 | 理由 |
|---|---|---|
| 纯静态资源服务(图片、视频、CSS/JS) | Nginx | 零拷贝极致性能 |
| 反向代理/负载均衡 | Nginx | 专为代理设计,配置简洁 |
| 高并发API网关 | Nginx/OpenResty | Lua脚本扩展,性能无敌 |
| 复杂动态内容(.htaccess重写) | Apache | 模块丰富,配置灵活 |
| 共享主机环境(多用户.htaccess) | Apache | .htaccess支持更好 |
| 遗留系统兼容 | Apache | 模块生态20年积累 |
| 需要动态模块加载 | Apache | 动态加载so模块 |
| Windows服务器 | Apache | Nginx Windows支持较弱 |
最佳实践:Nginx + Apache 组合
- Nginx放前面:挡子弹(静态资源、SSL、负载均衡)
- Apache放后面:处理动态PHP等
- 各取所长,1+1>2
9 Nginx配置
9.1 配置文件组成
Nginx的配置文件的组成部分:
- 主配置文件:nginx.conf
- 子配置文件: include conf.d/*.conf
- fastcgi, uwsgi,scgi 等协议相关的配置文件。
- mime.types:支持的mime类型,MIME(Multipurpose Internet Mail Extensions)多用途互联网邮。
- 件扩展类型,MIME消息能包含文本、图像、音频、视频以及其他应用程序专用的数据,是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
9.2 主配置文件结构
bash
main block:主配置段,即全局配置段,对http,mail都有效
# 事件驱动相关的配置
event {
...
}
# http/https 协议相关配置段
默认的nginx.conf 配置文件格式说明
http {
...
}
# 默认配置文件不包括下面两个块
# mail 协议相关配置段
mail {
...
}
# stream 服务器相关配置段
stream {
...
}
9.3 root与alias
root:指定web的家目录,在定义location的时候,文件的绝对路径等于 root+location
bash
server {
location /dirtest { #必须建立/mnt/dirtest才能访问
root /mnt;
}
}
alias:定义路径别名,会把访问的路径重新定义到其指定的路径,文档映射的另一种机制,仅能用于
location上下文
bash
server {
location /alias {# 使用alias的时候uri后面如果加了斜杠,则下面的路径配置必须加斜杠,否则403
alias /mnt/dirtest; #当访问alias的时候,会显示alias定义的/mnt/dirtest里面的内容
}
}
location中使用root指令和alias指令的意义不同:
- root:给定的路径对应于location中的/uri左侧的/
- alias:给定的路径对应于location中的/uri的完整路径
9.4 location的匹配
- 在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射。
- ngnix会根据用户请求的URI来检查定义的所有location,按一定的优先级找出一个最佳匹配
- 而后应用其配置在没有使用正则表达式的时候,nginx会先在server中的多个location选取匹配度最高的一个uri
- uri是用户请求的字符串,即域名后面的web文件路径
- 然后使用该location模块中的正则url和字符串,如果匹配成功就结束搜索,并使用此location处理此请求。
bash
#语法规则:
location [ = | ~ | ~* | ^~ ] uri { ... }
= # 用于标准uri前,需要请求字串与uri精确匹配,大小敏感,如果匹配成功就停止向下匹配并立即处理请求
^~ # 用于标准uri前,表示包含正则表达式,并且匹配以指定的正则表达式开头
# 对uri的最左边部分做匹配检查,不区分字符大小写
~ # 用于标准uri前,表示包含正则表达式,并且区分大小写
~* # 用于标准uri前,表示包含正则表达式,并且不区分大写
/ # 匹配起始于此uri的所有的uri
\ # 用于标准uri前,表示包含正则表达式并且转义字符。可以将 . * ?等转义为普通符号
# 匹配优先级从高到低:
=, ^~, ~/~*, /
#匹配优先级:=, ^~, ~/~*,/
location优先级:(location = 文件) > (location ^~ 路径) > (location ~,~* 正则顺序) >
(location 完整路径) > (location 部分起始路径) >