붉은거위 노트 (redgoose note)

현재 돌아가고있는 nginx의 설정을 덤프받아오기

Nest
Development
Category
Server
Hit
1087
Star
1

nginx 설정을 변경하는 쉘스크립트를 작성하다가 백업하지도 않은 상태의 nginx.conf 파일이 수정되어 버렸다.
삭제되지 않은채 파일의 내용이 변경되거나 덮어씌어지면 복구에는 답이없을거라고 생각해서 어찌할줄 모르다가 아직 서버는 nginx가 돌아가고 있어서 돌아가고 있는 nginx의 설정값을 가져올 수 있지 않을까 생각해서 찾아보게 되었다.

구글에서 nginx config memory dump 키워드로 검색해보고 같은 문제를 겪는 스택 오버플로우의 글을 발견했다. 거기에 물론 해결책도 달려져 있다.

https://serverfault.com/questions/361421/dump-nginx-config-from-running-process

기록을 위하여 재 정리를 해본다.

주의할점은 nginx가 실행중이고 만약 새로 시작하거나 reload를 하면 복구할 수 있는지는 보장할 수 없다.

pid 알아내기

먼저 master nginx process으로 열려진 pid번호를 알아내야 한다. 다음 명령을 실행하면 pid 목록이 출력된다.

$ ps auxw | grep nginx

목록에서 우측 설명칼럼에서 master process 단어가 있는 라인이며 두번째 칼럼의 숫자가 pid이다.

메모리 덤프할 수 있는 쉘 스크립트 만들기

메모리 덤프를 하면 많은 파일들이 만들어지기 때문에 빈 디렉토리를 하나 만들고 그 안에 쉘 스크립트를 작성해서 실행하는것을 추천한다.

$ nano ~/actions/dump.sh

위와같이 실행하여 에디터로 들어가서 다음과 같이 작성한다. {PID}부분을 찾아서 이전 섹션에서 알아냈던 pid로 변경한다.

# Set pid of nginx master process here
pid={PID}

# 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_로 시작되는 파일들이 많이 만들어지는것을 확인할 수 있다. 만약 없으면 뭔가 문제가 있다는 의미다.

~/actions/dump.sh

mem_파일들중에 맨 마지막 파일부터 열어본다. 아마도 가장 최근 내용일 것이다.
내용을 확인해보면 많은양의 텍스트와 컴파일되어있는 알수없는 글자들이 많아서 텍스트에디터가 버벅였다. 일일히 스크롤해가면서 찾아보기엔 너무 양이 많기때문에 기억을 더듬어서 유니크하게 사용할만한 단어로 검색하니 conf파일의 내용이 그대로 보관되어있다.

설정값의 첫 부분은 소스코드와 붙어있기 때문에 시작점이 위쪽줄을 잘 확인해봐야 한다.

END

설정값이 날라갈뻔해서 정말로 난감했었는데 많은 시간을 들였지만 설정값을 새로 작성하느라 일요일을 날려먹을뻔 했다. ㅠ_ㅠ
그냥 차라리 서버에 있는 설정값도 스케쥴링 백업을 하던지 git으로 관리하는게 나을지도..;