0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Nginx高并发场景下的性能调优技巧

马哥Linux运维 来源:马哥Linux运维 2025-09-02 16:26 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

Nginx高并发场景下的性能调优与架构设计:从入门到实战的完整指南

引言:为什么你需要掌握Nginx性能调优?

在一次双十一大促中,我们的电商平台在活动开始后3分钟内涌入了800万用户,QPS瞬间飙升到50万。就在所有人都捏着一把汗的时候,经过优化的Nginx集群稳稳地扛住了这波流量冲击,CPU使用率始终保持在60%以下。

这就是Nginx性能调优的威力。

如果你正在面临以下问题:

• 网站访问量激增时频繁出现502/504错误

• Nginx CPU占用率居高不下,但QPS却上不去

• 不知道如何设计高可用的Nginx架构

• 想要榨干服务器性能,但不知从何下手

那么这篇文章将帮你彻底解决这些问题。我将分享过去5年在大厂处理千万级并发的实战经验,包括那些踩过的坑和独家优化技巧。

一、性能基准测试:知己知彼

在开始优化之前,我们需要先了解当前系统的性能基线。很多人一上来就调参数,这是典型的错误做法。

1.1 压测工具选择与使用

# 使用wrk进行基准测试
wrk -t12 -c400 -d30s --latency http://your-domain.com/

# 使用ab进行简单测试
ab -n 100000 -c 1000 http://your-domain.com/

# 使用vegeta进行更精准的测试
echo"GET http://your-domain.com/"| vegeta attack -duration=30s -rate=10000 | vegeta report

实战技巧:压测时要监控以下关键指标:

• QPS/TPS

• 响应时间分布(P50、P95、P99)

• 错误率

• CPU/内存/网络/磁盘IO使用率

1.2 性能瓶颈定位

通过我的经验,Nginx性能瓶颈通常出现在这几个地方:

1.连接数限制:系统默认的文件描述符限制

2.CPU瓶颈:worker进程数配置不当

3.内存瓶颈:缓冲区设置不合理

4.网络IO瓶颈:网卡中断处理不均衡

5.磁盘IO瓶颈:日志写入拖慢整体性能

二、系统层面优化:打好地基

2.1 内核参数优化

这是我在生产环境使用的一套优化参数,可以直接复制使用:

# /etc/sysctl.conf

# 系统级别最大文件句柄数
fs.file-max = 2000000
fs.nr_open = 2000000

# 网络优化
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_keepalive_time = 120
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3

# TCP缓冲区优化
net.core.rmem_default = 262144
net.core.wmem_default = 262144
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 262144 16777216
net.ipv4.tcp_wmem = 4096 262144 16777216

# 连接跟踪表优化
net.netfilter.nf_conntrack_max = 1000000
net.nf_conntrack_max = 1000000
net.netfilter.nf_conntrack_tcp_timeout_established = 1200

# BBR拥塞控制算法(内核4.9+)
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr

关键点解析

•tcp_tw_reuse:允许TIME_WAIT套接字重用,对于高并发短连接场景效果显著

•somaxconn:决定了Nginx的backlog上限,必须调大

• BBR算法:Google开发的拥塞控制算法,在高延迟网络下性能提升明显

2.2 文件描述符限制

# /etc/security/limits.conf
* soft nofile 1000000
* hard nofile 1000000
* softnproc1000000
* hardnproc1000000

# 对于systemd管理的服务,还需要修改
# /etc/systemd/system/nginx.service.d/override.conf
[Service]
LimitNOFILE=1000000
LimitNPROC=1000000

三、Nginx配置优化:核心调优

3.1 全局配置优化

# nginx.conf

usernginx;
# worker进程数建议设置为CPU核心数
worker_processesauto;
# 每个worker进程最大连接数
worker_rlimit_nofile1000000;

# 绑定worker进程到指定CPU核心,减少CPU切换开销
worker_cpu_affinityauto;

# 错误日志级别设置为error,减少IO
error_log/var/log/nginx/error.logerror;

events{
 # 使用epoll事件驱动模型(Linux)
 useepoll;
 
 # 每个worker进程的最大连接数
 worker_connections65535;
 
 # 开启高效文件传输模式
 multi_accepton;
 
 # 优化同一时刻只有一个请求的问题
 accept_mutexoff;
}

