Nginx?

  • 다중 접속자 처리에 특화된 웹 서버 프로그램
  • Apache와 유사한 동작을 하나 소모되는 리소스가 더 적고 더 빠름
  • 사전에 지정된 conf 파일에 따라 해당 주소로 요청을 전달하는 전달자 역할을 하므로 리소스 소모가 거의 없다

특징

  • 리버스 프록시 기능
    • 클라이언트로부터 받은 요청을 프로토콜/포트에 따라 분리해 다른 주소로 재분배. 클라이언트가 요청하는 것은 어디까지나 Nginx로, 뒷단에서 실제 비즈니스 로직이 돌아가는 어플리케이션 서버의 주소를 알 수 없으므로 외부의 공격에서 실제 서버는 안전함
  • 로드밸런싱
    • upstream 블록으로 특정 서버들을 하나로 묶어 처리할 수 있어 외부에서 들어온 요청에 대해 수동으로 로드밸런싱이 가능. 서로 다른 스펙의 서버에서 동일한 어프리케이션을 서비스해야 할 경우 사용 가능하다.
  • 비동기 요청 처리
    • 각 요청에 직접 프로세스를 분배하지 않고, 들어오는 각 요청마다 마스터 프로세스가 워커 프로세스를 만들어 워커 프로세스가 작업 핸들러에 요청을 전달하는 식이기 때문에 응답 지연시간이 동기식 프로그래밍보다 더 짧음.

구성

nginx:
- mime_types
  nginx.conf
  conf.d:
  - default.conf
  ...

nginx.conf

  • nginx 초기 설정파일로, nginx 어플리케이션의 전체적인 동작 및 include로 지정할 conf 파일을 설정할 수 있다. 요청을 분배할 프로토콜/서버를 지정하는 것도 이곳이며, 특정 서버에 특정 요청의 conf를 include하도록 할 수 있다.
  • 내부에 프로토콜 레벨 및 프로세스, pid같은 low level의 설정들을 세팅하는 것이 일반적. 물론 이 파일 하나에 모든 설정을 다 때려박아 만드는 것도 방법이지만, 설정 파일의 가독성이 떨어지고 유지 및 MicroServiceArchitecture 구현이 불편해지기 때문에 프로토콜 레벨의 디자인은 이 파일에서, 서버 레벨의 디자인은 각 서버에 include할 conf 파일에서 해주는 것이 좋다.

conf.d/default.conf

  • 사실 이 경로는 꼭 정해진 것은 아니고, nginx.conf 파일에서 include하는 디렉토리를 어떻게 바꿔주느냐의 차이다. conf.d라는 이름이 맘에 안들면 i_am_server/ 같은 이름으로 폴더를 만들고 include로 참조할 디렉토리만 바꿔주면 그만.

  • 기본 세팅은 HTTP 프로토콜에 conf.d/default.conf 라는 파일을 include하고 있다.

  • defualt.conf

    server {
      # 해당 config 파일이 include 되어있는 프로토콜의 해당 포트를 listen (HTTP/80)
      listen       80;
      listen  [::]:80;
      server_name  localhost;
    
      # 접속 로그가 남겨질 위치 및 파일명
      #access_log  /var/log/nginx/host.access.log  main;
    
      # location 뒤의 설정된 주소로 접속 시도시 연결될 파일
      location / {
          root   /usr/share/nginx/html; # root 권한으로 해당 파일을 open
          index  index.html index.htm; # index.html을 index.htm으로도 취급
          # proxy_pass http://localhost:9000 # 해당 url로 리디렉션
      }
    
      # 오류 발생시 redirect될 페이지
      #error_page  404              /404.html;
      error_page   500 502 503 504  /50x.html;
    
      location = /50x.html {
          root   /usr/share/nginx/html;
      }
    
      # proxy the PHP scripts to Apache listening on 127.0.0.1:80
      #
      #location ~ \.php$ {
      #    proxy_pass   http://127.0.0.1;
      #}
    
      # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
      #
      #location ~ \.php$ {
      #    root           html;
      #    fastcgi_pass   127.0.0.1:9000;
      #    fastcgi_index  index.php;
      #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
      #    include        fastcgi_params;
      #}
    
      # deny access to .htaccess files, if Apache's document root
      # concurs with nginx's one
      #
      #location ~ /\.ht {
      #    deny  all;
      #}
    }

default.conf example

# 로드밸런싱: url이 선언되는 경우 하기 2개의 서버가 랜덤하게 요청을 나눠가짐.
# 각 서버에 wegiths=INTEGER 옵션을 줄 경우, INTEGER의 숫자에 따라 해당 서버가 더 많은 요청을 받음
upstream backend {
    server 172.11.0.11:8080;
    server 172.11.0.12:8080;
}

server {
    listen 8080;
    listen [::]:8080;
    server_name localhost;

    access_log /logs/access.log;
    error_log /logs/error.log;

    location / {
        proxy_pass http://backend;
    }

    location /s1 {
        proxy_pass http://172.11.0.11:8080;
        # 실제 서버에 http://172.11.0.11:8080/s1으로 돌아가고 있는 서버가 있어야함. 아닐경우 404
    }
    location /s2 {
        proxy_pass http://172.11.0.12:8080;
    }
}

예제 파일

https://github.com/Jangab-water/nginx-training.git

+ Recent posts