干货 | 高性能 Nginx 优化配置总结

文章目录

  • 一、前言
  • 二、配置优化
    • 2.1 并发处理架构优化
      • 2.1.1 工作进程配置
      • 2.1.2 事件驱动模型
    • 2.2 传输效率优化
      • 2.2.1 零拷贝技术
      • 2.2.2 长连接复用
    • 2.3 缓存体系构建
      • 2.3.1 文件描述符缓存
      • 2.3.2 代理缓存
      • 2.3.3 静态资源缓存
    • 2.4 协议层深度优化
      • 2.4.1 HTTP/2 支持
      • 2.4.2 TLS优化
    • 2.5 资源处理优化
      • 2.5.1 压缩与大文件支持
      • 2.5.2 大文件支持
    • 2.6 内存管理优化
      • 2.6.1 缓冲区与共享内存
  • 三、总结

一、前言

相信对于 Nginx 你一定并不陌生,它是一款轻量级的开源 Web 服务及代理程序,因其轻量化、支持高并发等特性,目前国内企业早已广泛的使用 Nginx。既然 Nginx 使用这么广泛,那么我们在性能测试工作中如何对其进行优化和配置便成了重中之重。

二、配置优化

2.1 并发处理架构优化

2.1.1 工作进程配置

现代 CPU 多核架构下,Nginx 的 worker 进程若在不同核心间频繁调度,会增加 CPU 上下文切换损耗。CPU 亲和性通过将 worker 进程固定到特定核心,避免跨核调度,提升缓存利用率。所以就需要配置 Nginx 的 CPU 亲和性来解决这个问题。

那由于 Nginx CPU 亲和性配置本身有多套配置方案,这里推荐你直接将配置项设置成 auto(worker_cpu_affinity ),即采用了 Nginx 推荐的 CPU 绑核策略方式。另外的一个方式是手动绑定,将 worker 线程数量与 CPU 核心数一一绑定方式设置。我们设置成 auto Nginx 会自动识别并按照推荐策略来分配 worker 线程和 CPU。

配置方案:

  • 自动绑定(推荐):通过 worker_cpu_affinity auto 让 Nginx 自动识别 CPU 核心并按最优策略绑定。例如 8 核 CPU 会将 8 个 worker 进程一对一绑定到 CPU0~CPU7,实现负载均衡。
  • 手动绑定:按核心数显式配置,如 worker_cpu_affinity 0001 0010 0100 1000(4 核场景)。

配置示例如下:

worker_cpu_affinity auto;     # 自动将工作进程绑定到可用的 CPU 核心
worker_processes auto;          # 基于CPU核心数动态分配工作进程,充分利用多核性能  
worker_connections 1024;       # 单进程最大并发连接数,支持高并发场景  
worker_rlimit_nofile 65535;    # 单进程文件描述符上限,突破系统资源限制  

理论并发能力:
通过多进程模型实现水平扩展,总并发量为:worker_processes × worker_connections
(例:4 核 CPU 配置下可达 4×1024=4096 并发连接)。

需结合系统级限制(如 nofile)。若未调整 sysctl,实际并发可能受限于系统默认值(通常 1024)。

# 系统级文件描述符限制
worker_rlimit_nofile 65535;  # 需在系统中同步调整(/etc/security/limits.conf)

2.1.2 事件驱动模型

Linux 系统下一切皆文件,比如打开一个设备,它便会产生一个文件描述符。在产生一个进程时,这个进程便需要一个进程描述符,这个进程描述符也是一个文件。所以在 Nginx 处理请求的时候,每一个请求都会产生处理请求的描述符。

其次,在 Nginx 处理大规模请求的时候,为了提高并发效率需要采用异步非阻塞模型,epoll 本身是以异步非阻塞模型来处理请求流中的事件流。

这里还需要注意一点,并不是所有的 Linux 操作系统都可以使用 epoll,它是在 kernel 2.6 版本以后提出的,早期内核使用的 select\poll 模型,select 模型比 epoll 模型性能要低很多。

模型对比:

  • epoll(Kernel 2.6+):异步非阻塞模型,基于事件驱动,通过 mmap 共享用户态与内核态空间,突破 select/poll 的 1024 文件描述符限制,支持百万级并发。
  • select/poll:早期模型,需轮询扫描所有文件描述符,性能随并发量下降明显。

配置示例如下:

