Nginx 설정을 알아보자

겔로그·2022년 10월 3일
3

NGINX

목록 보기
3/3
post-thumbnail

개요

오늘은 nginx의 문법을 알아보는 시간을 가져보겠습니다.

Nginx 기본 문법

기본 실행 및 종료

nginx 설치 후 실행/종료는 다음과 같습니다.

nginx -s stop // 빠른 종료
nginx -s quit // 정상 종료(nginx를 시작한 동일한 사용자만 실행 가능)
nginx -s reload // 구성 파일 다시 로드
nginx // 시작

구문 검사

nginx.conf 설정 파일 정상인지 확인할 수 있습니다. nginx 실행 전에 설정값을 변경하셨을 경우 사용하시길 바랍니다.

nginx -t // 구문 검사

nginx.conf 구조

이제는 nginx.conf 파일을 관리하는 방법에 대해 공유하겠습니다.

nginx.conf는 다음과 같이 분류됩니다.

  • simple directives
  • block directives

block directives 내부에 작성된 simple directives는 작성된 block 내부에서만 설정값으로 동작합니다.
이해가 안되신다면 천천히 아래 내용을 읽어보시길 바랍니다.(사실 여기서 이해되는게 말이 안됩니다..)

simple directives

simple directives는 이름과 매개변수를 공백으로 구분하고 세미콜론(;)으로 끝납니다.

각각의 simple directives는 nginx에서 하나의 명령을 선언했다고 생각하시면 좋을 것 같습니다.

예시

root /data/www;
server_name localhost;

block directives

block directives중괄호로 구분된 집합 영역을 의미합니다.
만약 block directives 내부에 또 다른 block directives를 가질 수 있는 경우, 이를 context라 부릅니다.

block directives 구조

블록은 총 5가지 영역으로 나누어집니다.

  • core : 환경 설정 파일의 최상단에 위치하며 한번만 사용할 수 있습니다. nginx의 기본적인 동작 방식을 정의합니다.
  • http: 웹서버에 대한 동작을 설정하는 영역으로, server 블록과 location 블록의 루트 블록입니다.
  • server: 가상 호스팅(Virtual Host)의 개념으로 하나의 서버를 커버합니다.
  • location: server 블록 내에서 특정 URL을 처리하는 방법을 정의합니다.
  • events: 네트워크 동작에 관련된 내용을 설정할 수 있습니다.

nginx.conf block directives 예시

// 기본 - core

events{

}

http {
    server {
    	location / {
        
    	}

    	location /images/ {
 
    	}
	}
}
  • 적용은 core-> http -> server -> location순으로 적용되며 동일한 simple directives가 block 별로 정의될 경우 depth가 가장 깊은 block의 설정을 따라갑니다.

simple directives, block directives에 들어갈 수 있는 syntax에 대해서 좀 더 알고싶으신 분들은 docs를 참고하시길 바랍니다.

Docs 읽는 방법

예시

그럼 simple directives 와 block directives에 대한 기본 개념은 알게 되었으니 구체적인 예시 상황을 통해 좀 더 심층적으로 알아보겠습니다.

nginx.conf

worker_processes  3;

events {
    worker_connections  1024;
}

http { 
    
    server {
        listen       80;
        server_name localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        
        location /error {
            root   html;
            index  50x.html 50x.htm;
        }
    }
}

예시 - root context(최상위 로직)

worker_processes : master process 내부 worker process 수를 의미합니다.
events: 이벤트 블록은 네트워크 동작방법과 관련된 설정입니다.
worker_connections : 하나의 worker process는 worker_connections에서 설정한 수만큼 연결이 가능합니다.

예시 - server context

  • localhost:80 으로 들어오는 요청 : /(루트 컨텍스트)로 종료될 경우 html 경로에 있는 index.html을 가져옵니다.
  • localhost:80/error 로 들어오는 요청 : html 경로에 있는 50x.html을 가져옵니다.

root html; index index.html의 의미는 nginx의 prefix인 /opt/homebrew/Cellar/nginx/1.23.1/html을 의미하며 아래 사진의 html 심볼릭 링크로 인해 실제로는 /opt/homebrew/var/www/index.html을 참조합니다.

참고: Mac으로-nginx-설치하기

최종 예시 설명

  • 3개의 worker process는 하나당 최대 1024개의 connection이 가능하며 최대 3072개의 요청을 처리할 수 있습니다.
  • localhost:80으로 요청할 경우 -> index.html
  • localhost:80/error 일 경우 -> 50x.html

nginx 주요 기능

앞서 배운 내용으로는 클라이언트 요청이 들어올 경우 어떻게 처리할 것인가에 대해서 기본적인 설정에 대해 알아보았습니다.
nginx는 컨텐츠 제공뿐만 아니라 로드밸런싱 기능 및 리버스 프록시 기능을 제공한다고 이전 소개 시간에 배웠습니다. 그렇다면 어떻게 해당 기능들을 제공하는지 알아볼까요?

Reverse Proxing

