본문 바로가기
IT/Deploy

nginx는 왜 필요할까? nginx.conf 예시를 통해 알아보자

by Cyber_ 2024. 4. 18.

Nginx는 비동기 이벤트 기반 모델을 사용하는 경량 HTTP 서버이자 리버스 프록시 서버입니다. Nginx를 이해하기전의 웹의 작동방식을 살펴봅시다.

웹의 작동방식

  1. 브라우저가 DNS 서버로 이동하여 실제주소를 찾는다
  2. 브라우저는 HTTP 요청 메시지를 서버로 전송하여 웹사이트의 복사본을 클라이언트에게 보내도록 요청
  3. 이 메시지와 클라이언트와 서버간에 전송되는 모든 데이터는 TCP/IP를 사용하여 인터넷 연결을 통해 전송
  4. 서버가 클라리언트의 요청을 승인하면 "200" 메시지를 클라이언트에게 발송
  5. 웹 사이트의 파일을 패킷이라고 불리는 일련의 작은 덩어리로 브라우저에 보냄
  6. 브라우저는 작은 덩어리를 완전한 웹페이지로 조립하여 사용자에게 표시

HTTP server(Web Serer)

  • 소프트웨어 관점: 클라이언트로부터 HTTP 프로토콜로 요청을 받고 요청에 데해 응답하는 것
  • 하드웨어 관점: 위와 같은 기능을 제공하는 하나의 컴퓨터

웹 서버의 기본 역할

  • HTTP 요청 처리: 클라이언트로부터 HTTP 요청을 받고, 요청을 받은 파일이나 데이터를 클라이언트에게 전송
  • 정적 컨텐츠 제공: HTML, CSS, 이미지 등과 같은 정적 파일을 제공
  • 로깅: 요청에 대한 정보를 로그 파일에 저장하여 서버의 성능 모니털이 및 오류진단을 도와줌

Nginx의 필요성과 장점

성능과 효율성

  • 비동기 이벤트 기반 처리를 통해: 동시에 많은 연결을 효율적으로 처리
  • 특히 높은 트래픽을 처리할 때 CPU와 메모리 사용량을 최소화하면서 높은 성능을 유지합니다.스케일링 용이성

스케일링 용이성

  • 리버스 프록시로 사용될 때, 애플리케이션 서버들사이에서 클라이언트 요청을 분산시켜, 부하 균형을 맞추고 시스템의 안정성을 높일 수 있습니다.

보안 기능

  • HTTPS를 통한 보안 연결을 지원
  • 보안 정책 설정: Nginx 설정을 통해 보안 헤더를 추가하고, IP 기반의 접근 제어를 설정할 수 있습니다.유연성과 확장성

유연성과 확장성

  • 다양한 서드 파티 모듈을 지원하여 로드 밸런싱, 웹 애플리케이션 파이어월, 페이지 캐싱 등의 기능을 확장할 수 있습니다.콘텐츠 캐싱

콘텐츠 캐싱

  • 정적 파일뿐만 아니라 동적 컨텐츠도 캐싱하여 빠른 응답시간을 제공하고 백엔드 서버의 부하를 줄일 수 있습니다.

nginx.conf 예시

# 사용자 정의 및 기본 프로세스 설정
user nginx;  # Nginx가 실행될 사용자
worker_processes auto;  # 자동으로 프로세스 수를 결정 (CPU 코어 수에 따라 조절)

# 이벤트 모듈 설정
events {
    worker_connections 1024;  # 각 워커 프로세스 당 처리할 수 있는 최대 연결 수
}

# HTTP 서버 기본 설정
http {
    # 기본 파일 타입과 MIME 타입 설정
    include       mime.types;
    default_type  application/octet-stream;

    # 로그 설정
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    # SSL 설정
    ssl_protocols TLSv1.2 TLSv1.3;  # TLS 프로토콜 버전 지정
    ssl_prefer_server_ciphers on;   # 서버 측에서 암호 슈트 우선 순위 설정

    # 성능 최적화를 위한 설정
    sendfile        on;  # sendfile을 사용하여 파일 전송 처리 향상
    keepalive_timeout  65;  # keep-alive 연결 유지 시간

    # GZIP 압축 활성화
    gzip  on;
    gzip_disable "msie6";

    # 서버 블록 예시 (80 포트 리스닝)
    server {
        listen       80;
        server_name  example.com www.example.com;  # 처리할 서버 이름

        # SSL 리다이렉트 설정
        location / {
            return 301 https://$host$request_uri;  # 모든 요청을 HTTPS로 리다이렉트
        }
    }

    # SSL 서버 블록 예시 (443 포트 리스닝)
    server {
        listen       443 ssl;
        server_name  example.com www.example.com;

        # SSL 인증서 경로
        ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
        ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;

        # 컨텐츠 캐싱
        location / {
            root   /usr/share/nginx/html;  # 정적 파일의 루트 디렉토리
            index  index.html index.htm;
            try_files $uri $uri/ =404;  # 요청된 URI에 해당하는 파일 또는 디렉토리를 찾고 없다면 404 오류 처리
        }

        # 리버스 프록시 설정
        location /app {
            proxy_pass http://localhost:8080;  # 요청을 내부 애플리케이션 서버로 전달
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }

        # API 요청 처리를 위한 리버스 프록시
        location /api {
            proxy_pass http://localhost:8080;  # API 서버로 요청 전달
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
}

보안 인증서와 키 파일의 경로는 실제 사용환경에 맞게 변경해야합니다!!