multi_accept on;            # 一次性接受所有新连接
use epoll;      # Linux高效IO多路复用,支持C10K级别并发  

2.2 传输效率优化

2.2.1 零拷贝技术

Nginx 在处理文件时,会将文件传入操作系统内核态的 Buffer Cache,然后传递到操作系统上层的用户态,经用户态的 Buffer Cache 再传回内核态中,最后通过 Socket 将文件转发出去。

通过 sendfile on 实现内核态直接传输,避免文件在用户态与内核态间的冗余拷贝。传统流程需 4 次拷贝(内核 Buffer→用户 Buffer→内核 Buffer→Socket),零拷贝仅需 2 次内核态数据搬运,尤其适合图片、视频等静态资源。

配置示例如下:

# I/O优化 - 减少带宽消耗和提高传输效率
sendfile on;                # 开启零拷贝文件传输,减少CPU消耗和内核上下文切换
tcp_nopush on;              # 优化数据包传输,减少网络报文数量,配合sendfile使用
tcp_nodelay on;             # 禁用Nagle算法,降低小数据包传输延迟

2.2.2 长连接复用

配置示例如下:

# 连接优化 - 减少TCP连接建立的开销
keepalive_timeout 65;       # 保持客户端连接超时时间(秒),减少重复的TCP握手
keepalive_requests 100;     # 在一个keepalive连接上可处理的最大请求数

2.3 缓存体系构建

用到缓存优化主要期望提高网站服务访问效率,减少服务端的性能使用。这里缓存配置优化大致可以分为几个部分,分别是文件描述符缓存、代理缓存优化、静态资源缓存优化等。

2.3.1 文件描述符缓存

打开文件缓存设置在 Nginx 端,通常而言我们会把一些静态元素(如:JPG、CSS、GS)在代理端通过这种方式进行设置,这里 Nginx 缓存的是静态元素的元数据。元数据的作用就是缓存打开用户所请求的静态元素的文件路径等信息,那么如果在本地频繁地查找之前请求过的静态元素文件而没有缓存元数据时效率比较低,而如果我们把一部分索引数据缓存到 Nginx 的 Cache 下,这种频繁访问就可以很大地提高访问效率。

配置示例如下:

# 缓存优化 - 减少重复读取文件的开销
open_file_cache max=10000 inactive=20s;  # 缓存最多10000个文件描述符,20秒不使用则关闭
open_file_cache_valid 30s;               # 每30秒检查一次缓存中的文件描述符是否仍然有效
open_file_cache_min_uses 2;              # 文件被访问至少2次后才会被缓存,降低低频访问文件的缓存
open_file_cache_errors on;               # 同时缓存文件错误信息,避免重复访问不存在的文件

2.3.2 代理缓存

反向代理场景下缓存后端服务响应,支持 UWSGI、FastCGI 等协议。首先通过 Nginx 作代理,可以支持实现动静态的分离,静态元素直接交给 Nginx 来处理,再把后端动态数据适当作缓存。通常做这种代理+缓存的架构,是能有效的提高整体网站的访问并发性能。

配置示例如下:

# 代理缓存 - 减少对后端服务的请求
proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60mlocation / {proxy_cache my_cache;}

参数说明:

  • proxy_cache_path 表示在本地分配哪个路径来存储并缓存后台返回数据;
  • cache levels 表示存放文件的分层方式;
  • my_cache:10m max_size=10g 分别表示是开辟一个名为my_cache共享块(用于统计访问次数)及缓存的单个文件的最大大小等。

这些都是做对应的缓存在本地的文件目录相关属性的一些设置。另外一块的设置表示在proxy_cache 的时候,通过 location 引用到 cache 的名称。

2.3.3 静态资源缓存

通常可以把静态元素,比如用户请求的图片、CSS 、JS 等元素缓存到客户端。这种缓存可以通过 Nginx配置中的 expires 配置项进行设置,expires 后面可以加具体的时间,也可以加对应的特定意义的数值,比如 -1 表示不缓存资源,max 设置最大周期缓存(默认缓存周期为 10 年),需要做具体的时间的设置可以写入具体的时间周期,比如一个小时或是一天。

配置示例如下:

# 静态资源缓存配置
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {  # 匹配静态资源文件扩展名expires 30d;                        # 客户端缓存30天add_header Cache-Control "public";  # 允许所有缓存服务器缓存access_log off;                     # 减少日志噪音
}

