it编程 > 开发工具 > Docker

Nginx 站点垂直扩容的几种优化方案

3人参与 2026-01-19 Docker

核心:不改变架构、仅升级单台 nginx 服务器的硬件 / 配置,快速提升并发承载能力,是流量初期增长的最优解,成本低、实施快,优先落地这一套即可解决大部分初期瓶颈。

✅ 先明确:nginx 单机瓶颈核心点nginx 是事件驱动、异步非阻塞架构,单机瓶颈主要集中在:cpu核心数内存大小文件句柄限制网络带宽内核参数nginx自身配置,垂直扩容就是针对性解决这 6 个点。

一、硬件层面垂直扩容(最直接,优先做)

硬件是基础,nginx 对硬件的需求有明确侧重,按需升级即可,性价比最高的是加 cpu 核心、扩内存、提带宽

✅ 1. cpu 升级(核心优化,nginx 吃多核)

nginx 主进程负责管理,worker 进程负责处理请求,worker 数建议等于cpu物理核心数(超核心数会引发上下文切换,反而降性能)。

✅ 2. 内存扩容(解决缓存 / 连接池瓶颈)

nginx 内存主要用于:worker进程运行静态资源缓存连接池缓存日志临时存储,内存不足会导致频繁磁盘 io,并发骤降。

✅ 3. 网络带宽升级(解决出口拥堵,最易被忽略)

很多时候 nginx 服务器 cpu / 内存空闲,但用户访问卡顿,核心是公网带宽不足,这是中小站点最常见的垂直扩容卡点。

✅ 4. 磁盘优化(静态站点必做,降低 io 延迟)

nginx 处理静态资源时,磁盘 io 是次要瓶颈,但机械硬盘(hdd)会拖慢大文件读取,建议升级为ssd 固态硬盘

二、linux 内核参数优化(关键,释放系统性能,无成本)

nginx 基于 linux 系统运行,默认内核参数是为通用场景设计的,对高并发场景限制极大,必须针对性调优,这是垂直扩容的核心无成本操作,优先级高于硬件升级(硬件再好,内核限制也白搭)。

✅ 1. 调整文件句柄限制(nginx 高并发核心)

linux 默认单进程最大文件句柄数是1024,nginx 处理 1 个 tcp 连接就占用 1 个文件句柄,1024 的限制导致单机并发最多只能到几百,必须大幅提升。

步骤 1:临时生效(测试用)

# 查看当前限制
ulimit -n
# 临时提升到100万(终端生效,重启失效)
ulimit -n 1048576

步骤 2:永久生效(生产必配)

编辑系统配置文件 /etc/security/limits.conf,末尾添加:

# 全局所有用户生效,软限制/硬限制均为100万
* soft nofile 1048576
* hard nofile 1048576
# nginx进程用户(通常是nginx/www)单独提权,避免权限问题
nginx soft nofile 1048576
nginx hard nofile 1048576

编辑 /etc/pam.d/login,确保开启限制生效:

session required pam_limits.so 

步骤 3:验证生效

重启服务器后,执行 ulimit -n,输出1048576即成功。

✅ 2. 调整内核网络参数(解决 tcp 连接瓶颈)

编辑 /etc/sysctl.conf,末尾添加以下高并发参数,针对 http/https 优化,适配 nginx 反向代理场景:

# 1. 提升tcp最大连接数,内核级限制
net.core.somaxconn = 65535
# 2. 提升套接字接收/发送缓冲区大小(单位:字节)
net.core.rmem_default = 8388608
net.core.wmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
# 3. tcp连接缓存,解决time_wait/established连接堆积
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_tw_reuse = 1          # 复用time_wait连接(仅对客户端生效,nginx作为代理时必开)
net.ipv4.tcp_tw_recycle = 0        # 关闭回收,避免内网ip冲突
net.ipv4.tcp_fin_timeout = 30      # 缩短fin_wait2超时时间(默认60s→30s)
# 4. 提升tcp最大并发连接数,解决established上限
net.ipv4.tcp_max_syn_backlog = 65535
# 5. 开启tcp快速打开,提升握手效率
net.ipv4.tcp_fastopen = 3
# 6. 关闭ipv6,减少内核开销(无ipv6业务时必关)
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
# 7. 内存页优化,提升内存利用率
vm.swappiness = 0                  # 禁用swap交换分区,避免内存换磁盘导致卡顿
vm.overcommit_memory = 1           # 允许内存超额分配,避免nginx申请内存失败

