← 전체 글로 돌아가기

서버 운영

Nginx access 로그로 요청이 실제로 오는지 확인하는 방법

배포 후 응답이 이상하거나 트래픽이 예상대로 오는지 모를 때 Nginx access 로그를 실시간으로 보면 빠르게 파악할 수 있다.

서버를 새로 설정하거나 리버스 프록시를 바꾼 뒤 요청이 제대로 들어오는지 확인하고 싶을 때, 가장 직접적인 방법은 Nginx access 로그를 실시간으로 보는 것이다.

access 로그 위치

기본 설치 기준으로 Nginx의 access 로그는 여기에 있다.

/var/log/nginx/access.log

가상 호스트를 설정한 경우 각 서버 블록에 access_log 지시자가 따로 지정돼 있을 수 있다.

server {
    server_name example.com;
    access_log /var/log/nginx/example.access.log;
}

어디에 있는지 모르면 아래로 찾는다.

grep -r 'access_log' /etc/nginx/

실시간으로 보는 방법

sudo tail -f /var/log/nginx/access.log

-f 옵션은 파일에 새 줄이 추가될 때마다 화면에 출력한다. 브라우저에서 페이지를 열거나 curl로 요청을 보내면 바로 줄이 찍히는 걸 볼 수 있다.

특정 경로 요청만 보고 싶으면 grep을 붙인다.

sudo tail -f /var/log/nginx/access.log | grep '/api/'

로그 한 줄이 의미하는 것

기본 로그 형식(combined)은 이렇게 생겼다.

1.2.3.4 - - [01/Jun/2024:12:34:56 +0900] "GET /api/posts HTTP/1.1" 200 1234 "-" "curl/8.1.2"
위치의미
1.2.3.4요청자 IP
[01/Jun...]요청 시각
"GET /api/posts HTTP/1.1"메서드, 경로, 프로토콜
200응답 상태 코드
1234응답 바이트 수
마지막 큰따옴표User-Agent

상태 코드가 502면 upstream(백엔드)이 응답하지 않는 것이고, 404면 Nginx 설정에서 해당 경로를 처리하는 location 블록이 없는 것이다.

요청이 아예 안 오는 경우

tail -f를 켜두고 브라우저에서 접속해도 아무것도 찍히지 않는다면 Nginx 앞단 문제다.

# Nginx가 실행 중인지
sudo systemctl status nginx

# 80, 443 포트가 열려 있는지
sudo ss -lntp | grep nginx

# 방화벽에서 포트가 허용됐는지
sudo ufw status

Nginx가 돌고 있는데 로그도 없고 응답도 없다면 DNS가 이 서버를 가리키지 않거나 방화벽에서 막히는 경우가 많다. curl -v http://서버IP로 도메인 없이 직접 IP로 테스트해보면 DNS 문제인지 서버 문제인지 구분할 수 있다.