Published on

nginx 설정 리로드 쉽게 하는 법

Authors
  • avatar
    Name
    Indo Yoon
    Twitter

nginx 설정 리로드는 설정 파일을 고친 뒤 프로세스를 내리지 않고 반영하는 작업이에요. 순서는 늘 같아요. 설정 백업, nginx -t로 문법 검사, nginx -s reload 또는 systemctl reload nginx 실행, 그리고 로그와 실제 응답 확인이에요. 이 글은 그 순서를 그대로 따라 할 수 있게 정리하고, 리로드가 조용히 실패했을 때 무엇이 일어나는지까지 다뤄요.

한눈에 보기

  • 설정 값만 바꿨다면 리로드로 충분해요. 프로세스를 완전히 내렸다 올리는 재시작은 바이너리를 교체했거나 프로세스가 비정상일 때 꺼내는 카드로 남겨두세요.
  • 리로드 전에는 반드시 nginx -t를 돌려요. 문법 오류가 있는 설정은 적용되지 않고, nginx는 이전 설정으로 계속 요청을 처리해요.
  • 리로드 후에는 에러 로그와 실제 응답을 함께 확인해요. 문법은 맞는데 동작이 다른 경우가 생각보다 흔해요.
  • 배포 스크립트에 넣을 때는 검사와 리로드를 한 쌍으로 묶어요. 검사 없이 리로드만 호출하는 스크립트는 실패를 감지하지 못해요.

리로드와 재시작은 무엇이 다른가요

nginx는 마스터 프로세스와 워커 프로세스로 역할이 나뉘어 있어요. 마스터는 설정 파일을 읽고 워커를 만들고 관리하며, 실제 클라이언트 요청은 워커가 처리해요. 리로드는 마스터에게 설정을 다시 읽으라는 신호를 보내는 일이고, 재시작은 프로세스 전체를 내렸다가 다시 올리는 일이에요.

리로드 신호를 받은 마스터는 새 설정을 읽어 새 워커를 띄워요. 새 워커가 요청을 받기 시작하면 기존 워커에게는 종료를 알리고, 기존 워커는 처리 중이던 요청을 끝낸 뒤 사라져요. 그래서 일반적인 웹 트래픽에서는 연결이 끊기지 않아요. 반면 재시작은 그런 인수인계 없이 프로세스를 내리기 때문에, 타이밍에 따라 처리 중인 요청이 끊길 수 있어요.

항목리로드 (nginx -s reload)재시작 (systemctl restart nginx)
하는 일마스터가 설정을 다시 읽고 새 워커를 띄움프로세스를 완전히 종료한 뒤 다시 실행
처리 중인 요청기존 워커가 끝까지 처리시점에 따라 끊길 수 있음
설정이 잘못된 경우적용을 거부하고 이전 설정으로 계속 동작서비스가 내려갈 수 있음
주로 쓰는 때설정 값만 바꿨을 때바이너리 교체, 프로세스 비정상, 리로드가 먹히지 않을 때
서비스 중단사실상 없음짧게 발생

단계별로 리로드하는 방법

1. 지금 설정을 백업해요

수정 전 파일을 복사해 두면 되돌리기가 쉬워요. nginx.conf와 conf.d, sites-available처럼 include로 묶인 디렉터리를 함께 복사하는 게 좋아요. 이름에 날짜를 붙여 두면 나중에 어떤 변경이 문제였는지 추적하기도 편해요. 설정을 형상 관리 저장소에 올려 두었다면 커밋 하나로 백업을 대신해도 충분해요.

2. nginx -t로 문법을 검사해요

nginx -t는 설정 파일을 실제로 읽어 문법과 기본적인 경로를 확인해요. 문제가 없으면 syntax is ok와 test is successful 메시지를 출력해요. 운영 중인 설정과 다른 파일을 검사하려면 nginx -t -c /경로/nginx.conf처럼 파일을 지정해요. include까지 펼친 전체 설정을 눈으로 확인하고 싶다면 nginx -T를 쓰면 돼요.

이 검사는 어디까지나 문법 검사예요. 인증서 파일 경로나 권한 문제는 여기서 걸리기도 하지만, 업스트림 주소의 오타나 백엔드가 죽어 있는 상황은 통과해요. 그래서 검사를 통과했다고 반영 후 확인을 생략하면 안 돼요.

3. 리로드를 실행해요

systemd로 관리한다면 systemctl reload nginx가 가장 무난해요. 유닛 파일에 정의된 reload 동작을 실행하는데, 배포판 기본 유닛은 보통 마스터 프로세스에 HUP 신호를 보내거나 nginx -s reload를 호출해요. 직접 신호를 보내려면 nginx -s reload를 쓰면 되고, 이 명령은 pid 파일을 읽어 마스터에게 신호를 전달해요. pid 파일 위치가 기본과 다르면 nginx -s reload -c /경로/nginx.conf처럼 설정 파일을 함께 지정해요.

nginx -s reload는 nginx가 이미 실행 중이어야 동작해요. 프로세스가 없거나 pid 파일 경로가 어긋나 있으면 신호를 보내지 못하고 오류만 남아요. 컨테이너처럼 포그라운드로 띄운 환경에서는 pid 파일 경로가 이미지마다 다를 수 있으니 한 번 확인해 두세요.

4. 반영 결과를 확인해요

리로드 명령은 조용히 끝나는 경우가 많아요. 그래서 에러 로그를 보는 습관이 중요해요. journalctl -u nginx나 /var/log/nginx/error.log에서 새로 찍힌 경고를 확인해요. 그다음 실제 요청을 보내 응답 코드와 헤더, 업스트림 동작이 의도대로인지 봐요. 프록시 설정을 바꿨다면 백엔드까지 요청이 도달하는지도 함께 확인해요.

