3人参与 • 2026-01-19 • Docker
核心:不改变架构、仅升级单台 nginx 服务器的硬件 / 配置,快速提升并发承载能力,是流量初期增长的最优解,成本低、实施快,优先落地这一套即可解决大部分初期瓶颈。
✅ 先明确:nginx 单机瓶颈核心点nginx 是事件驱动、异步非阻塞架构,单机瓶颈主要集中在:cpu核心数、内存大小、文件句柄限制、网络带宽、内核参数、nginx自身配置,垂直扩容就是针对性解决这 6 个点。
硬件是基础,nginx 对硬件的需求有明确侧重,按需升级即可,性价比最高的是加 cpu 核心、扩内存、提带宽。
nginx 主进程负责管理,worker 进程负责处理请求,worker 数建议等于cpu物理核心数(超核心数会引发上下文切换,反而降性能)。
nginx 内存主要用于:worker进程运行、静态资源缓存、连接池缓存、日志临时存储,内存不足会导致频繁磁盘 io,并发骤降。
很多时候 nginx 服务器 cpu / 内存空闲,但用户访问卡顿,核心是公网带宽不足,这是中小站点最常见的垂直扩容卡点。
sar -n dev 1 5 查看网卡流量,若峰值接近带宽上限(如 100m 带宽跑满 95m+),立即扩容;nginx 处理静态资源时,磁盘 io 是次要瓶颈,但机械硬盘(hdd)会拖慢大文件读取,建议升级为ssd 固态硬盘。
/usr/share/nginx/html)。nginx 基于 linux 系统运行,默认内核参数是为通用场景设计的,对高并发场景限制极大,必须针对性调优,这是垂直扩容的核心无成本操作,优先级高于硬件升级(硬件再好,内核限制也白搭)。
linux 默认单进程最大文件句柄数是1024,nginx 处理 1 个 tcp 连接就占用 1 个文件句柄,1024 的限制导致单机并发最多只能到几百,必须大幅提升。
# 查看当前限制 ulimit -n # 临时提升到100万(终端生效,重启失效) ulimit -n 1048576
编辑系统配置文件 /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
重启服务器后,执行 ulimit -n,输出1048576即成功。
编辑 /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 # 立即生效,无需重启服务器
关闭 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.conf),让 nginx 适配高并发,这是垂直扩容的最后一步,也是最关键的一步,直接决定单机并发上限。
nginx 的worker_processes和worker_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 单机并发,满足大部分中小站点需求。
# 开启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; # 向客户端发送数据超时时间
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; # 缓存文件错误信息,避免重复检查
若 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;
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(推荐,更精准)。
# 安装wrk yum install wrk -y # 压测命令:10个线程,200个连接,压测30秒,访问首页 wrk -t10 -c200 -d30s http://你的域名/
errors: 0);net.ipv4.tcp_tw_reuse=1仅对nginx 作为客户端(反向代理)生效,作为服务端时需靠keepalive优化;worker_connections不能超过worker_rlimit_nofile和内核nofile限制,否则 nginx 启动失败;gzip_comp_level=9会大幅占用 cpu,性价比低,推荐 6;到此这篇关于nginx 站点垂直扩容的几种优化方案的文章就介绍到这了,更多相关nginx 站点垂直扩容内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论