http{
 # 基础优化
 sendfileon;
 tcp_nopushon;
 tcp_nodelayon;
 
 # 连接超时优化
 keepalive_timeout65;
 keepalive_requests10000;
 reset_timedout_connectionon;
 client_body_timeout10;
 client_header_timeout10;
 send_timeout10;
 
 # 缓冲区优化
 client_body_buffer_size128k;
 client_max_body_size10m;
 client_header_buffer_size1k;
 large_client_header_buffers48k;
 output_buffers32128k;
 postpone_output1460;
 
 # 文件缓存优化
 open_file_cachemax=200000inactive=20s;
 open_file_cache_valid30s;
 open_file_cache_min_uses2;
 open_file_cache_errorson;
 
 # Gzip压缩优化
 gzipon;
 gzip_min_length1k;
 gzip_buffers1664k;
 gzip_http_version1.1;
 gzip_comp_level6;
 gzip_typestext/plain application/javascript application/x-javascript text/css application/xml text/javascript;
 gzip_varyon;
 gzip_proxiedany;
 gzip_disable"MSIE [1-6].";
 
 # 隐藏版本号
 server_tokensoff;
 
 # 优化请求头哈希表
 server_names_hash_bucket_size128;
 server_names_hash_max_size512;
 
 # 日志优化
 access_log/var/log/nginx/access.log main buffer=32kflush=5s;
}

3.2 上游服务器配置优化

upstreambackend {
 # 使用least_conn负载均衡算法(最少连接数)
  least_conn;
 
 # 启用长连接池
 keepalive300;
 keepalive_requests10000;
 keepalive_timeout60s;
 
 # 后端服务器配置
 serverbackend1.example.com:8080max_fails=2fail_timeout=10sweight=5;
 serverbackend2.example.com:8080max_fails=2fail_timeout=10sweight=5;
 serverbackend3.example.com:8080max_fails=2fail_timeout=10sweight=5backup;
 
 # 添加健康检查(需要nginx_upstream_check_module)
 checkinterval=3000rise=2fall=3timeout=1000type=http;
 check_http_send"HEAD /health HTTP/1.0

";
 check_http_expect_alivehttp_2xx http_3xx;
}

server{
 listen80default_server reuseport;
 listen[::]:80default_server reuseport;
 server_name_;
 
 location/ {
   proxy_passhttp://backend;
   
   # 代理优化配置
   proxy_http_version1.1;
   proxy_set_headerConnection"";
   proxy_connect_timeout10s;
   proxy_send_timeout10s;
   proxy_read_timeout10s;
   
   # 缓冲区优化
   proxy_bufferingon;
   proxy_buffer_size4k;
   proxy_buffers324k;
   proxy_busy_buffers_size64k;
   proxy_temp_file_write_size64k;
   
   # 请求头设置
   proxy_set_headerHost$host;
   proxy_set_headerX-Real-IP$remote_addr;
   proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;
   proxy_set_headerX-Forwarded-Proto$scheme;
   
   # 缓存配置
   proxy_cache_bypass$http_upgrade;
   proxy_no_cache$http_upgrade;
  }
}

3.3 静态资源优化

location~* .(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot)${
 # 设置过期时间
 expires30d;
 add_headerCache-Control"public, immutable";
 
 # 开启零拷贝
 sendfileon;
 tcp_nopushon;
 
 # 关闭访问日志
 access_logoff;
 
 # 防盗链
 valid_referersnoneblockedserver_names ~.google. ~.baidu. ~.bing.;
 if($invalid_referer) {
   return403;
  }
}

四、高级优化技巧

4.1 缓存策略优化

# 定义缓存路径和配置
proxy_cache_path/var/cache/nginx levels=1:2keys_zone=my_cache:100mmax_size=10ginactive=60muse_temp_path=off;

server{
 location/api/ {
   # 缓存键设置
   proxy_cache_key"$scheme$request_method$host$request_uri$is_args$args";
   proxy_cachemy_cache;
   
   # 针对不同响应码设置不同缓存时间
   proxy_cache_valid20030210m;
   proxy_cache_valid4041m;
   proxy_cache_validany1m;
   
   # 缓存锁,防止缓存击穿
   proxy_cache_lockon;
   proxy_cache_lock_timeout5s;
   
   # 允许使用过期缓存
   proxy_cache_use_staleerrortimeout updating http_500 http_502 http_503 http_504;
   
   # 添加缓存状态头
   add_headerX-Cache-Status$upstream_cache_status;
   
   # 缓存预热和更新
   proxy_cache_background_updateon;
   proxy_cache_revalidateon;
  }
}