상황별 선택 가이드

systemd로 관리하는 서버

systemctl reload nginx를 쓰세요. 서비스 상태와 로그를 한곳에서 볼 수 있어서 문제 추적이 쉬워요. systemctl reload-or-restart nginx도 있는데, 이건 reload가 실패하면 restart로 넘어가요. 무중단이 중요한 서비스라면 의도치 않은 중단이 생길 수 있으니 그냥 reload를 쓰는 편이 안전해요.

직접 컴파일해서 쓰는 서버

nginx -s reload -c /경로/nginx.conf로 설정 파일을 명시하거나, pid 파일을 확인한 뒤 kill -HUP $(cat /run/nginx.pid) 형태로 신호를 보내요. 패키지 설치가 아니라서 pid 경로와 실행 사용자가 기본값과 다를 수 있어요.

컨테이너 환경

docker exec <컨테이너> nginx -t로 검사하고 docker exec <컨테이너> nginx -s reload로 반영해요. 호스트에서 신호만 보내려면 docker kill -s HUP <컨테이너>를 쓸 수 있어요. 다만 설정을 이미지에 포함해 배포하는 구조라면 리로드보다 새 이미지로 교체하는 쪽이 자연스러워요.

쿠버네티스 ingress

ConfigMap이나 Ingress 리소스를 바꾸면 컨트롤러가 변경을 감지해 설정을 다시 만들고 리로드하는 구조예요. 파드 안에 들어가 직접 리로드하기보다 매니페스트를 고치는 쪽이 맞아요. 파드에 직접 손을 대면 다음 재배포에서 사라져요.

배포 파이프라인

검사와 리로드를 한 쌍으로 넣어요. 설정 관리 도구를 쓴다면 설정 파일이 바뀌었을 때만 리로드가 실행되도록 핸들러를 걸어두는 방식이 흔해요. 배포 로그에 검사 결과와 리로드 시각을 남겨 두면 나중에 원인을 좁히기 쉬워요.

주의할 점

  • nginx -s reload는 신호만 보내요. 문법 오류가 있어도 명령 자체는 성공으로 끝날 수 있어서, 종료 코드만 믿으면 실패를 놓쳐요.
  • 리로드가 거부되면 nginx는 이전 설정으로 계속 동작해요. 서비스는 살아 있지만 변경은 반영되지 않은 상태이니, 로그 확인을 자동화해 두는 게 좋아요.
  • 배포 방식이 릴리스 디렉터리와 심볼릭 링크를 바꾸는 구조라면, 링크를 바꾼 뒤에 리로드해야 실제로 새 설정이 읽혀요.
  • 로그 파일을 교체했다면 리로드가 아니라 nginx -s reopen으로 파일 핸들을 다시 열어야 해요. logrotate 설정의 postrotate에 이 명령이 들어가는 이유예요.
  • 리스닝 포트를 바꾸는 경우 마스터가 새 소켓을 열어요. 이미 다른 프로세스가 그 포트를 잡고 있으면 실패하니 사전에 확인해요.
  • 리로드 순간에는 새 워커와 기존 워커가 함께 떠 있어요. 그래서 메모리 사용량이 잠시 올라갈 수 있어요.
  • nginx 바이너리를 교체하는 경우는 리로드가 아니라 무중단 업그레이드 절차를 따라야 해요. 커널 수준 설정이나 일부 모듈도 재시작이 필요해요.

자주 묻는 질문

nginx -s reload와 systemctl reload nginx는 같은 건가요?

결과는 같아요. systemctl reload는 유닛 파일에 정의된 명령을 실행하는데, 배포판 기본 유닛은 보통 마스터에 HUP 신호를 보내는 방식이에요. systemd로 관리 중이라면 서비스 상태와 로그를 함께 볼 수 있어서 reload 쪽을 권해요.

리로드했는데 설정이 그대로인 것 같아요.

가장 흔한 원인은 다른 파일을 고쳤거나 include가 걸리지 않은 경우예요. nginx -T로 실제로 읽힌 설정을 확인해 보세요. 리로드가 거부되었다면 에러 로그에 이유가 남아 있고, 그 시점에는 이전 설정이 그대로 동작하고 있어요.

리로드 중에도 요청이 끊기지 않나요?

일반적인 HTTP 요청은 끊기지 않아요. 마스터가 새 워커를 먼저 띄우고 기존 워커는 처리 중인 요청을 마친 뒤 종료하기 때문이에요. 다만 스트리밍이나 웹소켓처럼 오래 유지되는 연결은 기존 워커가 정리되는 시점에 끊길 수 있어요.

설정에 오류가 있으면 nginx가 멈추나요?

멈추지 않아요. 리로드 단계에서 새 설정을 적용하지 않고 이전 설정으로 계속 동작해요. 문제는 이 동작이 조용하다는 점이에요. 배포는 성공한 것처럼 보이는데 실제로는 반영되지 않았을 수 있으니 로그 확인을 자동화해 두세요.

컨테이너 안에서는 어떻게 하나요?

docker exec로 컨테이너에 들어가 nginx -t와 nginx -s reload를 차례로 실행하면 돼요. 호스트에서 신호만 보내려면 docker kill -s HUP를 쓸 수 있어요. 설정을 이미지에 굽는 구조라면 리로드보다 이미지 교체가 자연스러워요.

출처

리로드 절차를 손에 익혔다면 다음은 무중단 배포 쪽이에요. 업스트림 서버를 순차적으로 빼고 넣는 방식을 정리한 nginx 업스트림 무중단 배포 순서와, 프록시 뒤에서 헬스 체크를 설계하는 nginx 헬스 체크 운영 기준을 함께 읽어 보세요.