reverse proxing은 proxy_pass문법을 통해 이용이 가능합니다. "/some/path/로 들어온 url은 모두 http://www.example.com/link/로 처리하라" 라는 의미로, 클라이언트의 요청을 특정 Url로 변환시키는 역할을 수행합니다.

location /some/path/ {
    proxy_pass http://www.example.com/link/;
}

이 때, simple directives로 요청 헤더, 응답 버퍼 구성, 발신 ip 주소 선택 등 다양한 설정이 가능해집니다.

location /app1/ {
 	proxy_buffers 16 4k;
    proxy_buffer_size 2k;
    proxy_bind 127.0.0.1;
    proxy_pass http://example.com/app1/;
}

location /app2/ {
	proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_bind 127.0.0.2;
    proxy_pass http://example.com/app2/;
}

Load Balancing

일부 기능은 오픈 소스가 아닌 nginx plus에서 제공하는 유료 기능이니 먼저 해당 기능이 오픈소스 기능인지 확인하시고 사용하시는 것을 권장합니다.(load balancing은 유료일수도..)

로드 밸런싱을 수행하기 위해서는 앞서 reverse proxing에서 배운 proxy_passupstream 을 동시에 사용해야 합니다.

예시

http {
    upstream backend {
    	least_conn;
        server backend1.example.com weight=5;
        server backend2.example.com;
        server 192.0.0.1 backup;
    }
    
    server {
        location / {
            proxy_pass http://backend;
        }
    }
}

server context에 작성된 proxy_pass에 작성된 http://backend는 upstream의 명칭과 매핑될 경우 upstream내부의 server로 이동됩니다.
이 때, least_conn, weight 등 다양한 가중치 옵션을 통해 로드밸런싱을 수행할 수 있습니다.

Nginx 기타 기능

nginx는 이 뿐만 아니라 수많은 기능을 제공하고 있습니다.
nginx를 좀 더 잘 이용하고 싶은 경우 다음 내용들을 공부하시는 것을 추천드립니다.

1. 설정 파일 분리

  • Nginx를 설정함에 있어 복잡한 시스템일수록 더욱 많은 코드가 작성될 것입니다. 설정 파일 작성간 중복되는 내용이 있을 경우 managing-configuration-files을 참고해 파일을 분리해서 Include 하는 것을 권장드립니다.

2. FastCGI,UWSGI,SCGI

nginx는 PHP와 같은 다양한 프레임워크 및 프로그래밍 언어로 구축된 애플리케이션을 실행하는 FastCGI 서버로 요청을 라우팅하는 데 사용할 수 있습니다.

이 외에도 UWSGI, SCGI 등을 사용할 수 있으니 각 parameter에 대해 확인해 필요한 경우 이용하시는 것을 권장드립니다.

3. 각 Directive 별 syntax

http,server,location 별로 동작하는 syntax는 동일한 내용도 있지만 다른 내용도 많습니다. 해당 내용을 docs를 통해 확인하시고 한 번 테스트 해보시길 바랍니다.

Nginx 주의사항

Nginx 설정간 주의사항은 다음과 같습니다.

1. 적용 우선순위를 파악한다.

location 패턴 매칭간 정규식 패턴 및 고정 url이 있을 경우 어떤 것이 우선순위가 높은지 확인하시고 설정하시길 바랍니다.

예제: /test , /test/tt를 요청할 경우 어떤게 요청을 처리할까?

1. location /test {}
2. location ~^/test{}
3. location ~^/test/tt{}

2. 조건문을 지양한다.

참고 : if is evil

Directive “if” is part of rewrite module which evaluates instructions imperatively. On the other hand, NGINX configuration in general is declarative. At some point due to users demand an attempt was made to enable some non-rewrite directives inside “if”, and this lead to situation we have now. It mostly works, but… see above.

nginx는 선언적 언어지만 if 조건문은 조건에 따른 재작성 모듈입니다. 따라서 올바르지 않게 동작할 확률이 있어 if문을 사용하지 않고 설정하는 것이 가장 올바른 설정입니다.

만약 사용할 경우, 정상적으로 동작하는지 결과를 확인하시는 것을 권장드립니다.

결론

오늘은 nginx를 어떻게 설정하는지에 대해 알아봤습니다. 지금 설명한 내용보다 훨씬 많은 내용들이 docs에 있으니 한 번 읽어보시고 필요한 기능들을 사용해보시는 것을 추천드립니다.

만약 nginx 설치를 하지 않고 공부해보고 싶으신 분들은
nginx-playground를 이용해 공부하시는 것을 추천드립니다.

다만, nginx-playground가 좀 쓰레기라 가끔 먹통이 되니 먹통이 되는 경우 프로세스 자체를 kill하시고 인터넷 사용기록 및 쿠키를 삭제하신 뒤 다시 이용하시길 바랍니다.

Reference

https://nginx-playground.wizardzines.com/
http://nginx.org/en/docs/beginners_guide.html
https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/

profile
Gelog 나쁜 것만 드려요~

0개의 댓글