4.2 限流配置

# 定义限流区域
limit_req_zone$binary_remote_addrzone=perip:10mrate=10r/s;
limit_req_zone$server_namezone=perserver:10mrate=1000r/s;
limit_conn_zone$binary_remote_addrzone=connperip:10m;

server{
 # IP限流
 limit_reqzone=perip burst=20delay=10;
 
 # 连接数限制
 limit_connconnperip10;
 
 # 限流白名单
 geo$limit_whitelist{
   default0;
    10.0.0.0/8 1;
    192.168.0.0/16 1;
  }
 
 map$limit_whitelist$limit_req_key{
    0 $binary_remote_addr;
    1 "";
  }
}

4.3 SSL/TLS优化

server{
 listen443ssl http2 reuseport;
 
 # SSL证书配置
 ssl_certificate/path/to/cert.pem;
 ssl_certificate_key/path/to/key.pem;
 
 # SSL优化
 ssl_protocolsTLSv1.2TLSv1.3;
 ssl_ciphersECDHE-RSA-AES128-GCM-SHA256!aNULL!RC4:!DHE;
 ssl_prefer_server_cipherson;
 
 # SSL会话缓存
 ssl_session_cacheshared50m;
 ssl_session_timeout1d;
 ssl_session_ticketsoff;
 
 # OCSP装订
 ssl_staplingon;
 ssl_stapling_verifyon;
 ssl_trusted_certificate/path/to/chain.pem;
 
 # HSTS
 add_headerStrict-Transport-Security"max-age=31536000; includeSubDomains"always;
}

五、高可用架构设计

5.1 主备架构

# keepalived配置示例
vrrp_scriptcheck_nginx {
 script"/usr/local/bin/check_nginx.sh"
  interval2
  weight -5
  fall3
  rise2
}

vrrp_instance VI_1 {
 stateMASTER
  interface eth0
  virtual_router_id51
  priority100
  advert_int1
  authentication {
   auth_typePASS
    auth_pass1234
  }
  virtual_ipaddress {
    192.168.1.100
  }
 track_script{
   check_nginx
  }
}

5.2 负载均衡架构

在超高并发场景下,我通常采用四层+七层负载均衡的架构:

Internet
  ↓
LVS/F5 (四层负载均衡)
  ↓
Nginx集群 (七层负载均衡)
  ↓
应用服务器集群

这种架构的优势:

• LVS处理能力强,可达千万级并发

• Nginx提供灵活的七层负载均衡和缓存

• 双层负载均衡提供更好的高可用性

5.3 动静分离架构

# CDN回源配置
location~* .(jpg|jpeg|png|gif|ico|css|js)${
 # 设置CDN回源头
 add_headerCache-Control"public, max-age=31536000";
 
 # 回源鉴权
 set$auth_token"";
 if($http_x_cdn_auth="your-secret-token") {
   set$auth_token"valid";
  }
 if($auth_token!="valid") {
   return403;
  }
}

# 动态请求处理
location/api/ {
 proxy_passhttp://backend;
 # 禁用缓存
 add_headerCache-Control"no-cache, no-store, must-revalidate";
}

六、监控与故障排查

6.1 性能监控

# 开启stub_status模块
location/nginx_status {
 stub_statuson;
 access_logoff;
 allow127.0.0.1;
 denyall;
}

# 开启VTS模块获取详细统计
location/status {
  vhost_traffic_status_display;
 vhost_traffic_status_display_formathtml;
 allow127.0.0.1;
 denyall;
}

6.2 日志分析

# 分析访问最多的IP
awk'{print $1}'access.log |sort|uniq-c |sort-rn |head-10

# 分析响应时间
awk'{print $NF}'access.log |sort-n | awk'{
  count[NR] = $1;
  sum += $1
}
END {
  print "Average:", sum/NR;
  print "P50:", count[int(NR*0.5)];
  print "P95:", count[int(NR*0.95)];
  print "P99:", count[int(NR*0.99)];
}'

# 实时监控错误日志
tail-f error.log | grep -E"error|alert|crit"

6.3 性能分析工具

# 使用nginx-amplify进行监控
curl -L -O https://github.com/nginxinc/nginx-amplify-agent/raw/master/packages/install.sh
sh ./install.sh

# 使用ngxtop实时分析
ngxtop -l /var/log/nginx/access.log

# 使用goaccess生成报表
goaccess /var/log/nginx/access.log -o report.html --log-format=COMBINED

