Nginx logging/ https

Q kim·2021년 2월 4일
2

배포과정에서 NGINX에서 하게 될 필수적인 일들을 좀더 보고 가죠.

  1. NGINX 기초적인 용어들
  • 지시어
  • 연산자
  • 변수
  1. Nginx log 남기기
  2. Nginx https 설정하기

1. NGINX 기초적인 용어들

지시어

server

Syntax: server { ... }
가상서버에 대한 설정을 작성합니다. listen directive로 어떤 서버에 대해 응답할 것인지 설정할 수 있습니다.

server_name

Syntax: server_name name ...;

server {
	server_name example.com www.example.com;
}

location

Syntax: location [ = | ~ | ~* | ^~ ] uri { ... }
들어오는 요청 URI에 대한 설정을 할때 쓰입니다. 우리는 보통 proxy_pass로 전달해줄 때 쓰게 되죠.

"="

location = /user {
	proxy_pass http://login.example.com;
}

=를 붙이게 되면 정확하게 일치하는 URI에만 반응합니다. + 팁으로 "/"으로 가는 요청이 많다면, = /으로 설정해둔다면, 요청을 보다 빠르게 처리할수 있게 됩니다.

root

Syntax: root path;
요청에 대한 root 디렉토리를 설정합니다.

location /i/ {
	root /data/w3;
}

위의 코드를 보시면, "/data/w3/i/top.gif" 파일은 /i/top/gif 요청의 응답으로 보내집니다.

try_files

Syntax: try_files file ... uri;
Syntax: try_files file ... =code;
들어오는 요청에 해당하는 파일이 있는지 확인하고 첫번째로 나오는 파일을 반환합니다. 아무 파일도 검색되지 않는다면 마지막 인자로 설정된 uri, code로 응답합니다.

aio

Systax: aio on | off | threads
비동기 파일 I/P를 가능하게 할지 말지 정합니다. threads 옵션은 파일을 전송함에 있어서 한 프로세스에서 멈추지않고 (block되지않게 하기 위해) 멀티스레딩 방식으로 전달하도록 하는 값입니다.

aio_write

Systax: aio_write on | off;
aio 가 가능할 때 파일 쓰기 작업에서도 가능한지 설정합니다.

alias

Systax: alias path;
들어오는 uri가 변경되서 처리되어야할 때 이용합니다.

location /i/ {
	alias /data/w3/images/;
}

위에서 /i/top.gif 요청이 들어오면 /data/w3/images/top.gif의 파일이 전달됩니다. /i//data/w3/images/ 로 변경되어서 처리되었습니다.

error_page

Systax: error_page code ... [=[response]] uri;
특정에러에 보여줄 URI를 정의합니다.

error_page 404             /404.html;
error_page 500 502 503 504 /50x.html;

연산자

=

js 의 "==", "==="와 같다. uri가 같은지 확인.

# uri가 /error와 같으면 error_page를 보여주도록 한다.
location = /error {
	proxy_pass 127.0.0.1:3000/error_page
}

!=

=와 반대로 다를때 사용.

~

정규 표현식 패턴을 이용할 때 쓴다.

# .jpg로 끝나는 경로에 대해 반응한다.
location ~ /.jpg$ {
	proxy_pass 127.0.0.1:3000/image.jpg;
}

!~

~와 반대되는 연산자이다.

~*

대소문자를 구분하지 않는 정규표현식 패턴이다.

-f

파일이 존재하는지 확인.

-d

디렉토리가 존재하는지 확인.

-e

파일, 디렉토리, 심볼릭 링크가 존재하는지 확인

-x

파일이 존재하고 실행가능한지 확인.

변수

달러표시($)가 붙은 여러 변수를 이용하여 nginx로 전달된 요청에 대한 정보들을 이용할 수 있다.

"http://nginxstudy.co.kr:80/variables?id=123" 이라는 uri이 들어온다면
$host는 nginxstudy.co.kr이 되고, $uri는 /variables 가 된다.

host

요청받은 호스트명

uri

요청받은 URI

args

쿼리스트링이라고 생각하면 된다. 위 uri에선 id=123

디테일한 설명은 https://www.javatpoint.com/nginx-variables


2. Nginx log 남기기

NGINX는 따로 설정해주지 않아도 알아서 로그를 남깁니다. 따로 설정을 해주지 않으면 한파일에만 계속 저장해주는 게 문제죠.
기본 log설정을 봐봅시다. nginx.conf 파일을 들어가면

server {
	##
	# Logging Settings
	##

	access_log /var/log/nginx/access.log;
	error_log /var/log/nginx/error.log;
}

