Technology/Nginx

[Nginx] - Nginx란 정의, 사용법, 설정, 명령어 알아보기

nam_ji 2024. 12. 12. 17:03

Nginx 정의 사용법, 설정, SSL, Load Balancing, 명령어, 에러 알아보기

Nginx 정의

  • Nginx는 경량 웹 서버입니다.
  • 클라이언트로부터 요청을 받았을 때 요청에 맞는 정적 파일을 응답해주는  HTTP Web Server로 활용되기도 하고, Reverse Proxy Server로 활용하여 WAS 서버의 부하를 줄일 수 있는 로드 밸런서로 활용되기도 합니다.

Nginx 흐름

  • Nginx는 Event-Driven 구조로 동작하기 때문에 한 개 또는 고정된 프로세스만 생성하여 사용하고, 비동기 방식으로 요청들을 Concurrency(동시성)하게 처리할 수 있습니다.
  • 위 그림에서 보듯이 Nginx는 새로운 요청이 들어오더라도 새로운 프로세스와 쓰레드를 생성하지 않기 때문에 프로세스와 쓰레드 생성 비용이 존재하지 않고, 적은 자원으로도 효율적인 운용이 가능합니다.
  • 이러한 Nginx의 장점 덕분에 단일 서버에서도 동시에 많은 연결을 처리할 수 있습니다.
    • Event-Driven
      • apache의 C10K 문제점 해결(한 시스템에 동시 접속자 수가 1만명이 넘어갈 때 효율적 방안)을 위해 만들어진 Event-Driven 구조의 웹 서버 소프트웨어라고 합니다.
      • OSI7 Layer 중 application Level 아래의 level에서 Nginx 같은 웹 서버가 HTTP 통신을 담당합니다.

Nginx 구조

  • Nginx는 하나의 Master Process와 다수의 Worker Process로 구성되어 실행됩니다. Master Process는 설정 파일을 읽고, 유효성 검사 및 Worker Process를 관리합니다.
  • 모든 요청은 Worker Process에서 처리합니다.
  • Nginx는 이벤트 기반 모델을 사용하고, Worker Process 사이에 요청을 효율적으로 분배하기 위해 OS에 의존적인 메커니즘을 사용합니다.
  • Worker Process의 개수는 설정 파일에서 정의되며, 정의된 프로세스 개수와 사용 가능한 CPU 코어 숫자에 맞게 자동으로 조정됩니다.


Nginx SSL 설정

1. nginx.conf 설정

#nginx.conf
server {
        listen       8443 ssl http2;
        server_name  XXXXX.XXXXX.co.kr;
        
        include		/sw/nginx/nginx/conf/ssl.conf;
 
        location / {
            rewrite ^/(.*)$ /$1 break;
            proxy_pass   http://XXXXX;
            .
            .
            error_page 404 /index.html;
            error_page 500 502 503 504 /50x.html;
        }
        
        error_page 500 502 503 504 /50x.html;
        location = /50x.html{
        	root /sw/nginx/app/xxx/static/error/;
        }
        
}

2. ssl.conf

#ssl_conf
ssl_certificate     /sw/nginx/ssl/XXXX_crt.pem;
ssl_certificate_key /sw/nginx/ssl/XXXX_key.pem;

ssl_session_timeout    5m;
ssl_session_cache      shared:SSL:1m;
ssl_protocols          TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers            AESXXXXXXXXXXXXXXXXX:XXXXX:XXXX:XXX;
ssl_prefer_server_ciphers on;

3. nginx reload

# systemctl restart nginx
# nginx -s reload

Nginx Loal Balancing

1. 프록시 설정

  • 한 웹 서버 안에는 여러 서버가 있을 수 있습니다.
  • 그 각각의 서버들도 자기의 서버가 있고 웹 서버 안에 있는 이상 메인 도메인(퍼블릭 ip) 안에서 프라이빗 ip를 가지고 있는 것입니다.
  • 프록시 설정을 하면 퍼블릭 ip를 거친 요청만이 프라이빗 ip로의 요청 마무리를 통해 요청을 통한 원하는 응답을 가질 수 있습니다.
  • 클라이언트가 서버의 자원을 컨트롤하지 못하게 하려면 퍼블릭 ip, 웹 서버 안에서의 프라이빗 ip를 모두 알면 안됩니다.
  • 클라이언트는 퍼블릭 ip만 알고 있는 상황에서 요청을 하고, 이 퍼블릭 ip를 거치는 과정에서 여러 보안적 이슈를 해결할 수 있습니다.
  • 그 다음에 프록시의 역할
    즉, 요청하는 프라이빗 ip로의 연결을 대리(proxy)하는 것이 바로 프록시 서버의 역할입니다.
  • 여기서의 보안적 장점, 그리고 안전한 요청만을 받아 웹 서버 안에서 자동으로 요청하는 서버 ip로 연결해준다는 것에서 프록시 설정이 중요해지는 것입니다.