生效命令:

sysctl -p # 立即生效,无需重启服务器 

✅ 3. 关闭无关服务(释放 cpu / 内存资源)

关闭 linux 系统中无用的服务,避免抢占 nginx 的硬件资源,生产环境必关:

# 关闭防火墙(若用云服务器安全组,无需系统防火墙)
systemctl stop firewalld && systemctl disable firewalld
# 关闭selinux(安全模块,会限制nginx文件访问/端口监听,高并发场景必关)
setenforce 0  # 临时关闭
sed -i 's/^selinux=enforcing/selinux=disabled/' /etc/selinux/config  # 永久关闭
# 关闭自动更新/邮件/打印等无用服务
systemctl stop chronyd && systemctl disable chronyd
systemctl stop postfix && systemctl disable postfix

三、nginx 自身配置优化(核心,榨干单机性能)

硬件和内核优化后,必须针对性调整 nginx 配置(nginx.conf),让 nginx 适配高并发,这是垂直扩容的最后一步,也是最关键的一步,直接决定单机并发上限。

✅ 1. 核心 worker 进程配置(适配 cpu 多核)

nginx 的worker_processesworker_connections并发核心参数,二者乘积≈单机理论最大并发数(worker_processes × worker_connections = 最大并发)。

# 核心1:worker进程数 = cpu物理核心数(推荐auto,自动识别核心数)
worker_processes auto;
# 核心2:绑定worker进程到指定cpu核心,避免上下文切换(性能提升20%+)
worker_cpu_affinity auto;
# 核心3:单worker最大连接数(对应内核文件句柄限制,设为65535即可)
worker_connections 65535;
# 核心4:开启epoll事件模型(linux专属,高并发必备,nginx1.9+默认开启)
use epoll;
# 核心5:开启worker进程后台运行,释放终端
daemon on;
# 核心6:关闭worker进程数自动调整,保持稳定
worker_rlimit_nofile 1048576;  # 单worker文件句柄数,与内核限制一致

✅ 并发计算公式:理论最大并发 = worker_processes × worker_connections / 4(http1.1,1 个用户占 4 个连接,含静态资源)例:8 核 cpu → worker_processes=8 → 8×65535/4 = 131070 单机并发,满足大部分中小站点需求。

✅ 2. 连接与超时配置(解决连接堆积,提升响应速度)

# 开启tcp复用,减少连接建立开销
tcp_nopush on;
tcp_nodelay on;
# 超时配置(核心,避免无效连接占用资源)
keepalive_timeout 65;        # 长连接超时时间,默认75s→65s,平衡并发与资源
keepalive_requests 10000;    # 1个长连接可处理的最大请求数(默认100→10000,大幅提升长连接利用率)
client_header_timeout 15;    # 客户端请求头超时时间
client_body_timeout 15;      # 客户端请求体超时时间
send_timeout 15;             # 向客户端发送数据超时时间

✅ 3. 静态资源缓存优化(减少磁盘 io,提升访问速度)

nginx 处理静态资源(图片 / js/css/ 视频)时,开启内存缓存和压缩,直接把性能拉满:

# 开启gzip压缩,减小传输体积(带宽压力降50%+)
gzip on;
gzip_min_length 1k;          # 小于1k不压缩,避免浪费cpu
gzip_buffers 4 16k;          # 压缩缓冲区大小
gzip_comp_level 6;           # 压缩级别1-9,6是性价比最优(速度+压缩比)
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript image/jpeg image/png;  # 压缩的文件类型
gzip_vary on;                # 支持cdn缓存压缩文件
 
