Nginx 是一款轻量级的开源 Web 服务及代理程序。在它出现之前,市场上主流的两款 Web 服务分别是 Windows 系统上的 IIS 与 Linux 系统上的 Apache;而 Nginx 诞生后,凭借轻量化、支持高并发等特性,逐渐蚕食了这两款产品的市场份额,目前国内大量企业已广泛使用。本文聚焦 Nginx 的性能优化专项,涵盖两大区块:
学习前提:熟悉 Linux 基础操作,了解 Nginx 安装与基础配置,并对 HTTP 请求过程有一定认识。
说明:Nginx 的基础增量配置不属于本文重点,若需基础配置指引见「⑥ 进阶扩展与参考」。
性能优化的本质是减少两类损耗:CPU 调度损耗(worker 线程在多核间频繁切换)与数据传输损耗(数据在内核态与用户态之间反复拷贝)。围绕这两点展开各项配置。
| 优化项 | 关键配置 | 作用 |
|---|---|---|
| CPU 亲和性 | worker_cpu_affinity auto | 让每个 worker 线程固定到具体 CPU 核心,降低频繁调度损耗 |
| IO 流事件模型 | use epoll | 采用异步非阻塞事件驱动模型,应对大规模连接 |
| 零拷贝 | sendfile on | 静态文件直接在内核态完成转发,避免绕道用户态 |
| 文件压缩 | gzip 系列配置 | 减小发送数据量,降低延迟、提升体验 |
一个网站做了缓存优化,性能提升通常可达数倍。
文字说明:Nginx 运行时启用 1 个 master 主进程及多个 worker 工作进程,worker 负责处理请求。若 worker 在多核 CPU 上频繁被调度会损耗性能;配置 worker_cpu_affinity auto 后,Nginx 自动识别核心数,将 worker 线程一对一绑定到具体 CPU 核心(如 8 核对 8 个 worker),从而降低 CPU 损耗。
文字说明:未开启时,Nginx 处理请求会把文件读入内核态 Buffer Cache,再传到用户态缓冲,最后又传回内核态经 Socket 转发,绕了一大圈。对于无需用户态处理的静态文件,开启 sendfile on 后可直接沿内核态路径转发,显著提高效率。
# 推荐使用 auto,Nginx 自动识别 CPU 核心数并按推荐策略绑定 worker 线程
worker_processes 8; # 与 CPU 核心数对应
worker_cpu_affinity auto;events {
use epoll; # 使用 epoll 事件驱动模型
worker_connections 1024; # Nginx 默认 512,高并发场景建议按峰值调大
}epoll 相比早期 select 模型的优势(select 模型在 kernel 2.6 之前使用):
epoll_wait 只返回就绪的文件描述符(file descriptor, fd),避免 select 每次调用都要在内核与用户态之间全量拷贝与扫描 fd 集合;http {
sendfile on; # 开启内核对静态文件的内核态零拷贝转发
}gzip on; # 开启压缩功能
gzip_buffer 16 8k; # 压缩时使用的内容内存空间
gzip_comp_level 6; # 压缩等级,推荐 6(过高影响性能、过低无效果)
gzip_http_version 1.1; # 仅对 HTTP 1.1 压缩
gzip_min_length 256; # 小于 256 字节不压缩
gzip_proxied any; # 反向代理时依据后端返回信息决定压缩策略
gzip_vary on; # 发送 Vary: Accept-Encoding 响应头
gzip_types text/plain application/json application/vnd.ms-fontobject image/x-icon;
gzip_disable "msie6"; # 关闭 IE6 的压缩浏览器缓存(静态元素缓存到客户端,可配合 Chrome 开发者工具分析请求头/响应头与 body):
# expires 设置 Expires 与 Cache-Control 响应头,控制浏览器缓存周期
# -1 表示不缓存(Cache-Control: no-cache);max 表示最长周期缓存(10 年);也可写具体分钟/天
location ~* \.(css|js|png|jpg)$ {
expires 1d;
add_header Cache-Control "public";
}HTTPS SSL 会话缓存(减少客户端与服务的重复建连):
ssl_session_cache shared:SSL:10m; # 共享内存 10MB,用于缓存 SSL 会话
ssl_session_timeout 10m; # SessionKey 超时 10 分钟,到期重新建连打开文件缓存(缓存静态元素的元数据,如文件路径等索引信息):
open_file_cache max=1000 inactive=20s; # 最多缓存 1000 个文件;20 秒内未被访问的条目会被移出
open_file_cache_valid 30s; # 每 30 秒主动检查缓存元信息是否有更新代理缓存(反向代理后端动态数据):
proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m;
location / {
proxy_cache my_cache; # 通过 location 引用到缓存名称
...
}proxy_cache_path:本地分配缓存存储路径;levels=1:2:缓存文件的分层方式;keys_zone=my_cache:10m:开辟名为 my_cache 的共享内存区(存放缓存键与元数据);max_size:该缓存区的总大小上限,超过后按淘汰策略(近似 LRU)清理。代理缓存不限 http_proxy,Nginx 支持的代理模式(uwsgi、SCGI、FastCGI 等)均可设置;且支持动静分离与动静态缓存,能显著提升网站整体并发性能。docs/运维/04-Nginx/。