아래처럼 적혀있습니다. access_log와 error_log의 경로로 가서 확인해보시면 지금까지의 접근 로그들이 잘 적혀있을 겁니다.
기본 설정에서 더 나아가 우리가 할일은 로그를 1. 날짜에 따라 분리시키고, 2. 당일의 로그를 제외하고는 모두 압축시키는 것입니다. 그리고 3. 특정 기간을 넘은 파일은 자동으로 삭제되게끔 하겠습니다.

이 모든 일은 Logrotate라는 linux 툴을 이용하면 쉽게 할수 있습니다. logrotate는 이미 리눅스에 깔려있습니다. /etc/logrotate.d로 가셔서 nginx를 위한 로그 설정을 작성하면 됩니다.

$ cd /etc/loglotate.d
$ sudo vi nginx
# /etc/logrotate.d/nginx

/var/log/nginx/*.log {
        daily
        missingok
        rotate 14
        compress
        delaycompress
        notifempty
        create 0640 www-data adm
        sharedscripts
        prerotate
                if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
                        run-parts /etc/logrotate.d/httpd-prerotate; \
                fi \
        endscript
        postrotate
                invoke-rc.d nginx rotate >/dev/null 2>&1
        endscript
}

logrotate의 중요한 옵션들을 살펴봅시다.

  • daliy, weekly, monthly : 로그 파일을 분할할 시간을 정합니다.
  • missingok : 로그파일을 분실했을 때 에러를 발생시킬지 말지.
  • rotate 'n' : 저장할 로그파일 갯수
  • compress: 로그 파일을 압축할지.
  • delaycomporess : 최근파일을 제외하고 전부 압축
  • notifempty: 빈 로그파일은 로테이트하지 않음.
  • create 0640 www-data adm: 새 로그파일을 생성하면 640 모드로 생성하고 소유자는 nginx가 됨. *640: 소유자-읽기쓰기, 그룹-읽기, 타인-엑세스불가
  • sharedscripts :
  • prerotate: rotate작업을 마친후 실행할 스크립트를 적는 곳.

위 설정대로 로깅이 작동된다면 nginx 로그는 아래처럼 저장되어집니다.

# /var/log/nginx
access.log    access.log.2.gz  access.log.4.gz  access.log.6.gz  error.log
access.log.1  access.log.3.gz  access.log.5.gz  access.log.7.gz  error.log.1

3. Nginx https 설정하기

  1. 인증서를 받습니다.
  2. 그리고 nginx 설정파일에서 경로를 설정해주면 됩니다.

1. 인증서를 받습니다.

가비아, cloudflare등 아주 많은 사이트에서 만들어줍니다. 이메일로 cert.pem과 key.pem 파일을 받으셔서 /etc/nginx/certificate에 저장합니다. certificate 디렉토리가 없다면 만들어서 저장합니다.

테스트용으로 ssl을 직접 만들 수도 있습니다.
https://techexpert.tips/ko/nginx-ko/nginx%EC%97%90%EC%84%9C-https-%EC%82%AC%EC%9A%A9/

2. nginx에서 몇가지 설정을 합니다.

80포트를 받는 listen 설정되어있는 파일로 갑니다. 제경우에는 /etc/nginx/sites-available/default입니다.
https 설정이 없던 설정코드 입니다.

server {
	listen 80 defalult_server;
	listen [::]:80 default_server;
    
	root /var/www/html;

	server_name _;

	location / {
		proxy_set_header Host $host;
		proxy_set_header X-Real-IP $remote_addr;
		
		// 80포트로 들어오는 요청을 3000포트로 전달
		proxy_pass http://127.0.0.1:3000/; 
}

기존 설정은 단순히 80포트로 들어오는 요청을 3000포트로 연결해주는 것이 다였습니다.

server {
	listen 80 defalult_server;
	listen [::]:80 default_server;
	return 301 https://$host$request_uri; // ! redirect
	// 80 포트로 들어온 요청이 바로 443 port로 가게 됩니다.

	server_name _;

}

server {
	listen 443 ssl;  //https port
	server_name ssl_test;
	root /var/www/html;
		
	ssl_certificate /etc/nginx/certificate/nginx-certificate.crt;
	ssl_certificate_key /etc/nginx/certificate/nginx.key;
        
	location / {
		proxy_pass http://127.0.0.1:3000/;
	}   
}

without HTTPS80 -> 3000 => with HTTPS 80 -> 442 -> 3000

이제는 80포트로 들어온 요청을 바로 [ 1 ] https로 리다이렉트시킵니다. 그리고 443으로 들어온 요청을 [ 2 ] 3000포트로 전달합니다.


https://opentutorials.org/module/384/4504

profile
https://medium.com/nodejs-server

0개의 댓글