100===Dev Ops/Nginx

Nginx - 고성능 웹 서버 완전 정복하기 🚀

블로글러 2024. 5. 26. 11:07

웹 서비스를 운영하다 보면 갑자기 트래픽이 폭증할 때가 있습니다. 마치 한가한 도로에 갑자기 차가 밀려드는 것처럼요. 이럴 때 필요한 것이 바로 효율적인 교통 정리원 같은 존재인데요, 웹 서비스 세계에서 이 역할을 하는 것이 바로 Nginx입니다.

여러분이 일상에서 택배를 받는 상황을 생각해보세요.

  • 기존 웹 서버는 택배를 받을 때마다 새로운 직원을 고용하는 회사와 같습니다.
  • 반면 Nginx는 소수의 능숙한 직원이 체계적으로 많은 택배를 동시에 처리하는 시스템과 유사합니다.

왜 필요한가?

Nginx가 해결하는 문제들은 다음과 같습니다:

  1. 높은 동시성 처리: 수천 개의 연결을 동시에 효율적으로 처리합니다.
  2. 리소스 효율성: 적은 메모리와 CPU로 높은 성능을 제공합니다.
  3. 확장성: 트래픽 증가에 따라 유연하게 확장 가능합니다.

기본 원리

Nginx의 핵심 원리를 알아볼까요?

이벤트 기반 비동기 아키텍처

작업 요청 → 이벤트 큐에 등록 → 작업 완료 시 처리 → 다음 작업 진행

기존의 Apache와 같은 웹 서버는 클라이언트 요청마다 새로운 프로세스나 스레드를 생성합니다. 많은 사용자가 동시에 접속하면 그만큼 많은 프로세스가 생성되어 서버 리소스를 빠르게 소모하게 됩니다.

반면 Nginx는 비동기 이벤트 기반 구조로 작동합니다. 이 구조에서는 적은 수의 프로세스로 많은 요청을 처리할 수 있어 메모리 사용량이 적고 CPU 부하도 줄어듭니다.

마스터-워커 프로세스 구조

Nginx는 하나의 마스터 프로세스와 여러 워커 프로세스로 구성됩니다.

마스터 프로세스:

  • 설정 파일 읽기 및 유효성 검사
  • 워커 프로세스 관리
  • 설정 변경 시 재로드 처리

워커 프로세스:

  • 실제 클라이언트 요청 처리
  • CPU 코어당 하나의 워커 프로세스(기본 설정)
  • 비동기 처리로 인해 하나의 워커 프로세스가 수천 개의 연결 처리 가능
Master Process
    ├── Worker Process 1 (CPU 코어 1)
    │     └── 수천 개의 연결 처리
    ├── Worker Process 2 (CPU 코어 2)
    │     └── 수천 개의 연결 처리
    └── Worker Process n (CPU 코어 n)
          └── 수천 개의 연결 처리

실제 예제

Nginx의 다양한 활용 방법을 살펴보겠습니다.

기본 웹 서버 설정

http {
    server {
        listen 80;
        server_name example.com;

        location / {
            root /var/www/html;
            index index.html;
        }
    }
}

이 설정은 example.com으로 오는 요청을 /var/www/html 디렉토리의 파일로 서비스합니다.

리버스 프록시 설정

http {
    server {
        listen 80;
        server_name example.com;

        location / {
            proxy_pass http://backend_server:8080;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}

이 설정은 example.com으로 오는 모든 요청을 backend_server:8080으로 전달합니다. 클라이언트는 Nginx와만 통신하고, Nginx가 백엔드 서버와 통신하여 결과를 클라이언트에게 전달합니다.

로드 밸런싱 구성

http {
    upstream backend_servers {
        server backend1.example.com:8080;
        server backend2.example.com:8080;
        server backend3.example.com:8080;
    }

    server {
        listen 80;
        server_name example.com;

        location / {
            proxy_pass http://backend_servers;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}

이 설정은 여러 백엔드 서버에 트래픽을 분산시켜 부하를 분산합니다. 기본적으로 라운드 로빈 방식으로 분산되지만, 다른 알고리즘도 설정 가능합니다.

상황 일반적인 방법 Nginx 활용 방법 개선효과
정적 파일 서빙 WAS에서 모든 요청 처리 Nginx가 정적 파일 처리, WAS는 동적 요청만 처리 WAS 부하 50% 감소
고트래픽 처리 서버 수직 확장(스펙 업그레이드) Nginx를 통한 로드 밸런싱으로 수평 확장 비용 효율성 증가, 무중단 확장 가능
SSL 암호화 각 애플리케이션에서 처리 Nginx에서 SSL 종단 처리 CPU 사용률 감소, 보안 관리 단순화

주의사항 및 팁 💡

⚠️ 이것만은 주의하세요!

  1. 설정 파일 문법 오류

    • 설정 변경 후 항상 nginx -t 명령으로 문법 검사를 하세요.
    • 오류가 있으면 서버가 시작되지 않거나 재로드되지 않습니다.
  2. 워커 프로세스 수 과다 설정

    • CPU 코어 수보다 많은 워커 프로세스를 설정하면 성능이 저하될 수 있습니다.
    • worker_processes auto;를 사용하여 자동 설정하는 것이 좋습니다.
  3. 버퍼 크기 설정 부족

    • 큰 요청이나 응답을 처리할 때 버퍼 크기가 부족하면 성능이 저하됩니다.
    • client_body_buffer_size, client_header_buffer_size 등의 설정을 적절히 조정하세요.

💡 꿀팁

  • 정적 파일 캐싱을 활성화하여 성능을 대폭 향상시키세요.
  • GZIP 압축을 사용하여 네트워크 대역폭을 절약하세요.
  • 모니터링 도구를 설정하여 Nginx의 성능을 지속적으로 관찰하세요.
  • 설정 파일을 작은 단위로 분리하여 관리하면 유지보수가 용이합니다.

마치며

지금까지 Nginx의 기본 개념부터 고급 설정까지 알아보았습니다. 처음에는 어렵게 느껴질 수 있지만, 이벤트 기반 아키텍처의 강력한 성능과 다양한 기능을 활용하면 웹 서비스의 안정성과 성능을 크게 향상시킬 수 있습니다.

이 글이 여러분의 Nginx 이해와 활용에 도움이 되었기를 바랍니다!

혹시 궁금한 점이 있으시거나, 더 알고 싶은 내용이 있으시면 댓글로 남겨주세요.

참고 자료 🔖


#Nginx #웹서버 #리버스프록시 #로드밸런싱 #성능최적화

728x90