七、实战案例分析

案例1:电商大促扛住百万QPS

背景:某电商平台双十一活动,预计QPS峰值100万

解决方案

1. 部署20台Nginx服务器,每台配置32核64G

2. 使用LVS做四层负载均衡

3. 静态资源全部推送到CDN

4. 热点数据使用Redis缓存

5. 配置限流,防止恶意请求

优化结果

• 实际峰值QPS:120万

• 平均响应时间:50ms

• P99响应时间:200ms

• 错误率:0.01%

案例2:API网关性能优化

背景:微服务架构下,API网关成为性能瓶颈

优化措施

# 使用Lua脚本进行动态路由
location/api {
 set$backend'';
 rewrite_by_lua_block{
   localroutes = {
      ["/api/user"] = "http://user-service",
      ["/api/order"] = "http://order-service",
      ["/api/product"] = "http://product-service"
    }
   
   forpattern, backend in pairs(routes) do
      if ngx.re.match(ngx.var.uri, pattern) then
        ngx.var.backend = backend
       break
      end
    end
  }
 
  proxy_pass$backend;
}

优化效果

• QPS提升300%

• 延迟降低60%

• CPU使用率降低40%

八、常见问题与解决方案

8.1 502 Bad Gateway

常见原因

1. 后端服务器宕机

2. 连接超时设置过短

3. 缓冲区设置过小

解决方案

# 增大超时时间
proxy_connect_timeout30s;
proxy_send_timeout30s;
proxy_read_timeout30s;

# 增大缓冲区
proxy_buffer_size64k;
proxy_buffers3232k;
proxy_busy_buffers_size128k;

8.2 504 Gateway Timeout

解决方案

# 优化超时配置
proxy_read_timeout300s;
fastcgi_read_timeout300s;

# 启用长连接
upstreambackend {
 serverbackend1.example.com:8080;
 keepalive32;
}

8.3 内存占用过高

优化策略

1. 减少worker进程数

2. 优化缓冲区大小

3. 限制请求体大小

4. 定期重载配置释放内存

九、性能测试对比

我对比测试了优化前后的性能数据:

指标 优化前 优化后 提升比例
QPS 5,000 50,000 10倍
P50延迟 200ms 20ms 90%
P99延迟 2000ms 100ms 95%
CPU使用率 90% 40% 55%
内存使用 8GB 4GB 50%
错误率 1% 0.01% 99%

十、进阶优化方向

10.1 使用OpenResty

OpenResty可以让你使用Lua脚本扩展Nginx功能:

-- 限流脚本示例
locallimit_req =require"resty.limit.req"
locallim, err = limit_req.new("my_limit_req_store",200,100)

ifnotlimthen
  ngx.log(ngx.ERR,"failed to instantiate a resty.limit.req object: ", err)
 returnngx.exit(500)
end

localkey = ngx.var.binary_remote_addr
localdelay, err = lim:incoming(key,true)

ifnotdelaythen
 iferr =="rejected"then
   returnngx.exit(503)
 end
  ngx.log(ngx.ERR,"failed to limit req: ", err)
 returnngx.exit(500)
end

10.2 HTTP/3 QUIC支持

# 编译时添加QUIC支持
./configure--with-http_v3_module --with-http_quic_module

# 配置HTTP/3
server {
 listen443http3 reuseport;
 listen443ssl http2;
 
 ssl_protocolsTLSv1.3;
 add_headerAlt-Svc'h3=":443"; ma=86400';
}

总结与建议

通过本文的优化方案,你应该能够:

1.系统层面:内核参数调优,提升系统处理能力

2.Nginx配置:精细化配置,榨干每一分性能

3.架构设计:构建高可用、可扩展的架构

4.监控运维:建立完善的监控体系

5.故障处理:快速定位和解决问题

最后的建议

• 优化要循序渐进,每次只改一个参数

• 建立性能基准,量化优化效果

• 生产环境改动要先在测试环境验证

• 保持配置文件的版本管理

• 定期review和更新优化策略

记住,性能优化没有银弹,需要根据实际场景不断调整。但掌握了这些核心技巧,你就能应对99%的高并发挑战。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    11216

    浏览量

    222924
  • 集群
    +关注

    关注

    0

    文章

    130

    浏览量

    17595
  • nginx
    +关注

    关注

    0

    文章

    180

    浏览量

    12966