在缓存整体使用中,虽缓存越多、越靠前、命中率越高越好,但需综合考量并注意实际问题:

  • 一是文件更新策略问题,配置文件后端缓存策略时,要考虑缓存删除与更新策略,确保后端数据更新能被前端用户及时感知;
  • 二是缓存命中率失败给后端造成的瞬间压力,前端缓存失效等情况会给后端带来瞬间压力,网站设计时需考虑如何避免缓存失效及缓存失效时保证后端服务高可用;
  • 三是多节点缓存一致性,做缓存设置时,当前端多节点保存相同内容,需考虑如何保证数据一致性,涉及缓存架构设计及前端缓存节点更新策略。

2.4 协议层深度优化

2.4.1 HTTP/2 支持

HTTP/2 作用与优势:

  • 多路复用 (Multiplexing):允许在单个 TCP 连接上并行传输多个请求/响应,彻底解决 HTTP/1.x 的队头阻塞问题,降低延迟并提升页面加载速度。
  • 头部压缩 (HPACK);使用二进制格式和静态字典压缩 HTTP 头部,减少冗余数据传输(典型场景可节省 50% 的头部大小)。
  • 服务器推送 (Server Push):可主动向客户端推送关键资源(如 CSS/JS),无需等待 HTML 解析,优化首次渲染时间。
  • 流量优先级控制:允许标记资源优先级(如优先加载首屏内容),提升用户体验。
http2 on;                # 启用HTTP/2多路复用  

注意:

HTTP/2 必须基于 HTTPS,需先配置 SSL 证书。主流浏览器(Chrome/Firefox/Edge)均支持,但旧客户端(如
IE11)自动回退到 HTTP/1.x。

2.4.2 TLS优化

建议禁用不安全协议:TLSv1.0 和 TLSv1.1 存在已知漏洞(如 POODLE、BEAST),必须禁用。
另外,TLSv1.3 优势:更少握手次数(1-RTT 或 0-RTT),降低延迟。支持现代加密算法(如 ChaCha20-Poly1305),安全性更高。AES-GCM:硬件加速支持好,适合现代 CPU。

ssl_protocols TLSv1.2 TLSv1.3;        # 仅允许安全协议版本  
ssl_ciphers "ECDHE-RSA-AES128-GCM-SHA256";  # 高效加密套件  
ssl_session_cache shared:SSL:10m;     # 10MB共享内存缓存SSL会话  
ssl_session_timeout 10m;              # 会话超时时间  

2.5 资源处理优化

Nginx 基础配置优化的最后一项是文件压缩,我们希望做到 Nginx 服务端往客户端发送的数据越小,占用的延迟越低用户体验便会越好。所以往往在代理或 Nginx 中会设置文件压缩,我们通过 gzip 压缩文本类资源(HTML/CSS/JS),降低带宽占用。典型配置如下:

2.5.1 压缩与大文件支持

 # Gzip压缩配置 - 显著减少传输数据量,节省带宽gzip on;                    # 启用gzip压缩,可减少传输数据量40%-70%gzip_comp_level 6;          # 压缩级别(1-9),一般来说推荐你设置成 6 就比较合适gzip_min_length 256;        # 最小压缩文件大小(字节),小于此值的文件不压缩gzip_proxied any;           # 对所有代理请求进行压缩,包括反向代理的响应gzip_vary on;               # 添加Vary: Accept-Encoding响应头,正确处理缓存gzip_http_version 1.1;      # 使用HTTP 1.1版本,支持gzip压缩gzip_types text/plain              # 压缩纯文本text/css                # 压缩CSStext/xml                # 压缩XMLtext/javascript         # 压缩JSapplication/javascript  # 压缩JSapplication/json        # 压缩JSONapplication/xml         # 压缩XMLapplication/xml+rss     # 压缩RSSimage/svg+xml           # 压缩SVG图片font/eot               # 压缩EOT字体font/otf               # 压缩OTF字体font/ttf               # 压缩TTF字体application/octet-stream;  # 压缩二进制文件流gzip_disable "MSIE [1-6]\."; # 对IE6及以下浏览器禁用gzip,避免兼容性问题gzip_static on;             # 优先使用预压缩.gz文件,减少CPU使用率

2.5.2 大文件支持

若业务需要用户上传大文件(如视频、高清图片),若 API 接口接收 JSON/POST 数据(如大数据分析场景),需根据需求调整限制。

client_max_body_size 500M;            # 允许上传500MB文件  

