业务架构图:

nginx 状态监控图:

本次故障的表现为:前端php页面无法打开,空白页或者502错误。

nginx中php配置如下:

location ~ \.php$ {
root /xxx/xxx;
fastcgi_pass unix:/dev/shm/php-cgi.sock;
fastcgi_index index.php;
include fastcgi.conf;
access_log logs/fastcgi.log ngx_Web_log;
}

首先查看 logs/fastcgi.log 如下:

统计nginx和php交互状态码如下:

   总数    状态码

可以发现日志里大量的出现了499的状态码,百度说明:

nginx源码:

/*
* HTTP does notdefine the code for the case when a client closed
* the connectionwhile we are processing its request so we introduce
* own code to logsuch situation when a client has closed the connection
* before we even tryto send the HTTP header to it
*/
#define NGX_HTTP_CLIENT_CLOSED_REQUEST 499

这是nginx定义的一个状态码,用于表示这样的错误:服务器返回http头之前,客户端就提前关闭了http连接

简单来说,由于后端服务处理时间过长而导致前端nginx等待超时断开。

查看nginx状态监控图发现active在这个时间段,活动连接一直保持在3000左右,根据经验,日常活动连接数一般在900左右,这次突然上了3000,有可能是攻击所致。

1. 查看网络连接数:netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
    2. 过滤fastcgi.log访问连接ip数量,通过nginx deny禁止掉可疑ip。

经过上面的处理后,活动连接数的变化不是很明显。于是在程序中添加info.php来测试php响应情况。

测试结果:
    重启php-fpm 大概10秒后,就无法再次访问info.php ,大致估计是因为php accept queue 被占满所致。查看一下内核参数是否正常:

# ulimit -n     # 文件最大描述符

# sysctl -a | egrep "tw|backlog|cookies|synack|soconnmax" 

net.core.netdev_max_backlog =          # 程序accept queue队列长度
net.ipv4.tcp_max_syn_backlog = # syn queue 队列长度
net.ipv4.tcp_max_tw_buckets = # 保持 TIME_WAIT 最大值
net.ipv4.tcp_synack_retries = # 服务端发送syn + ack 包次数限制
net.ipv4.tcp_syncookies = # 启用syn cookies,当syn等待队列出现溢出时,启用cookies来处理,可以防范少量的syn攻击
net.ipv4.tcp_tw_recycle = # TIME_WAIT 状态快速回收
net.ipv4.tcp_tw_reuse = # TIME_WAIT 状态快速重用

一些常用的内核参数都是没有问题的。

问题总汇下:
    1. nginx fastcgi.log 大量返回499
    2. nginx 活动连接数远远高于正常业务并发
    3. php 重启很快就失去响应。

这时候发现问题排查起来有点困难了,于是和开发、数据库沟通下。

沟通下来的结果就是:
    早上数据库被DBA调整过。出现过停止服务的状态,而开发人员通过java开发的api是要去连接数据库的。
    请求从nginx进来,通过php去调用java接口,而java接口无法连接上数据库无法将数据返回给php,所以nginx等待超时返回499

沟通后思路清晰了,早上DBA动MySQL没有通知到大家,造成了这一系列连锁反应。可见,通知和沟通是很重要的。

重启java程序,php正常返回结果,业务恢复正常。

最后,做技术不能只是关注技术本身,熟悉业务流程和沟通也是作为运维人员必备的技能。

