http&server

03. Nginx 기초 사용법 정리 1 (conf, directives)

식피두 2020. 7. 29. 11:29

nginx의 매우 기본적인 부분에 대해서 정리한다.

이 전에 문서를 보고 번역 & 정리해 놓은 자료를 다시 한 번 정리한다.

 

'nginx를 사용할 줄 안다' 함은 결국 'conf 파일을 설정/이해할 줄 안다'로 귀결되는 듯 하다.

 

겁 먹을 필요 없이, 그냥 읽고 해석하고 고칠 줄만 알면 된다. 

 

Nginx의 특징

엔진엑스는 Reactor 패턴을 따른다.

 

하나는 이벤트를 받아 전달해주는 리액터,

다른 하나는 리액터가 보낸 이벤트를 실제로 받아 처리하는 핸들러

 

하나의 마스터 프로세스가 있어서, config 및 worker를 관리하고

여러 워커 프로세스가 있어서 실제 요청을 처리하는 느낌이다.

 

기본적으로는 싱글 쓰레드를 이용해서

몇 천개의 커넥션도 효율적으로 관리가 가능하다.

 

(필요에 따라 fork를 써서 여러 개의 프로세스를 활용하는 것도 가능하다고 함)

 

Main Event Loop라는 놈이 OS의 소켓으로 부터 읽을 수 있는 DATA를 기다리고 있다.

 

 

설치는 알아서 하시고

 

Conf 파일

보통은 /etc/nginx/site-availables/default 파일 혹은 별도로 만든 파일을 수정함으로써 설정을 하거나

 

/etc/nginx/conf.d/default.conf 혹은 사이트명.conf 을 수정하여 설정한다.

 

버전에 따른 차이 같고, 1.10.x 버전에선 전자, 1.15.x 버전에선 후자였다.

 

nginx는 기본적으로 /etc/nginx/nginx.conf를 기본 conf 파일로 로드한다.

그 안에는 http block에 대한 정의 및 http 서버의 전반에 대한 설정이 추가되어 있다.

http {
	include /etc/nginx/conf.d/*.conf;
    ...
}

nginx.conf 안에 include /etc/nginx/conf.d/*.conf 와 같이 추가적으로 conf를 포함하는 부분이 있는데,

이렇게 포함되는 conf 안에는 서버 블락(server block ; virtual host)에 관한 설정이 추가 되어 있다. 

그리고 바로 이 부분에서 우리가 별도로 커스터마이즈한 conf파일이 포함 된다.

 

 

What is the different usages for sites-available vs the conf.d directory for nginx

I have some experience using linux but none using nginx. I have been tasked with researching load-balancing options for an application server. I have used apt-get to install nginx and all seems...

serverfault.com

 

Log 파일

아마 /var/log/nginx에 보면 access.log, error.log가 있을 텐데

tail -f 로 찍어보면 실시간으로 들어오는 요청들을 확인할 수 있다.

 

 

Directives (지시어)

nginx의 설정 파일은 여러 가지의 directives에 의해 컨트롤 되는 모듈로 이루어져 있다.

 

지시어의 형식에는 크게 두 가지가 있다.

 

하나는 simple directive

directive_name params

다른 하나는 block directives

directive_name {
	...
}

만약, 블락 디렉티브 안에 또 다른 디렉티브가 있다면, 블락을 안에 있는 디렉티브의 context라고 부른다.

참고로, 어디에도 포함되어 있지 않은 디렉티브는 main context에 포함되었다고 한다.

 

 

Conf 기본 예시

server { # 하나의 웹사이트 선언
  listen 80; # 리스닝 포트
  server_name abc.test.com;
  
  location / { # 특정 URL 처리
    root /home/nginx; 
    index index.html, index.htm; # 초기 페이지 설정
  }
  
  location ~ \.do$ { # 특정 확장자 요청 넘기기 (nginx 뒷단의 WAS로)
    proxy_pass http://localhost:8080; # 
  }
}

대략 이런식으로 생겨먹었다.

 

server {} 블록은 '하나의 웹사이트를 선언'할 때 쓰인다.

location {} 블록은 서버 블록 안에 등장하며, '특정 URL을 처리하는 법'을 정의한다. (뒤에서 설명)

 

예시에서 첫 번째 location 블락은 루트로 접속했을 때 /home/nginx의 index.html을 서빙하라는 의미이며

두 번째 location 블락은 특정 패턴을 명시하고 있어서, '.do'로 끝나는 주소 요청을 8080 포트로 넘길 수 있다.

이런 패턴은 웹서버 뒤에 WAS(웹 애플리케이션 서버)가 있는 구조에서 쓰인다.

 

 

Serving Static Content 의 과정에 대해서...

앞서 말한 것 처럼, 엔진엑스는 웹서버로서

정적인 컨텐츠(static content ; html, css, image)를 서빙하는 용도의 소프트웨어다.

 

  http { # 생략 가능한 듯
    server {
      listen ...
      server_name ...
      location ...
    }
    
    server {
      listen ...
      server_name ...
      location ...
    }
  }

 

일반적으로 conf는 여러 개의 server block으로 이루어진다.

server blocklisten 하고 있는 port 및 server_name으로 구분된다!

 

일단 어떤 서버 블락으로 요청을 처리 시킬지 먼저 결정하고,

그 안에 있는 location 지시어를 통해 URI 매칭을 시도하는 흐름이다!