从运行中的 Nginx 提取配置信息

背景

由于某疑似计划删库跑路的同学的骚操作,导致测试服务器上 Nginx 配置文件(/etc/nginx/conf.d) 被直接删除……一番骚操作试图恢复无果后,日子就在“只要我不重启服务,尴尬的就不是我”的平静中安详的度过,直到……我需要重启服务器……

目标

  1. 前提条件:

    1. Nginx 的配置文件内容已被破坏或覆盖,文件无法恢复
    2. Nginx 服务并未重启或重新读取新的配置内容
  2. 设法在不停止当前 Nginx 服务的前提下,提取运行中的 Nginx 正在使用的配置内容并恢复到文本文件

基本原理

参考资料

思路描述

  1. 在服务器确认 nginx 相关的进程并获取 pid
  2. 根据 pid 定位进程内存映射
  3. nginx 配置内容通常存储在进程的堆栈中([heap]),使用 gdb dump 从内存中提取该部分数据到文件
  4. 打印配置内容,并通过正则进行提取

代码实现(基于 Shell)

#! /bin/bash
### 用于扫描 Nginx 进程并从中反向分析配置

BASE_WORK_DIR=$(cd `dirname "${BASH_SOURCE[0]}"` && pwd)
SCAN_DIR=${BASE_WORK_DIR}/analysisdir
SCAN_RESULT_FILE=${SCAN_DIR}/scanresult.txt
RESULT_DIR=${BASE_WORK_DIR}/resultdir

if [[ -d ${SCAN_DIR} ]]; then
    rm -rf ${SCAN_DIR}
fi

if [[ -d ${RESULT_DIR} ]]; then
    rm -rf ${RESULT_DIR}
fi
mkdir ${RESULT_DIR} && mkdir ${SCAN_DIR} && cd ${SCAN_DIR}
ps -ef | grep nginx | grep master | awk -F" " '{print $2}' | while read pid; do
  workdir=${SCAN_DIR}/${pid}
  mkdir ${workdir} && cd ${workdir}
  # 生成 gdb 指令文件: dump memory
  cat /proc/${pid}/maps | awk '$6 == "[heap]" {split ($1,mem_address,"-"); print "dump memory " $1 ".memo 0x" mem_address[1] " 0x" mem_address[2] ;}END{print "quit"}'> gdb-commands
  gdb -p ${pid} -x gdb-commands
done

后续分析处理

获取文件后,可以做如下分析:

  1. 用 NotePad++ 打开并搜索 /etc/nginx/conf.d ,如果有记录则复制完整内容,到新的NotePad++空白页粘贴

  2. 将粘贴后的内容复制到 Sublime 中开始处理;

  3. 用正则替换:

    1. 搜索: (/etc/nginx/conf.d/[^\.]+\.conf) \1.+?server {
    2. 替换为:\n\n--> \1\nserver {
  4. 对结果文档进行人工判断,删除无用部分即可

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容