1. 先做流量与瓶颈诊断
- 工具安装:apt install vnstat iftop bmon iperf3 -y。
- 实操命令:vnstat -l(实时流量),iftop -i eth0(连接占用),iperf3 -s(在服务器端启动测试),在本地跑 iperf3 -c
-P 10 测试并发吞吐。
- 输出解读:看峰值带宽、并发连接数、短时突发包,定位是出在上行(服务器发出)还是下行(接收)。
2. 最低成本的第一步:开启压缩与静态资源优化
- Nginx 启用 gzip/brotli(如已编译模块):在 http{} 加入 gzip on; gzip_proxied any; gzip_types text/css application/javascript application/json image/svg+xml; gzip_min_length 512; 并安装 pre-compress 工具 brotli 并生成 .br 文件。
- 图片与资源处理:使用 WebP/AVIF,启用 lazy-loading,使用工具(cwebp、svgo)批量优化。
- 验证:curl -I https://your.site/asset.js 查看 Content-Encoding。
3. 使用 CDN 将静态流量卸载到边缘节点
- 步骤:选择 Cloudflare、Fastly 或本地台湾节点的 CDN;在 CDN 控制台将静态路径(/static、/assets)设置为缓存并开启压缩与 HTTP/2。
- Cache-Control 设置:Nginx 中 location ~* \.(js|css|jpg|png|webp)$ { expires 30d; add_header Cache-Control "public, max-age=2592000"; }。
- 验证:访问边缘 IP、观察 CDN 缓存命中率和回源流量减少。
4. 反向代理与页面缓存(Nginx proxy_cache 示例)
- 建立缓存目录并配置:mkdir -p /var/cache/nginx/proxy && chmod 700 /var/cache/nginx/proxy。
- nginx.conf 片段:proxy_cache_path /var/cache/nginx/proxy levels=1:2 keys_zone=mycache:10m inactive=60m max_size=10g; server{ location / { proxy_cache mycache; proxy_cache_valid 200 10m; proxy_cache_use_stale error timeout updating http_500 http_502; add_header X-Cache-Status $upstream_cache_status; } }。
- 清理策略:可用 curl 调用 /purge 接口或配合第三方脚本做按需失效。
5. 动态页面缓存与后端优化(Varnish/Redis)
- Varnish 快速上手:apt install varnish,编辑 /etc/varnish/default.vcl,设置后端为 Nginx,配置 ttl 并用 req.url ~ "^/api" 不缓存。
- Redis 缓存:用于对象缓存与会话,PHP 环境安装 phpredis 并在应用(如 WordPress)启用 object cache 插件,减少 DB 查询。
- 验证:在高并发下观察后端 PHP 响应时间和 DB 查询数减少。
6. 连接与速率控制(防止个别IP占满带宽)
- Nginx 限速示例:limit_conn_zone $binary_remote_addr zone=addr:10m; limit_conn addr 10; limit_req_zone $binary_remote_addr zone=req:10m rate=10r/s; 在 location 添加 limit_req。
- 系统层面 tc 带宽整形示例(把出口限速为500mbit以防超发导致突发):tc qdisc add dev eth0 root tbf rate 500mbit burst 32kbit latency 400ms。
- iptables 限连接:iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 200 -j REJECT。
7. TCP/内核调优与长连接策略
- 常用 sysctl 调整(写入 /etc/sysctl.conf 并 sysctl -p):net.core.somaxconn=1024; net.ipv4.tcp_max_syn_backlog=2048; net.ipv4.tcp_fin_timeout=30; net.ipv4.tcp_tw_reuse=1。
- 开启 HTTP/2 与 keepalive,减少 TCP 握手成本:在 Nginx server{} 中添加 listen 443 ssl http2; keepalive_timeout 65;。
- 验证:使用 curl --http2 -I 测试,和 ss -s 查看 socket 状态。
8. 弹性方案:分流、负载均衡与分布式化
- 方案:若单台 500M VPS 无法承受峰值,采用负载均衡器(HAProxy 或云 LB)将流量分散到多台小 VPS,或使用对象存储 + CDN 完全卸载静态。
- 步骤示例:在 HAProxy 配置后端池,设 health check,逐步切换流量;监控回源减少才算成功。
- 成本/复杂度评估:对比 CDN 费用与多机运维成本,选择最经济方案。
9. 测试与持续监控(保证优化有效)
- 压力测试工具:wrk -t12 -c400 -d30s http://your.site/。注意在非生产环境或低流量窗口做测试。
- 自动化监控:Prometheus + Grafana 收集 if_out, if_in、nginx 访问量、上游命中率,设置带宽阈值告警。
- 验证指标:峰值带宽是否接近或低于 500M、回源请求数量减少、95P 响应时间下降。
10. 常见问题一:带宽限制仍被触发,优先排查什么?
- 回答:先看是否是静态大文件(视频、大图)回源未被CDN缓存;使用 iftop 找出大流量连接,检查是否有爬虫或单IP占用;确认 Nginx 缓存命中率与 CDN 命中率是否低,再排查后端是否生成动态大流量。
11. 常见问题二:如何在不改代码的情况下快速降低峰值流量?
- 回答:立刻启用 CDN 缓存规则、增加 Nginx proxy_cache 并设置短期 TTL、在应用边缘添加限流(limit_req/limit_conn)、用 tc 对出口做整形,临时关闭高带宽功能(如直播或大文件下载)。
12. 常见问题三:500M VPS 是否值得长期投资更高带宽还是走分布式?
- 回答:若流量波动大且峰值短,优先用 CDN + 缓存与带宽整形;若长期高峰稳定存在,比较成本后可考虑升级带宽或采用负载均衡分布式方案。通常先做缓存与优化,能省下多数升级开销。
来源:台湾500m vps带宽限制应对流量峰值的优化方法与缓存策略