1. 为什么我们需要关注Nginx连接数?

想象一下你经营着一家24小时营业的餐厅,突然发现顾客排队时间变长,后厨出餐速度下降。这时候你会查看当前的就餐人数、等待人数和厨师的工作状态。在Web服务器领域,Nginx的连接数就相当于这个餐厅的实时运营数据。通过监控连接数,我们可以:

  • 发现突发流量冲击
  • 识别DDoS攻击迹象
  • 优化服务器资源配置
  • 排查性能瓶颈
  • 预防服务器过载宕机

2. 基础诊断工具:netstat命令

(技术栈:Linux系统工具)

# 统计所有Nginx工作进程的TCP连接状态
sudo netstat -antp | grep nginx | awk '{print $6}' | sort | uniq -c

# 输出示例:
#   15 ESTABLISHED
#   3 TIME_WAIT
#   2 SYN_RECV
#   8 LISTEN

# 分解说明:
# -a:显示所有连接
# -n:禁用域名解析(加快速度)
# -t:仅显示TCP连接
# -p:显示进程信息
# grep nginx:过滤Nginx进程
# awk提取连接状态列
# sort | uniq -c 统计各状态数量

应用场景:快速检查服务器整体连接状况,适合临时诊断和初步排查

优缺点分析

  • ✅ 优点:无需额外安装,系统自带工具
  • ❌ 缺点:性能消耗较大,不适合高频监控

3. 高效替代方案:ss命令

(技术栈:Linux系统工具)

# 实时统计Nginx连接状态(每秒刷新)
watch -n 1 "ss -s | grep -A1 'TCP:'"

# 输出示例:
# TCP:   85 (estab 45, closed 30, orphaned 0, timewait 10)

# 扩展命令:按连接状态分类统计
ss -nt sport = :80 | awk '{print $1}' | sort | uniq -c

# 命令解析:
# -n:数字格式显示
# -t:TCP协议
# sport = :80:指定源端口为80
# 后续处理与netstat类似

注意事项

  • ss命令比netstat效率高3-5倍
  • 生产环境建议使用ss替代netstat
  • 搭配watch命令可实现准实时监控

4. Nginx原生方案:stub_status模块

(技术栈:Nginx官方模块)

配置步骤

# 在nginx.conf的server块中添加
location /nginx_status {
    stub_status;
    allow 192.168.1.0/24;  # 限制内网访问
    deny all;              # 禁止外部访问
    access_log off;        # 不记录访问日志
}

访问效果

Active connections: 291 
server accepts handled requests
 1456789 1456789 21234567 
Reading: 6 Writing: 3 Waiting: 282

指标解析

  • Active connections:当前活跃连接总数
  • Reading:正在读取请求头的连接数
  • Writing:正在发送响应的连接数
  • Waiting:保持活跃的空闲连接

高级技巧

# 自动化监控脚本
while true; do
    curl -s http://localhost/nginx_status | grep 'Active connections'
    sleep 1
done

# 输出示例:
# Active connections: 291
# Active connections: 305
# Active connections: 287

5. 日志分析法:定制化连接跟踪

(技术栈:Nginx日志系统)

# 修改nginx日志格式
log_format connection_tracking '$remote_addr - $connection/$connection_requests';

# 在server块中应用自定义日志
access_log /var/log/nginx/connection.log connection_tracking;

日志示例

192.168.1.10 - 123456/3
192.168.1.11 - 123457/1
192.168.1.12 - 123458/5

数据分析

# 统计每个连接的请求次数
awk '{print $5}' /var/log/nginx/connection.log | cut -d'/' -f2 | sort -n | uniq -c

# 输出示例:
#   1200 1
#    356 2
#     89 3-5
#     12 >5

6. 可视化方案:GoAccess实时仪表盘

(技术栈:GoAccess工具)

# 实时监控模式启动命令
goaccess /var/log/nginx/access.log -o /var/www/html/report.html --real-time-html

# 关键监控指标:
# - 并发连接数趋势图
# - 请求速率变化曲线
# - 客户端地理分布
# - HTTP状态码比例

部署技巧

  1. 配置Nginx代理访问报表页面
  2. 设置定时日志切割(避免文件过大)
  3. 集成报警阈值通知功能

7. 应用场景深度剖析

案例一:电商大促备战

  • 使用stub_status模块建立基线数据
  • 配置Zabbix进行阈值报警(连接数>5000触发扩容)
  • 结合历史日志预测资源需求

案例二:遭受CC攻击应急响应

  1. 通过ss命令发现异常SYN_RECV激增
  2. 快速分析access_log定位攻击源IP
  3. 使用iptables实施临时封禁
  4. 配置Nginx连接限制规则

8. 技术方案优劣对比

方法 实时性 精度 资源消耗 实施难度
netstat ★★☆☆☆
ss ★★★☆☆
stub_status 极高 极低 ★★★★☆
日志分析 延迟 ★★★★☆
可视化工具 ★★★★★

9. 关键注意事项

  1. 安全防护:状态接口必须做好访问控制
  2. 数据解读:区分正常业务增长和异常流量
  3. 性能影响:高频率监控要评估资源消耗
  4. 环境差异:容器化部署需要调整监控策略
  5. 趋势分析:单点数据不如趋势数据有价值

10. 专家级优化建议

  • 结合TCP协议栈参数调整:
# 优化内核参数(/etc/sysctl.conf)
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_tw_reuse = 1
  • 配置Nginx连接限制模块:
limit_conn_zone $binary_remote_addr zone=addr:10m;
limit_conn addr 100;

11. 技术总结

通过本文介绍的五种方法,我们构建了从命令行工具到可视化监控的完整解决方案。在实际生产环境中,推荐采用分层监控策略:

  1. 日常运维使用stub_status+Prometheus
  2. 问题排查时使用ss命令快速诊断
  3. 安全审计采用日志深度分析
  4. 容量规划依赖历史趋势数据