记录一次lnmp故障报告的更多相关文章

  1. [文档]运维故障报告template

    RCA的基本概念 根本原因分析技术(root cause analysis,RCA). IOWA州立大学质量管理学院认为,很多公司在设备发生故障后,都能够很快修复, 但难以发现故障的根本原因,所以此故 ...

  2. Linux记录-批量安装LNMP(转载)

    #!/bin/bash # Describe: This is a one - button installation service script # 提示:使用此脚本时,尽量先选择第一项配置Yum ...

  3. CM记录-集群运行故障修复记录

    集群运行故障分析(空间不足.时钟误差.状态不良) 调整空间.同步时间.重启 修复后: 各个数据节点容量分布情况

  4. 记录一次redis故障

    ResponseError: MISCONF Redis is configured to save RDB snapshots, but is currently not able to persi ...

  5. 【转载】最强NLP预训练模型!谷歌BERT横扫11项NLP任务记录

    本文介绍了一种新的语言表征模型 BERT--来自 Transformer 的双向编码器表征.与最近的语言表征模型不同,BERT 旨在基于所有层的左.右语境来预训练深度双向表征.BERT 是首个在大批句 ...

  6. Lnmp 源码编译安装、常见错误整理

    简介: Lnmp 环境的搭建还是非常简单的,之前由于博客迁移等原因,导致丢失了好多博文,这次重新整理记录一下. Lnmp 即:Linux .Nginx .Mysql .PHP Lnmp 是一套 Web ...

  7. MAC OS X Yosemite的PyQt4配置记录

    MAC OS X Yosemite的PyQt4配置记录 声明: 1)本报告由博客园bitpeach撰写,版权所有,免费转载,请注明出处,并请勿作商业用途. 2)若本文档内有侵权文字或图片等内容,请联系 ...

  8. beta week 2/2 Scrum立会报告+燃尽图 01

    此作业要求参见https://edu.cnblogs.com/campus/nenu/2019fall/homework/9954 一.小组情况 队名:扛把子 组长:孙晓宇 组员:宋晓丽 梁梦瑶 韩昊 ...

  9. 商汤开源的mmdetection技术报告

    目录 1. 简介 2. 支持的算法 3. 框架与架构 6. 相关链接 前言:让我惊艳的几个库: ultralytics的yolov3,在一众yolov3的pytorch版本实现算法中脱颖而出,收到开发 ...

随机推荐

  1. Browser-Solidity的本地安装及使用介绍

    Browser-Solidity的本地安装及使用介绍 正所谓工欲善其事必先利其器,巧妇也难为无米之炊,所以在学习智能合约之前,必须要先把工具准备好.Browser-Solidity 是 Ethereu ...

  2. DFS(2)——hdu1241Oil Deposits

    一.题目回顾 题目链接:Oil Deposits 题意:给你一块网格,网格被分为面积相等的地块,这些地块中标记'@'的是油田,标记'*'的不是油田.已知一块油田与它上下左右以及对角线的油田同属一片油区 ...

  3. Asp.Net生命周期系列一

    Asp.Net生命周期对于初级甚至中级程序员来说,一直都是一个难题,很多程序员不了解生命周期,导致使用Asp.Net做开发感觉很不灵活,感觉太多东西被微软封装好了,我们不能改变,其实只要你稍微了解一下 ...

  4. Delphi中动态创建窗体有四种方式

    Delphi中动态创建窗体有四种方式,最好的方式如下: 比如在第一个窗体中调用每二个,主为第一个,第二个设为动态创建 Uses Unit2; //引用单元文件 procedure TForm1.But ...

  5. 安装与配置JDK

    第一步:下载jdk-7-linux-i586.tar.gzwget -c http://download.oracle.com/otn-pub/java/jdk/7/jdk-7-linux-i586. ...

  6. jloi2017(shoi2017?)六省联考酱油记

    Day -n 听说了4.22.4.23的省选,而且还是六省联考. 压力山大. 尽管我只是一名高一的simple OIer,在省选到来之前,心里还是很紧张的. 毕竟自己也知道南方dalao们都是神犇,像 ...

  7. TCP/IP Note3

    TCP/IP协议 TCP/IP是不同的通信协议的大集合. 协议族:TCP/IP是基于TCP和IP这两个最初的协议之上的不同的通信协议的大集合. 1. TCP - 传输控制协议 TCP用于从应用程序到网 ...

  8. BZOJ1115 [POI2009]石子游戏Kam 【博弈论——阶梯游戏】

    题目 有N堆石子,除了第一堆外,每堆石子个数都不少于前一堆的石子个数.两人轮流操作每次操作可以从一堆石子中移走任意多石子,但是要保证操作后仍然满足初始时的条件谁没有石子可移时输掉游戏.问先手是否必胜. ...

  9. C++——设计与演化——读书笔记

    <<c++设计与演化>>1.c++的保护模式来自于访问权限许可和转让的概念; 初始化和赋值的区分来自于转让能力的思考; c++的const概念是从读写保护机制中演化出来. 2. ...

  10. JavaScript词法作用域与调用对象

    关于 Javascript 的函数作用域.调用对象和闭包之间的关系很微妙,关于它们的文章已经有很多,但不知道为什么很多新手都难以理解.我就尝试用比较通俗的语言来表达我自己的理解吧. 作用域 Scope ...