NGINX의 기본 설정 파일은 nginx.conf
이며 파일의 구성은 directive들로 이루어져 있다.
Directive에는 두 가지 종류가 있는데, 이름과 인자가 공백으로 구분되고 ;
으로 끝나는 단일 줄은 simple directive, 구조는 같지만 { }
로 둘러쌓인 것은 block directive이다. block directive의 { }
안에 또 다른 directive가 들어간 경우는 context라고 한다. 어떤 context에도 속하지 않고, 바깥에 나와있는 directive들은 main context에 속해있는 것으로 간주한다.
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
user
: Linux 시스템에서 NGINX 서버를 동작시킬 사용자worker_processes
: 사용할 thread 개수 (CPU 코어 수에 맞추는 것 권장)error_log
: error log를 기록할 파일의 위치pid
: NGINX pid가 적혀있는 파일의 위치events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
include /etc/nginx/conf.d/*.conf;
default_type application/octet-stream;
log_format main ...
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
server {
# configuration of HTTP virtual server 1
location /one {
# configuration for processing URIs starting with '/one'
}
location /two {
# configuration for processing URIs starting with '/two'
}
}
server {
# configuration of HTTP virtual server 2
}
...
}
events
: 일반적인 connection process를 담당worker_connections
: 하나의 worker_process
당 처리할 connection 수http
: HTTP 웹 트래픽 처리 전반에 대해 기술하므로 universal directive 라고도 부름include
: 외부 config 파일 참고 (config 파일들을 쉽게 관리하기 위해 기능들 단위로 파일을 나눠서 저장하고 include를 통해 참고하는 것 권장)access_log
: NGINX 웹 서버로 접속한 내역들을 정의할 파일 위치server
: 특정 도메인이나 IP 주소로의 요청 처리location
: 특정 url을 처리하는 방법 정의
nginx.conf
에는 적어도 하나의 server
directive가 있어야 한다. NGINX가 요청을 처리할 때, 가장 먼저 요청을 처리할 virtual server를 선택한다. 하나의 http
context 안에는 여러 개의 server
directive가 있을 수 있다. 보통 server
configuration block에는 요청을 listen
할 특정 IP 주소와 포트, 혹은 Unix domain socket과 path를 명시한다.
아래 예시는 IP 주소 127.0.0.1 과 포트 8080으로 listen하는 configuration이다.
server {
listen 127.0.0.1:8080;
# The rest of server configuration
}
또는 server_name
directive를 사용하여 도메인 명을 사용할 수도 있다. 이 때 NGINX는 요청의 Host header
의 필드값과 server_name
을 비교하여 맞는 server를 찾는다. server_name
으로는 wild card와 정규 표현식 등을 사용할 수 있다.
server {
listen 80;
server_name example.org www.example.org;
...
}
NGINX는 요청 URI에 따라 다른 서버로 트래픽을 전송한다. 이는 server
block 안의 location
directive를 이용해 정할 수 있다. 여러 location
block을 사용할 수도 있고, location
안에 다른 location
directive를 설정할 수도 있다.
location
은 URI 경로의 일부인 prefix string이거나 정규 표현식이 될 수 있다. 다음 예시는 /some/path/document.html
과 같은 경로의 요청을 처리한다.
location /some/path/ {
...
}
location
context 안에 있는 directive는 요청을 어떻게 처리할지 정할 수 있다. static file을 보여주거나 proxy server로 요청을 전송한다. 다음 예시의 첫 번째 location
context와 일치하는 패턴은 /data
디렉토리에서 파일들을 보여준다. 두 번째 location
context와 일치하는 패턴은 www.example.com
도메인으로 요청을 전송한다.
server {
location /images/ {
root /data;
}
location / {
proxy_pass http://www.example.com;
}
}
root
: static file이 있는 파일 시스템의 경로이다. 이때 root 뒤에 location의 경로가 추가된 상태로 파일의 경로를 찾는다. 예를 들어 /images/example.png의 요청이 들어오면 NGINX는 /data/images/example.png에서 파일을 찾는다.proxy_pass
: 위의 예시에서 /images/와 맞지 않는 모든 패턴의 요청은 프록시 서버로 전송된다. 이후 프록시 서버에서의 응답이 클라이언트에게 전송된다.
Reference