# 开启静态资源内存缓存(核心,ssd+内存缓存,响应时间0ms)
open_file_cache max=100000 inactive=60s;  # 缓存文件句柄,最多10万,60s无访问释放
open_file_cache_valid 80s;                 # 验证缓存有效性时间
open_file_cache_min_uses 2;                # 最少访问2次才缓存
open_file_cache_errors on;                 # 缓存文件错误信息,避免重复检查

✅ 4. 反向代理优化(动态站点必配,适配后端服务)

若 nginx 作为反向代理(代理 java/php/node 后端),需优化代理配置,提升后端转发效率:

# 开启代理长连接,避免频繁与后端建立连接
proxy_http_version 1.1;
proxy_set_header connection "";
# 代理超时配置
proxy_connect_timeout 30s;    # 与后端建立连接超时
proxy_read_timeout 60s;       # 读取后端响应超时
proxy_send_timeout 60s;       # 向后端发送请求超时
# 代理缓冲区,减少磁盘io
proxy_buffers 16 64k;
proxy_buffer_size 64k;

✅ 5. 关闭无用模块,减少 nginx 开销

nginx 默认编译了很多无用模块(如邮件代理、ftp、geoip),编译时剔除无用模块,让 nginx 更轻量化,性能提升 10%+:

# 编译时指定核心模块,仅保留静态/反向代理/https核心功能
./configure --prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_gzip_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-stream \
--with-http_epoll_module
make && make install

四、垂直扩容后性能验证(必做,确认效果)

扩容完成后,通过工具压测,验证单机并发和响应时间是否达标,常用工具:ab(apache bench)、wrk(推荐,更精准)。

✅ 1. wrk 压测(推荐,轻量高效)

# 安装wrk
yum install wrk -y
# 压测命令:10个线程,200个连接,压测30秒,访问首页
wrk -t10 -c200 -d30s http://你的域名/

✅ 2. 压测合格标准

五、垂直扩容的上限与注意事项

✅ 垂直扩容的单机性能上限

✅ 注意事项(避坑关键)

  1. 内核参数net.ipv4.tcp_tw_reuse=1仅对nginx 作为客户端(反向代理)生效,作为服务端时需靠keepalive优化;
  2. worker_connections不能超过worker_rlimit_nofile和内核nofile限制,否则 nginx 启动失败;
  3. 开启gzip_comp_level=9会大幅占用 cpu,性价比低,推荐 6;
  4. 云服务器优先选择计算型实例(如阿里云 ecs 计算型 c7、腾讯云 cvm 标准型 s7),而非通用型 / 内存型;
  5. 垂直扩容到 16 核 32g 后,若流量继续增长(日活超 200 万),则需进入水平扩容(多机集群 + 负载均衡),这是后续的架构升级方向。

六、垂直扩容实施优先级(按这个顺序做,最快见效)

  1. ✅ 内核文件句柄 + 网络参数优化(无成本,10 分钟完成,并发提升 10 倍);
  2. ✅ nginx worker + 连接 + 缓存配置优化(10 分钟完成,榨干系统性能);
  3. ✅ 公网带宽扩容(云服务器一键升级,解决卡顿核心问题);
  4. ✅ cpu / 内存硬件升级(云服务器弹性扩容,5 分钟生效);
  5. ✅ 磁盘升级为 ssd(静态站点必做,提升静态资源加载速度)。

到此这篇关于nginx 站点垂直扩容的几种优化方案的文章就介绍到这了,更多相关nginx 站点垂直扩容内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

您想发表意见!!点此发布评论

推荐阅读

nginx docker官方镜像添加自定义命令自动退出方式

01-19

Docker安装教程

12-26

Docker的安装

12-26

Apache RocketMQ Docker 容器化部署方案

12-15

Centos7 firewall和docker冲突问题及解决过程

12-14

Docker部署Neko和cpolar实现多人实时共用浏览器

11-22

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论