본문 바로가기
Web Programming

Nginx log 관련 설정 파헤치기 (feat. AWS EC2)

by 맑은안개 2021. 12. 15.

이미지 출처: Pixabay

Nginx Log 설정

전 블로그에서 Nginx 설치부터 실행까지 알아보았다. 

2021.12.14 - [Web] - AWS EC2 웹 서버 nginx 설치, 설정 부터 실행까지 ( 프리티어 )

 

AWS EC2 웹 서버 nginx 설치, 설정 부터 실행까지 ( 프리티어 )

EC2 웹서버 nginx 설치 프리티어 기준에서 설치 가능한 EC2(Amazon Linux 2 AMI) 에서 nginx를 설치하고 실행해본다. 준비사항 - ec2 ( Amazon linux2 ami ) - os가 다른 경우 yum을 사용한 nginx install시 방법..

youngwonhan-family.tistory.com

Nginx는 http요청에 대한 access.log, error.log를 default로 기록한다. 본 블로그에서 로그가 기록되는 위치를 변경하고, 로그 형식(format)에 대한 기본 개념을 이해하고 주요 내장 변수 값에 대해 알아본다.

준비사항

  • 전 블로그에서 진행한 환경셋팅
  • Putty

nginx.conf

Nginx의 설정파일은 nginx.conf에 설정된다. include 옵션을 사용, 관심사를 분리하여 유연한 관리가 가능하다. 우선 access / error 로그가 적재되는 경로를 /LOG/nginx 로 수정해보자. 

 

! root 유저로 진행한다.

/etc/nginx/nginx.conf

# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;
  • error_log 와 access_log의 위치가 /va/log/nginx/ 에 위치한걸 확인 할 수 있다.
  • access_log는 main 이름(alias)로 설정된 log_format의 format으로 로그를 기록한다.
  • log_format 에서 사용되는 $으로 시작되는 변수들은 nginx에서 기본으로 제공하는 변수, 혹은 사용자 변수를 지정할 수 있다. 

로그 위치 변경

다음처럼 위치를 변경하고 nginx.conf를 저장한다.

error_log /LOG/nginx/error.log;

access_log  /LOG/nginx/access.log  main;

대상 디렉토리를 생성한다.

mkdir -p /LOG/nginx

Nginx 설정파일 리로드(reload)

nginx -s reload 명령을 사용하여 gracefully하게 설정을 리로드 한다. reload 명령은 서버 중지 없이 설정을 리로드하여 패킷 손실을 방지할 수 있다. ( 무중단 설정 반영 )

[root@ip-172-31-32-189 nginx]# nginx -s reload
[root@ip-172-31-32-189 nginx]# ll
total 0
-rw-r--r-- 1 root root 0 Dec 16 00:52 access.log
-rw-r--r-- 1 root root 0 Dec 16 00:52 error.log

위 처럼 access / error 로그가 생성되었다. 퍼블릭 DNS로 접속하여 access.log에 제대로 기록되는지 확인하자.

/LOG/nginx/access.log

106.101.2. - - [16/Dec/2021:00:54:44 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36" "-"
106.101.2. - - [16/Dec/2021:00:54:53 +0000] "GET /test HTTP/1.1" 404 3665 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36" "-"
  • 존재하지 않는 경로(/test)는 404(Not found)를 출력했다.

/LOG/nginx/error.log

위에서 존재하지 않는 경로 접근에 대한 error.log 기록이다.

2021/12/16 00:54:53 [error] 15389#15389: *174 open() "/usr/share/nginx/html/test" failed (2: No such file or directory), client: 106.101.2., server: _, request: "GET /test HTTP/1.1", host: "ec2-54-180-.ap-northeast-2.compute.amazonaws.com"

오류 로그 설정

error_log가 설정된 /etc/nginx/nginx.conf파일을 다음과 같이 로그 레벨을 설정할 수 있다.

로그 레벨은 심각도 순으로 다음 8단계로 이루어져있다.

debug < info < notice < warn < error (default) < crit < alert < emerg

error_log /LOG/nginx/error.log debug;

설정파일 변경 후 nginx -s reload하여 적용한다.

 

로그 포맷(log_format) 설정

/etc/nginx/nginx.conf

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';
                    
     access_log  /LOG/nginx/access.log main;
  • main 이름을 갖는 log_format이 access_log에 설정된 상태
  • log_format지시자는 http 영역안에서만 정의 가능
  • location 안에 지정하여 사용할 수 있다. ( 특정 uri 접근에 대한 로깅 시 )

주요 로그 내부 변수

  • $remote_addr - Server에 접근한 IP주소
  • $time_local - 다음 포맷을 갖는 시간을 출력한다. 16/Dec/2021:00:54:44 +0000
  • $request - request_method + http 버전
  • $request_method - "GET", "POST"
  • $status - 요청에 대한 응답 HTTP Code
  • $request_body - 요청의 body를 출력한다. POST 요청에 대한 값 확인
  • $http_user_agent - 클라이언트 정보 출력 ( Chrome, Postman 등 )
  • 이 외 인증서에 관한 정보들은 $ssl_ 시작되는 내장 변수를 사용하여 확인할 수 있다.
    • $ssl_client_cert - 클라이언트 인증서의 cert 정보
    • $ssl_client_fingerprint - 클라이언트 인증서의 지문정보
    • $ssl_client_i_dn - 인증서 발행 주체의 dn 값
    • $ssl_client_s_dn - 인증서 소유자의 dn 값

 

반응형