실행중인 프로세스에서 nginx 구성을 덤프 하시겠습니까?


42

분명히, 나는 응용 프로그램을 디버깅하려고 잠들지 않는 밤을 보내지 않아야했습니다. 내 nginx를 다시 시작하고 구성 파일이 비어 있음을 발견했습니다. 나는 그것을 자르는 것을 기억하지 않지만, 뚱뚱한 손가락과 관심이 줄어 들었을 것입니다.

해당 구성 파일의 백업이 없습니다. 나는 내가 그것을 만들어야한다는 것을 안다.

나에게 좋습니다, 현재 nginx 데몬이 여전히 실행 중입니다. 나중에 이해할 수있는 구성 파일로 구성을 덤프하는 방법이 있습니까?

답변:


53

실행중인 프로세스의 메모리 영역을 덤프하려면 gdb가 설치되어 있어야합니다.

# Set pid of nginx master process here
pid=8192

# generate gdb commands from the process's memory mappings using awk
cat /proc/$pid/maps | awk '$6 !~ "^/" {split ($1,addrs,"-"); print "dump memory mem_" addrs[1] " 0x" addrs[1] " 0x" addrs[2] ;}END{print "quit"}' > gdb-commands

# use gdb with the -x option to dump these memory regions to mem_* files
gdb -p $pid -x gdb-commands

# look for some (any) nginx.conf text
grep worker_connections mem_*
grep server_name mem_*

"이진 파일 mem_086cb000 일치"와 같은 것을 얻을 수 있습니다. 편집기에서이 파일을 열고 config (예 : "worker_connections"지시문), 복사 및 붙여 넣기를 검색하십시오. 이익!

업데이트 :이 방법은 완전히 신뢰할 수있는 것은 아닙니다. nginx 프로세스가 구성을 읽고 나중에이 메모리 영역을 덮어 쓰거나 재사용하지 않는다는 가정을 기반으로합니다. 마스터 nginx 프로세스는 우리가 추측 할 수있는 최고의 기회를 제공합니다.


2
고마워, 그러나 이것은 나에게 너무 하드 코어입니다. 나는 :) 처음부터 설정 파일을 다시 작성합니다
세르지오 Tulentsev

1
mmap 파일은 ope 파일 핸들을 의미합니다. 하나 복구하는 쉬운 방법을 참조하십시오 serverfault.com/questions/45237/link-to-a-specific-inode
제프 Ferland

@JeffFerland nginx는 구성 파일을 위해 열린 fd를 유지하지 않습니다.
kupson

예, 대부분의 응용 프로그램은 언급을 포함하기 위해 내 의견을 편집 한 것으로 생각하지 않습니다. 죄송합니다.
Jeff Ferland

1
이 하드 코어 느낌! 저는 공식적으로 해커입니다. 설정을 찾기 위해 메모리를 읽는다. @kupson
adriaan의

12

이 요청에는 도움이되지 않지만 같은 이유로 다른 사용자가 여기에 도달하는 데 도움이 될 수 있습니다. 최신 nginx 버전에는 메모리가 아닌 모든 nginx 구성 파일에서 읽은 nginx 구성을 덤프하는 -T 옵션이 있습니다 .

nginx -T

구성 파일을 읽고 있는지 확인하거나 다른 서버와 비교하거나 구성을 검색하는 데 유용 할 수 있습니다.

다시 말하지만, 이것은 실행중인 프로세스에서 구성을 덤프하지 않으며 새로운 프로세스 만로드합니다.


2

ngx_conf_t는 구성 구문 분석에 사용되는 구조 유형입니다. 구성 구문 분석 중에 만 존재하며 구성 구문 분석이 완료된 후에는 액세스 할 수 없습니다.


2
nginx에는 그러한 기능이 구현되어 있지 않기 때문에 '분명히'액세스 할 수 없습니다. 다른 프로그램에는 postconf -nPostfix 또는 exim -bPExim 또는 testparm -vSamba 등 의 (잘못 명명 된) 등의 시설이 있습니다 .
Josip Rodin

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.