2.6 内存管理优化

2.6.1 缓冲区与共享内存

HTTPS 建连需多次加密协商,通过ssl_session_cache缓存会话密钥(SessionKey),减少重复握手。

gzip_buffers 16 8k;                   # 128KB压缩缓冲区  
proxy_buffering off;                  # 关闭代理缓冲,实时传输  
ssl_session_cache shared:SSL:10m;     # SSL会话共享内存  
ssl_session_timeout 10m;             # 设置 SSL 会话超时时间为 10 分钟

通过在 Nginx 中添加 ssl_session_cache 配置,配置中分配 Nginx 在处理 SSL 会话所需要开辟的共享内存的空间,我这里这里设置值为 10 MB,第二个参数就是设置 SSL SessionKey 的超时时间,这里设置的为 10 分钟,也就是每隔 10 分钟需要重新再进行一次建联,这是一个在服务端的超时时间。

三、总结

通过以上配置,我们能达到以下目标:

  • 1.并发能力:支持 worker_processes × worker_connections 的并发连接(如4核CPU:4×1024=4096并发)。
  • 2.传输效率:通过HTTP/2多路复用、零拷贝、长连接复用,减少50%以上的网络延迟。
  • 3.缓存命中率:静态资源缓存30天,文件描述符缓存减少 80 %的磁盘IO。
  • 4.性能平衡:SSL会话复用降低 50 %握手开销。

终极目录即构建毫秒级响应、C10K级别(万级并发)并发处理能力,适用于高并发、高安全、低带宽要求的Web服务场景。

NGINX高性能配置示例:

  • https://github.com/zuozewei/blog-example/tree/master/Operations/NGINX

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/76965.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ES DSL 常用修改语句

字段值替换修改 修改sql update zyzkwjj set dhreplace(dh,"WS","WSS") where dh like %WS% update zyzkwjj set dh replace(dh, WS, DZ),ztm replace(ztm, WS, DZ),zrz replace(zrz, WS, DZ) where dh like %WS% or ztm like %WS% or zrz like %WS%…

Vue 3 的组合式 API-hooks

Vue 3 的组合式 API 组合式 API 是 Vue 3 的核心特性之一,它允许开发者将组件的逻辑拆分为可复用的函数。组合式 API 的主要特点是 逻辑复用:将逻辑提取到独立的函数中,方便在多个组件中复用。组织清晰:将相关的逻辑分组&#x…

Web渗透之XSS注入

XSS的类型 1、反射型XSS 我们构建好一个urlXSS的payload,发送给受害者,受害者点击恶意链接后会在受害者的浏览器上执行恶意代码。反射型XSS是一次性的,而且比较容易被发现。通常恶意链接会被修改成短链接,或钓鱼图片的形式。 2…

【Nginx】Nginx代理Tomcat配置及404问题解决

