Nginx 개념 및 사용법

Spring, .NET,  Flask 의 웹서에서 각각 제공해주는 tomcat, kestrel, gunicorn 과 별개로 독자적으로 활동하는 웹서버인 Nginx 의 장점과, 변해가고 있는 현 트랜드에 대해서 정리해보려 합니다.


Nginx 란?

트래픽이 많은 웹사이트를 위해 확장성을 위해 설계된 비동기 이벤트 기반 구조의 웹서버 소프트웨어

Nginx 개인적으로 여러 시도...? 과 다양한 경험을 해보면서 나름 수준급의 경지에 올랐다고 생각합니다.


웹 서버 점유율 추이 (Graph by Netcraft)


  •  - Nginx 의 점유율은 점진적으로 상승세며, 2018 년 이후로, Apach 점유율을 추월했습니다.


    현업 에서도 잠깐 Java Spring 시스템을 운영하기도 했지만, 전세계적으로, 그리고 특히 Java 진영에서는 거의 함께하는 동반자 수준으로 같이 하던 Apahe. 

    하지만  러시아의 한 개발자가 Nginx 를 만든 후,  뛰어난 성능으로 많은 관심을 받아 왔으며,  2022 년 현 시점에 와서는,  Web server 점유율 1 위를 유지하고 있습니다.






    Apach 와 Nginx 비교 

    Apache 와 Nginx 는 서로 비슷한 역할을 하고 있지만,  두 소프트웨어 만의 차이가 있습니다.

    Apache 의 경우는 요청 당 쓰레드, 프로세스가 처리하는 반면에, Nginx 는 비동기 이벤트 기반으로 요청을 처리하게 됩니다. 

    그러다 보니 대용량의 트래픽을 감당해야 하는 시스템에서는 상대적으로 Apache 보다 Nignx 가 우세한 이점이 있습니다.




    ApachNginx

    1. 요청 당 쓰레드 또는 프로세스가 처리

    2. Nginx 보다 모듈이 다양함

    3. PHP  모듈 등 직접 적재 가능

    4. 안정성, 확장성, 호환성 우세 

    1. 비동기 이벤트 기반으로 요청

    2. Apach 에 비해 다양한 모델 없음

    3. 많은 접속자들 대응 가능

    4. 성능 우세




    Nginx 구조

    Nginx 는 하나의 master process 와 여러 worker process 로 구성됩니다.

    master process 는 Configuration file 을 읽고 ,  worker process 를 관리합니다.

    실제 worker 에 해당 하는 여러 Directives 를 명시해서 Worker 로서 등록이 가능합니다. 


    •  - Nginx.config 파일에서 설정




    Configuration file 은 기본적으로 Linux OS 기준  /etc/nginx/nginx.config 경로에 위치합니다.

    그리고 해당 파일은 Directives(지시어) 의 묶음으로 나열 됩니다.


    Simple Directives 예시Block Directives 예시
    client_max_body_size 20M;
    listen: 80;
    server_name localhost;
    keepalive_timeout 0;
    upstream group {
        ip_hash;
        server group:8000;
    }

    - Context 로는 main, http, server, location 등이 있고 순서대로 포함 관계를 가집니다. 

    * 공식 Document 를 읽다보면 각 지시어 Directives 를 사용 가능한 Context 를 지정해 주는 데,  그 때의 Context 가 바로 이것을 의미 


    Nginx 대표 기능 


    1. Simple Static file Server


    • path/to/html;
             }
              location / {
                   root /path/to/image;
             }
          }
      }

      - http Context 안에 Server Context 안에 location Context 존재.



      - location 뒤에 있는 url(/) 로 접속시 서버의 디렉터리 (/path/to/html)에 있는 정적

        파일을 제공하겠다는 내용을 담고 있다. 

      2. Proxy Server 로 이용하기 

        - 8080 port -> 5000 port 전송 


      http {
          server {
              listen: 8000;  #포트 생략시 default 80
              location / { 
                   proxy_pass http://localhost:5000;
              }
          }
      }

      - 프록시 서버에 대해서 간략히 설명하면 

         서버로 들어온 request 가 다른 서버에 전달하고, 그 서버로부터     

          response 를 전달 받아 클라이언트로 전달하는 중간 매개체.


      - 8080 포트로 요청받은 내용을 proxy 를 통하여 5000 포트로

         Redirect



      3. Load Balancer 로 이용하기 

        - nginx.config or default 내부에 작성


      http {
              # load balancing 할 서버 그룹을 정의
              upstream servergroup1 {
                  # load balance 기법을 정의 
                   ip_hash;
                  # 서버 ( 주소 + port + [옵션]) 나열
                  server srv1.exampl;e.com:80;
                  server srv2.example.com:3030  weight=3;
                  server srv3.example.com;     
              }
              # 프록시 서버로서의 nginx 동작을 기술
              server {
                      listen 80;
                      location / {
                              proxy_pass http://servergroup1;
                      }   
              }
      }

      - 하나의 proxy server(Nginx) 에서 여러 WAS +CGI 서버로

         적절히 부하를 나누어 연결하는 기술을 Load Balacing 이라함



      - Nginx 에서 제공하는 Load Balancing 기법은 3가지

      - round-robin : 라운드 로빈 방식으로 동등하게 접속 (기본)

      - least-connected: 가장 적게 연결된 서버 중심으로 접속

      - ip-hash: 고정 ip 방식으로 동일 서버에만 접속



      - weight 는 round-robin 방식에서 서버의 부하 가중치 설정



      Nginx Custom 기능 

      1. Proxy 요청 Timeout 늘리기 

      • - Location context 에서 설정 


      http {
              server {
                     ....
              location / {
                      proxy_connection_timeout 300s;
                      proxy_send_timeout 300s;
                      proxy_read_timeout 300s;
                      send_timeout 300s;
              }
      }

      - Nginx 는 다양한 처리에 Timeout 이라는 linit 이 설정되어 있다.


      - 예를 들어 was 와 cgi 서버의 프록시 서버로 사용되고 있는 Nginx 에서는

        cgi 와 was 로 전달된 요청(request) 에 일정 시간동안 응답(response) 되지

        않으면 client 에 504 error 를 발생 시킨다.  


      - 해당 문제는 timeout 설정에 관련된 directives 를 nginx.config 에 기술하여

         해결 가능하다.


      - Timeout 종류는 아래 참고 문서를 참고.


      2. Cline 업로드 파일 용량 제한 늘리기 


      • http {
            server {
                server_name  owl.dev.me;
                listen 80;
                # 용량 업로드 제한: default= 10M
                client_max_body_size 20M;
                location / {
                        ....
                }
        }

        - 웹 앱을 운영 하다보면 사용자로부터

           대용량 업로드 파일을 받아야 하는 경우가 발생한다.



        - 해당 경우 server context 내부에 아래 문구(directives)를

           추가한다.


        - client_max_body_size 20M



        3. http -> https 자동 Redirect

          - 301 https://$hosr$request_uri;


        server {
              listen 80 default_server ;           #ipv4
              listen [::]:80 default_server;       #ipv6
              server_name owl-dev.me;
              return 301 https://$hosr$request_uri;
        }

        - 사용자가 도메인 url 을 http 로 접속하더라도 

           proxy 서버단에서 SSL 인증을 받은 https 443 포트로 

           redirect 하는 기능


        - 80 포트로 들어가는 server block directives 내부에

        - 301 https://$host$request_uri 로 return 받게끔 설정


        - 443 포트를 받는 server block directives 또한 생성해야 함


        관련 글 : Nginx Load Balancing 적용기

        참고 문서: