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파일이 포함 된다.
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 block은 listen 하고 있는 port 및 server_name으로 구분된다!
일단 어떤 서버 블락으로 요청을 처리 시킬지 먼저 결정하고,
그 안에 있는 location 지시어를 통해 URI 매칭을 시도하는 흐름이다!
'http&server' 카테고리의 다른 글
딥러닝 모델의 API화 (AWS lambda) (1) | 2021.01.27 |
---|---|
celery + flask 를 이용한 파이썬 비동기 처리 API 구현 (0) | 2021.01.05 |
04. Nginx 기초 사용법 정리 2 (location, proxy, cache) (0) | 2020.07.29 |
02. flask + gunicorn + docker 조합 (0) | 2020.07.29 |
01. Web Server, WAS, CGI, WCGI에 대해 (0) | 2020.07.29 |