1. 问题描述与初步确认
• 描述:阿里云香港服务器在高峰时段出现 5xx 错误率上升与响应变慢。
• 影响范围:业务为网站和 API,全球访问但以亚太用户为主。
• 初步日记观察:nginx error.log 与 access.log 时间戳集中了短时间内大量 502/504。
• 关联服务:后端 PHP-FPM、MySQL 与 CDN(阿里云 CDN)同时报错概率增加。
• 目标:快速定位是服务器资源瓶颈、网络问题、还是DDoS/爬虫攻击。
2. 服务器环境与配置样例
• 实例信息:阿里云 ECS(香港 Region)示例配置如下。
• 配置样例:实例类型 ecs.c6.large,vCPU 2,内存 4GB,系统盘 40GB,公网带宽 5Mbps(按包计费)。
• 操作系统:CentOS 7.9,内核 3.10,nginx 1.18,php-fpm 7.4,MySQL 5.7。
• 网络与安全组:安全组仅开放 80/443/22,Anti-DDoS 基础已启用(按需升级至高级)。
• 备注:若为业务高峰,带宽 5Mbps 容易成为瓶颈,应考虑按需弹性带宽或使用 CDN 缓存静态资源。
3. 日志收集的关键命令与样例日志
• 常用命令:tail -n 200 /var/log/nginx/error.log 用于快速查看错误倾向。
• 实时观察:tail -f /var/log/nginx/access.log 或使用 goaccess 生成统计报表。
• 样例错误行(示例):2026-04-12T03:14:22Z [error] 12345#0: *98765 upstream prematurely closed connection while reading response header from upstream, client: 203.0.113.45, server: example.com, request: "GET /api/large HTTP/1.1", upstream: "http://127.0.0.1:9000/..."
• 另一日志(超时):2026-04-12T03:14:23Z [error] 12345#0: *98766 connect() to 10.0.0.5:3306 failed (110: Connection timed out) while connecting to upstream, client: 203.0.113.46...
• 建议:把关键字段(IP、请求、上游地址、状态码、时间)导出到 ELK 或 Loki 做聚合。
4. 指标监控与数据示范(表格)
• 监控项:CPU、内存、磁盘IO、网卡流量、连接数、负载、nginx 活跃连接数。
• 短时峰值示例:以下为 2026-04-12 03:10-03:20 的监控抽样(单位:CPU%/MB/pps/conn)。
| 时间 | CPU% | 内存MB | 网卡入包pps | nginx 活跃连接 |
| 03:10 | 35 | 2560 | 1200 | 450 |
| 03:14 | 92 | 3800 | 98000 | 6200 |
| 03:16 | 88 | 3920 | 85000 | 5800 |
• 分析:03:14 时网卡入包突增至 98k pps,配合活跃连接暴涨,说明可能为流量型攻击或突发爬虫。
5. 网络层与连接分析技巧
• 查看端口连接:ss -tnp | grep 9000 可查看 PHP-FPM 的连接状态。
• tcpdump 抓包:tcpdump -i eth0 host 203.0.113.45 and port 80 -c 1000 保存 pcap 供离线分析。
• netstat 示例:ESTABLISHED 数量骤增、TIME_WAIT 过多说明连接短时内高并发。
• SYN 洪泛检查:使用 ss -s 查看 TCP 状态分布,若 SYN 数量异常高需怀疑SYN Flood。
• 建议:对可疑 IP 做 tshark 统计来源国别与请求URL分布,用以判断是否攻击。
6. 应用层日志与性能排查
• PHP-FPM 日志:查看 slowlog,超过 3s 的请求应记录并分析。
• SQL 慢查询:启用 MySQL slow query log,示例:SELECT COUNT(*) FROM orders WHERE created_at > ... 导致表锁。
• Nginx 配置检查:worker_connections 与 worker_processes 是否满足并发需求。
• 连接池问题:后端连接池耗尽(如 MySQL max_connections 达上限)会返回 502/504。
• 优化点:开启 opcache、调整 php-fpm pm.max_children、使用 persistent DB 连接池或读写分离。
7. 针对DDoS与恶意流量的防护策略
• 阿里云 Anti-DDoS:建议对外网绑定实例开启“先知式防护”并购买按需清洗流量包。
• CDN 层防护:把静态资源全部上 CDN,启用缓存与访问控制降低源站压力。
• 访问频率限制:在 nginx 或 WAF 写 limit_req、limit_conn 规则限制单 IP 并发与 QPS。
• 黑白名单与地理封禁:对异常来源国或 ASN 做临时封禁。
• 自动化响应:结合云监控告警,触发脚本临时调整安全组或下发 ipset 黑名单。
8. 案例复盘:真实事件与处置流程
• 事件概述:2026-04-12 03:12 左右,某电商 API 在促销期出现 502 并伴随访问延迟上升。
• 发现过程:通过监控告警与 nginx error.log 定位到大量 upstream prematurely closed connection。
• 进一步排查:tcpdump 发现大量来自同一 /24 段的短小请求,pps 高达 90k。
• 处置措施:临时在阿里云控制台开启 Anti-DDoS 高级清洗,CDN 缓存 TTL 加大,nginx 开启 limit_req 并将可疑 IP 加入安全组拒绝。
• 结果:10 分钟内流量回落,502 错误率恢复正常,事后总结是 Layer7 攻击结合未优化的后端连接池导致。
9. 日后防护与运维建议
• 建议1:生产环境流量基线建模,设置多级阈值告警(流量、pps、活跃连接、5xx 比率)。
• 建议2:静态资源强制走 CDN,动态请求使用负载均衡(SLB)与多可用区部署。
• 建议3:配置自动化脚本在触发条件下扩容带宽/实例或切换到备用机房。
• 建议4:定期压测(ab/ wrk)验证 nginx 与后端的并发承载能力。
• 建议5:事件演练与日志归档,结合 ELK/Prometheus+Grafana 建立可视化报警与事件说明文档。
10. 常用命令清单与总结
• 快速排查:tail -n 500 /var/log/nginx/error.log;tail -n 200 /var/log/nginx/access.log。
• 连接与抓包:ss -tnp;netstat -s;tcpdump -i eth0 -w /tmp/capture.pcap。
• 系统资源:top/htop、iostat -xz 1、sar -n DEV 1 3。
• 配置调整建议:php-fpm pm = dynamic/ondemand,调整 pm.max_children = 50;nginx worker_connections = 4096(视内核与 ulimit 调整)。
• 总结:快速定位需结合日志、监控与抓包,合理利用 CDN 与云厂商防护产品,并在事前通过容量规划与自动化完成防护准备。
来源:阿里云香港服务器异常日志分析与定位技巧分享