原文标题:Nginx高并发场景下的性能调优与架构设计:从入门到实战的完整指南

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    史上最全性能总结

    在说什么是性能之前,我们先来说一,计算机的体系结构。
    的头像 发表于 05-13 08:57 7036次阅读
    史上最全<b class='flag-5'>性能</b><b class='flag-5'>调</b><b class='flag-5'>优</b>总结

    HarmonyOSAI编程智慧

    DevEco Studio提供智慧能力,支持通过自然语言交互,分析并解释当前实例或项目中存在的性能问题,帮助开发者快速定位影响性能的具体原因。该功能从DevEco Studio 6
    发表于 09-01 15:15

    HBase性能概述

    HBase性能
    发表于 07-03 11:35

    基于全HDD aarch64服务器的Ceph性能实践总结

    ,磁盘的性能得到了成倍的提升,如下图。网络带宽也成倍增长。所以,我们可以基于不同的测试场景,不同的块大小,去选择升级磁盘和网络设备来提升性能。当然,TCO也是需要考虑的。4.2 Ceph软件层面
    发表于 07-05 14:26

    infosphere CDC性能的文档

    infosphere CDC性能的文档
    发表于 09-07 09:30 7次下载
    infosphere CDC<b class='flag-5'>性能</b><b class='flag-5'>调</b><b class='flag-5'>优</b>的文档

    并发性能是在技术进阶赛道变得厉害的加分项

    并发性能,一定是你在技术进阶赛道变得牛逼的加分项。不论,你是开发,架构还是管理岗,亦或者是其他互联网相关岗位。因为毫不夸张的说,在现在动辄过千万级的
    的头像 发表于 09-18 10:39 1666次阅读

    解密并发业务场景典型的秒杀系统的架构

    中,就更别提如何构建并发系统了! 究竟什么样的系统算是并发系统?今天,我们就一起解密并发
    的头像 发表于 11-17 10:32 2856次阅读
    解密<b class='flag-5'>高</b><b class='flag-5'>并发</b>业务<b class='flag-5'>场景</b><b class='flag-5'>下</b>典型的秒杀系统的架构

    为什么Nginx可以支持并发

    先说答案,Nginx之所以支持并发,是因为它是基于epoll的异步及非阻塞的事件驱动模型。 在这个模型Nginx服务端可以同一时间接收
    的头像 发表于 02-13 10:48 2160次阅读

    什么场景需要jvm

    JVM是指对Java虚拟机进行性能优化和资源管理,以提高应用程序的运行效率和吞吐量。JVM场景
    的头像 发表于 12-05 11:14 2016次阅读

    鸿蒙开发实战:【性能组件】

    性能组件包含系统和应用框架,旨在为开发者提供一套性能
    的头像 发表于 03-13 15:12 1192次阅读
    鸿蒙开发实战:【<b class='flag-5'>性能</b><b class='flag-5'>调</b><b class='flag-5'>优</b>组件】

    手把手教你如何Linux网络参数

    并发网络服务场景中,Linux内核的默认网络参数往往无法满足需求,导致性能瓶颈、连接超时甚至服务崩溃。本文基于真实案例分析,从参数解读、问题诊断到优化实践,手把手教你如何
    的头像 发表于 05-29 09:21 644次阅读

    Nginx性能优化终极指南

    而worker 进程数默认为 1 。单进程最大连接数为1024。如下图(打开Nginx目录下的/conf/nginx.conf 文档),现在我们来对这两个数值进行
    的头像 发表于 06-16 13:44 912次阅读
    <b class='flag-5'>Nginx</b><b class='flag-5'>性能</b>优化终极指南

    Nginx在企业环境中的策略

    Nginx作为现代互联网架构中最重要的Web服务器和反向代理服务器,其性能对企业级应用的稳定性和效率至关重要。本指南将从运维实践角度出发,详细介绍
    的头像 发表于 07-14 11:13 401次阅读

    Linux网络性能方案

    在当今并发、大流量的互联网环境,网络性能往往成为系统的瓶颈。作为一名资深运维工程师,我在生产环境中遇到过无数次因为TCP/IP参数配置不当导致的
    的头像 发表于 08-06 18:01 954次阅读

    Nginx并发优化方案

    作为一名在生产环境中摸爬滚打多年的运维工程师,我见过太多因为Nginx配置不当导致的性能瓶颈。今天分享一套完整的Nginx并发优化方案,帮
    的头像 发表于 08-13 15:51 668次阅读