业务架构图:

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. redis基础和通用key操作

    redis是什么? redis开源的,构建于内存的数据结构的nosql数据库.常被用于数据存储,缓存处理和消息处理. redis的优势? 1.极高的读写能力 2.丰富的数据类型 3.原子性操作 4.支 ...

  2. Java 多态方法构造器执行方法

    我们参考下面这个例子: 读者可以提前考虑一下,这段程序的输出会是什么. public class Polymorphism { /** * 创建一个类A * 该类中有一个方法draw,以及一个构造方法 ...

  3. OpenCV尺寸调整

    #include<cv.h> #include<highgui.h> int main(int argc, char** argv) { IplImage* img = cvL ...

  4. [STL] 遍历删除两个vector中交集

    #include <vector> #include <string> #include <algorithm> using namespace std; int ...

  5. 【python】python各种类型转换-int,str,char,float,ord,hex,oct等

    [python] int(x [,base ])         将x转换为一个整数 long(x [,base ])        将x转换为一个长整数 float(x )             ...

  6. MSSQL事务在C#程序端的使用

    拼接成一条SQL执行 优点:简单,容易看懂: 缺点:某些场合,涉及的业务较多,在同一SQL处理显得太冗长,复杂,不利于解耦. 使用细节 在方法之间传递参数,确保多个方法中的SQL都是使用同一个事务的( ...

  7. 【ZJ选讲·画山】

    给出一张纸(N × M),你要在上面画山,但不能画出界(N,M<=100) Like this: 起点为(0,0),终点为(N,0) 给出w种线段画法(x,y),表示用了这种画法后,笔迹末 ...

  8. [hdu 2586]lca模板题(在线+离线两种版本)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 在线版本: 在线方法的思路很简单,就是倍增.一遍dfs得到每个节点的父亲,以及每个点的深度.然后 ...

  9. Codeforces Round #525 (Div. 2)D. Ehab and another another xor problem

    D. Ehab and another another xor problem 题目链接:https://codeforces.com/contest/1088/problem/D Descripti ...

  10. 带依赖包的maven打包配置

    转载自:http://outofmemory.cn/code-snippet/2594/carry-yilai-bao-maven-dabao-configuration 可以在maven的packa ...