2. 로드밸런싱

  • 로드밸런싱도 프록시와 원리는 비슷합니다.
  • 웹 서버의 퍼블릭 ip(DNS)로의 요청을 받아 웹 서버 안에서 원하는 서버에 그 요청을 전달하는 것입니다.
  • 여기서 요청들을 웹 서버 안에서 서로 다른 여러 서버에 나눈다는 것은 아니고 한 웹 서버에 같은 서버를 여러 개 배치(쌍둥이)하고 수 많은 클라이언트의 같은 자원 요청을 했을 때, 한 서버에 그 요청을 링크하는 것이 아니고 여러 개의 같은 서버(쌍둥이)에 그 요청들을 나누는 것입니다.
  • 어차피 그 서버들은 쌍둥이
    즉, 같은 내용이기 때문에 응답 또한 당연히 같습니다.
  • 반복되는 요청을 여러 같은 서버들이 나누어 전담함으로써 과부하로 인한 서버에러를 피할 수 있는 것입니다.

Nginx 명령어

1. 상용 기본 명령어 및 설정

명령어 설명
nginx 기동
nginx -s stop 정지
nginx -s reload 재기동
nginx -t 설정 파일 체크
/etc/nginx main 설정 파일 위치
/etc/nginx/conf.d/ 각 서버용 설정 파일 위치

 


2. Nginx 명령의 옵션

명령어 설명
-?, -h nginx 명령어의 도움말 표시
-v nginx version
-V nginx를 make 했을 시, 컴파일러 또는 configure 옵션 표시
-t, -q nginx 설정 파일 오류 체크 (오류 체크 시, nginx 정지 상태에서 실행, 정상 메세지 출력)
-s stop 강제 종료
-s quit 실행 중 requestㅊ 처리 종료하고 nginx 정리
-s reload 설정 파일 다시 읽기
-s reopen nginx 재기동 중 로그 파일을 다시 오픈
-c 설정파일 지정한 설정 파일로 nginx 기동
-g global 디렉티스 설정 지정한 global 디렉티브의 설정으로 nginx를 기동 (부하 실험 등)
-p prefix default=/usr/local/nginx

 


Nginx 504 Gateway Time-out

  • nginx를 사용하다 보면 504 Gateway Time-out Error가 발생할 때가 있습니다.
  • 그 이유는 서버와 클라이언트간 proxy 연결 시간이 default인 60초를 넘어서 나타나는 것입니다.
  • 이를 해결하기 위한 방법은 server에서 설정을 바꿔주면 됩니다.
  • 60초 -> 300초
    • #nginx.conf
      
      server {   
        listen 8443 ssl http2;   
        server_name XXXXXXXX.com;   
        location / {      
          proxy_pass http://server-proxy;      
          proxy_connect_timeout 300;      
          proxy_send_timeout 300;      
          proxy_read_timeout 300;      
          send_timeout 300;   
          }
      }

Nginx 413 Request Entity Too Large 에러

  • nginx의 파일 업로드 크기를 정해야 합니다.
  • 설정되지 않은 경우 1MB가 넘는 경우 에러가 발생할 수 있습니다.
  • nginx의 허용 사이즈를 설정하는 방법은
    • $ vi /sw/nginx/nginx.conf
  • 설정된 부분으로 이동한 후 http {내용} 부분에 해당 속성과 값을 추가하거나 변경하도록 합니다.
  • 이때 client_max_body_size 속성과 값을 설정해야 합니다.
    • #nginx.conf
      http {
        # Set client upload size - 100Mbyte
        client_max_body_size 100M;
        ...
        ..
        .
      }
  • 이제 업르드 크기가 설정되었습니다. nginx를 재시작합니다.
    • nginx -s reload
  • 또는 server를 재시작할 수도 있습니다.
    • service nginx restart