초보자의 입장에서 정말 처음 듣는 Web server, WSGI, WAS 개념 에 대해 공부한 내용을 정리해보았습니다.
Web Server 개념
웹 서버는 인터넷을 통해 클라이언트(사용자)의 요청을 받아들이고, 그 요청에 맞는 웹 페이지나 데이터를 제공하는 소프트웨어입니다.
클라이언트(브라우저)가 보낸 HTTP 요청을 수신합니다.
요청에 맞는 파일(HTML, CSS, 이미지 등)을 제공하거나, 웹 애플리케이션으로 요청을 전달합니다.
Apache, Nginx가 web server의 대표적인 소프트웨어 입니다.
Nginx
고성능 및 확장성
- 다중 요청 처리: Nginx는 이벤트 기반 아키텍처를 사용하여 높은 트래픽을 효율적으로 처리할 수 있습니다. 이는 많은 동시 연결을 지원하고, 적은 자원으로 많은 요청을 처리할 수 있게 합니다.
리버스 프록시 기능
- 로드 밸런싱: Nginx는 여러 서버에 트래픽을 분산시켜 로드 밸런서를 구현할 수 있습니다. 이를 통해 서버의 부하를 줄이고, 애플리케이션의 가용성을 높일 수 있습니다.
- 캐싱: 리버스 프록시로서 Nginx는 캐싱 기능을 제공하여 자주 요청되는 콘텐츠를 캐시하여 성능을 향상시킵니다.
보안
- SSL/TLS 종료: Nginx는 SSL/TLS 암호화를 처리하여 보안 연결을 제공합니다. 이를 통해 애플리케이션 서버는 복잡한 암호화 작업에서 벗어날 수 있습니다.
- DDoS 방어: 기본적인 DDoS 방어 기능을 제공하여 악의적인 트래픽을 차단할 수 있습니다.
정적 파일 서비스
- 정적 콘텐츠 제공: 이미지, CSS, JavaScript 파일과 같은 정적 파일을 효율적으로 제공할 수 있습니다. 이는 애플리케이션 서버의 부하를 줄이고 응답 속도를 향상시킵니다.
유연한 설정 및 모듈 지원
- 다양한 모듈: Nginx는 다양한 모듈을 통해 기능을 확장할 수 있습니다. 예를 들어, 압축, 리디렉션, URL 리라이트 등을 쉽게 설정할 수 있습니다.
Nginx vs Apache
아래는 Nginx와 Apache의 주요 기능과 차이점은 아래와 같습니다.
특징 | Nginx | Apache |
---|---|---|
아키텍처 | 이벤트 기반 아키텍처 | 프로세스 기반 아키텍처, 스레드 기반 아키텍처 |
처리 방식 | 비동기 방식, 논블로킹 | 동기 방식, 블로킹 |
성능 | 높은 동시 연결 처리, 낮은 메모리 사용 | 낮은 동시 연결 처리, 높은 메모리 사용 |
정적 콘텐츠 처리 | 매우 빠름 | 빠름 |
동적 콘텐츠 처리 | FastCGI, uWSGI, SCGI를 통한 외부 애플리케이션 처리 | 모듈을 통한 직접 처리 (mod_php, mod_perl 등) |
로드 밸런싱 | 기본 제공 | 모듈 필요 (mod_proxy_balancer) |
리버스 프록시 | 기본 제공 | 모듈 필요 (mod_proxy) |
SSL/TLS 지원 | 기본 제공, SSL 종료 가능 | 기본 제공 |
설정 파일 형식 | 단순하고 명확한 설정 파일 (nginx.conf) | 복잡하고 유연한 설정 파일 (httpd.conf, .htaccess 등) |
모듈 | 동적 모듈 지원, 모듈 추가를 위해 재컴파일 필요 없음 | 동적 및 정적 모듈 지원, 동적 모듈은 런타임 시 로드 가능 |
가용성 | 높은 가용성, 낮은 리소스 사용 | 유연한 설정 가능, 많은 리소스 사용 |
커뮤니티 및 지원 | 강력한 커뮤니티, 다양한 서포트 옵션 | 강력한 커뮤니티, 오랜 역사와 다양한 서포트 옵션 |
보안 | 기본적인 보안 기능 제공, DDoS 방어 | 다양한 보안 모듈 제공 |
사용 사례 | 정적 콘텐츠 제공, 리버스 프록시, 로드 밸런싱 | 동적 콘텐츠 제공, 복잡한 URL 재작성 및 관리 |
이벤트 기반? 비동기 방식?
서버가 많은 클라이언트 요청을 받았을 때, 각각의 요청을 처리하기 위해 새로운 프로세스를 만드는 대신, 하나의 프로세스에서 이벤트(요청)를 처리한다는 뜻입니다.
요청이 들어오면 이벤트 루프(Event Loop)라는 것이 그 요청을 비동기적으로 처리합니다.
비동기적으로 처리한다는 뜻은 요청을 처리할 때, 하나의 작업이 끝날 때까지 기다리지 않고 다른 작업을 계속해서 처리한다는 뜻입니다.
프로세스 기반 아키텍처? 동기 방식?
서버가 클라이언트 요청을 받을 때마다 새로운 프로세스를 만들어 그 요청을 처리합니다.
각 요청마다 새로운 프로세스를 만들기 때문에 자원을 많이 사용합니다.
요청을 병렬로 처리할 수 있지만, 많은 요청이 들어오면 서버에 부하가 많이 걸릴 수 있습니다.
동기 방식이기 때문에 하나의 요청을 처리할 때, 그 작업이 끝날 때까지 기다린 후에 다음 요청을 처리합니다.
요청 처리 속도가 느려질 수 있고, 많은 요청이 동시에 들어오면 서버에 부하가 걸릴 수 있습니다.
WSGI 개념
WSGI (Web Server Gateway Interface)는 웹 애플리케이션과 웹 서버 간의 표준 인터페이스입니다. django와 같은 Python 웹 애플리케이션이 웹 서버와 상호 작용할 수 있도록 해주는 프로토콜입니다.
아래 사진을 다시 보면 wsgi가 http 요청, 응답을 wsgi 표준을 이용해서 python에 전달하는 것을 볼 수 있습니다.
이는 Python 애플리케이션을 웹 서버와 독립적으로 만들 수 있게 하여, 다양한 웹 서버와 호환 가능하게 해줍니다.
Django에 간단한 WSGI가 포함되어 있습니다.
하지만 gunicorn이라는 WSGI를 따로 사용하는 게 좋은데요
Gunicorn을 사용하는 이유는 Django의 기본 WSGI 서버는 개발용으로 최적화되어 있지만, Gunicorn은 프로덕션 환경에서 더 안정적이고 성능이 뛰어난 멀티스레드 및 멀티프로세스 기능을 제공하기 때문입니다.
또한, Gunicorn은 다양한 웹 서버(Nginx 등)와 쉽게 통합되어 확장성과 유연성을 높일 수 있습니다.
Gunicorn 이란?
Gunicorn(Green Unicorn)은 Python WSGI(Web Server Gateway Interface) HTTP 서버입니다. 이는 Python 웹 애플리케이션을 프로덕션 환경에서 실행할 때 사용되며, 다음과 같은 주요 특징을 가지고 있습니다
간편한 설정 : Gunicorn은 설정과 사용이 매우 간편하며, 단 몇 줄의 명령으로 Python 애플리케이션을 실행할 수 있습니다.
멀티 프로세싱: Gunicorn은 멀티 프로세스 모델을 사용하여 다수의 워커 프로세스를 실행할 수 있습니다. 이를 통해 고부하 상황에서도 안정적인 성능을 제공합니다.
다양한 웹 프레임워크 지원: Flask, Django, Pyramid 등 다양한 Python 웹 프레임워크와 호환됩니다.
확장성 및 유연성: Nginx, Apache 등 다양한 리버스 프록시와 쉽게 통합할 수 있어, 확장성과 유연성이 뛰어납니다.
Gunicorn vs uWSGI
gunicorn외에 uwsgi라는 것도 있는데요. 차이를 테이블로 짧게 정리하면 아래와 같습니다.
특징 | Gunicorn | uWSGI |
---|---|---|
설명 | Python WSGI HTTP 서버 | 범용 애플리케이션 서버 및 프레임워크 |
설치 및 설정 | 간편하고 직관적인 설정 | 다소 복잡한 설정, 다양한 옵션 제공 |
아키텍처 | 멀티 프로세스 (multi-process) | 멀티 프로세스 및 멀티 스레드 (multi-process & multi-thread) |
성능 | 고성능, 적은 오버헤드 | 고성능, 다양한 최적화 옵션 제공 |
유연성 | 주로 Python WSGI 애플리케이션에 최적화 | 다양한 언어와 프로토콜 지원 (Python, Ruby, Perl 등) |
지원 웹 프레임워크 | Django, Flask 등 대부분의 Python 웹 프레임워크 지원 | Django, Flask 등 대부분의 Python 웹 프레임워크 지원 |
리버스 프록시 통합 | 주로 Nginx와 사용 | Nginx, Apache 등 다양한 서버와의 통합 지원 |
관리 기능 | 간단한 설정 파일, 기본적인 모니터링 기능 제공 | 고급 관리 및 모니터링 기능 제공 |
워크 프로세스 관리 | 단순한 워커 관리, 자동 재시작 기능 | 세밀한 워커 관리, 다양한 워커 타입 지원 |
애플리케이션 재시작 | 핫 코드 리로딩 미지원 | 핫 코드 리로딩 지원 |
Web server와 WSGI 중 하나만 사용?
Web server와 WSGI 중 하나만 사용할 수는 있지만 보통은 web server + wsgi 조합으로 사용합니다.
Gunicorn이 WSGI middleware로서 웹서버 역할을 수행하므로 Gunicorn만 써도 됩니다.
실제로 장고 서버에 gunicorn이라는 wsgi를 아래와 같은 명령어로 붙이면 정상적으로 서버로 작동하는 것을 확인 할 수 있습니다.
gunicorn --bind 0:8000 your_project.wsgi:application
하지만 WSGI가 Web server의 역할을 대체할 수는 없습니다.
Nginx과 같은 web server는 정적 파일 제공, 리버스 프록시, 로드 밸런싱 등을 담당하는 고성능 웹 서버입니다. 이런 기능들을 모두 놓칠 수 있는거죠.
Django는 특이하게 WSGI interface를 이미 어느 정도 구현했기 때문에 Nginx만 써도 되지만, seesion, cookie, routing 등의 기능을 수행하는 middleware가 없어서 하드코딩 해야 한다고 합니다.
WAS 개념 (Web Application Server)
웹 애플리케이션은 서버에서 실행되는 애플리케이션으로, 동적인 웹 페이지를 생성하거나 특정 기능을 제공하는 소프트웨어입니다.
사용자의 요청을 처리하고, 데이터베이스와 상호 작용하며, 사용자에게 동적인 콘텐츠를 제공합니다.
장고 혹은 node.js 같은 것들이 바로 Web application 인 것입니다.