当Tomcat返回HTTP 404未找到错误时,可以通过以下两种方式设置跳转到指定地址: ① 在Tomcat应用内部配置错误页面跳转(直接修改Tomcat的Web应用配置) ② 在Nginx反向代理层拦截404错误并跳转(无需修改Tomcat&#xff0c…

某公司网络OSPF单区域配置

1.配置背景: xx公司网络由三台路由器和一台交换机组成,现在想要三台路由器之间通过OSPF实现互连互通。 2.网络结构如下: 3.具体配置: 3.1路由器 RA 配置: 1.更改主机名称: Router>en Router#conf t…

电脑知识 | TCP通俗易懂详解 <一>

目录 一、👋🏻前言 二、🚍什么是TCP/TCP协议 三、🧍‍♂为什么TCP可靠 1.🥰关于可靠 2.🤠哪里可靠 3.🎓️图片的三次握手,四次挥手 4.📚️知识点总结 四、&…

MyBatis 中 Mapper 传递参数的多种方法

# MyBatis Mapper 传递参数的多种方法及其优势 在使用 MyBatis 进行数据库操作时,Mapper 接口的参数传递是一个非常基础但又十分重要的部分。不同的参数传递方式适用于不同的场景,合理选择可以大大提高代码的可读性和维护性。本文将详细介绍几种常见的 …

Dify 插件开发笔记

Dify 插件开发 开发流程 #mermaid-svg-U9rSMmcbWvcGcFMu {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-U9rSMmcbWvcGcFMu .error-icon{fill:#552222;}#mermaid-svg-U9rSMmcbWvcGcFMu .error-text{fill:#552222;st…

行星际激波在日球层中的传播:Propagation of Interplanetary Shocks in the Heliosphere (第二部分)

行星际激波在日球层中的传播:Propagation of Interplanetary Shocks in the Heliosphere (第一部分)- Chapter 1: Introduction & Chapter 2: Basics of Magnetohydrodynamics 行星际激波在日球层中的传播:Propagation of In…

巴法云平台-TCP设备云-微信小程序实时接收显示数据-原理

微信小程序通过WebSocket或HTTP长轮询连接平台(而非直接使用TCP)!!! 物联网平台对协议层的一种封装设计——将底层通信协议(如TCP)与应用层业务逻辑(如主题路由)解耦&am…

QT Sqlite数据库-教程002 查询数据-上

【1】DQL语句: DQL语句(数据查询语言),用来查询数据记录。DQL 基本结构由 SELECT FROM、WHERE、JOIN 等子句构成。DQL 语句并不会改变数据库,而是让数据库将查询结果发送结果集给客户端,返回的结果是一张虚…

基础数学:线性代数与优化理论

本篇文章简单带您复习线性代数与优化理论(主要是我发表的文章中涉及过的或相关联的) 微积分和概率与统计由此进:基础数学:微积分和概率与统计-CSDN博客 图论与信息论由此进:基础数学:图论与信息论-CSDN博…

java android持久化数据

1. SQLite 数据库(Android 内置) 1.1 创建数据库帮助类 public class DatabaseHelper extends SQLiteOpenHelper {private static final String DATABASE_NAME "MyDatabase.db";private static final int DATABASE_VERSION 1;// 表名和列名…

鸿蒙动画与交互设计:ArkUI 3D变换与手势事件详解

大家好,我是 V 哥。 在鸿蒙 NEXT 开发中,ArkUI 提供了丰富的 3D 变换和手势事件功能,可用于创建生动且交互性强的用户界面。下面详细介绍 ArkUI 的 3D 变换和手势事件,并给出相应的 ArkTS 案例代码。 1. ArkUI 3D 变换 ArkUI 支…

HTTP 和 HTTPS 协议的区别及使用场景

在互联网的世界里,HTTP 和 HTTPS 是我们经常接触到的两种网络协议,它们在数据传输、安全性等方面存在诸多差异,适用的场景也各有不同。​ 一、HTTP 和 HTTPS 的基本概念​ HTTP,即超文本传输协议(Hyper - Text Transfer Protocol),是一种用于分布式、协作式和超媒体信息…

【微服务管理】注册中心:分布式系统的基石

在分布式系统日益普及的当下,如何高效地管理众多服务实例成为关键问题。注册中心应运而生,它犹如分布式系统的 “指挥中枢”,承担着服务注册、发现等核心任务,为整个系统的稳定运行和高效协作提供坚实保障。本文将深入探讨注册中心…

高并发短信系统设计:基于SharingJDBC的分库分表、大数据同步与实时计算方案

高并发短信系统设计:基于SharingJDBC的分库分表、大数据同步与实时计算方案 一、概述 在当今互联网应用中,短信服务是极为重要的一环。面对每天发送2000万条短信的需求,我们需要一个能够处理海量数据(一年下来达到数千万亿级别&…

2025最新系统 Git 教程(七)(完结)

第4章 分布式Git 4.1 分布式 Git - 分布式工作流程 你现在拥有了一个远程 Git 版本库,能为所有开发者共享代码提供服务,在一个本地工作流程下,你也已经熟悉了基本 Git 命令。你现在可以学习如何利用 Git 提供的一些分布式工作流程了。 这一…

OpenCV 图像旋转

一、OpenCV 图像旋转介绍 在计算机视觉和图像处理领域,图像旋转是指将图像围绕某个中心点按照一定的角度进行转动。旋转操作会改变图像中像素的位置,从而得到新的图像布局。这一操作在很多场景中都有重要应用,比如文档矫正、目标检测时对图像…

<C#>在 .NET 开发中,依赖注入, 注册一个接口的多个实现

在 .NET 开发里,有时一个接口会有多个实现类,此时就需要向依赖注入容器注册多个实现。下面会详细介绍不同场景下如何注册多个实现,以及怎样从容器中解析这些实现。 1. 注册多个实现 在 .NET 中,依赖注入容器可以通过不同方式注册…