Nginx
"NGINX is open source software for web serving, reverse proxying, caching, load balancing, media streaming, and more. It started out as a web server designed for maximum performance and stability. In addition to its HTTP server capabilities, NGINX can also function as a proxy server for email (IMAP, POP3, and SMTP) and a reverse proxy and load balancer for HTTP, TCP, and UDP servers." (출처: 공식 홈페이지)
"NGINX는 웹서버다. 웹서버는 인터넷 네트워크 위에서 HTTP 프로토콜을 이용해 HTML, CSS, JavaScript, 이미지와 같은 정보를 웹브라우저에게 전송한다." (출처: 생활코딩)
❓ 웹 서버(Web Server)
- 소프트웨어 + 하드웨어로 이루어짐.
- 하드웨어 : 웹서버가 설치된 시스템 컴퓨터
- 소프트웨어 : 웹 브라우저 클라이언트로부터 Request를 받아 정적인 컨텐츠(html , css 등)를 Response 로 보내는 프로그램.
- 기능 : 클라이언트의 요청에 응답을 보내는 역할을 한다.
- 정적인 컨텐츠 제공 → WAS 를 거치지 않고 서버의 자원을 제공한다.
- 동적인 컨텐츠 제공을 위한 요청 전달 → 클라이언트의 Request를 WAS에 보내고, WAS 가 처리한 결과를 전달받으면 해당 내용으로 클라이언트에 Response 를 보낸다.
- 웹서버 소프트웨어의 예: Apache, Nginx, IIS
Igor Sysoev originally wrote NGINX to solve the C10K problem, a term coined in 1999 to describe the difficulty that existing web servers experienced in handling large numbers (the 10K) of concurrent connections (the C). With its event‑driven, asynchronous architecture, NGINX revolutionized how servers operate in high‑performance contexts and became the fastest web server available.
- 동시접속 처리에 특화됨 (Apache보다 동작이 단순하고, 전달자 역할만 하기 때문)
- 비동기 처리 방식을 채택함
🍒 Nginx의 기본 설정은 다음 글을 통해 알아볼 수 있다. (활용 예정)
Nginx가 할 수 있는 역할들 중 몇 가지는 다음과 같다:
1) proxy
프록시 서버(proxy server)는 클라이언트가 자신을 통해서 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해주는 컴퓨터 시스템이나 응용 프로그램을 가리킨다. 서버와 클라이언트 사이에 중계기로서 대리로 통신을 수행하는 것을 가리켜 '프록시', 그 중계 기능을 하는 것을 프록시 서버라고 부른다. (출처: 위키백과)
효과
프록시 서버에 요청된 내용을 캐시해두는 경우,
- 해당 내용에 대한 요청은 원격 서버에 재접속할 필요가 없게 되므로 전송 시간이 절약된다.
- 불필요한 외부와의 연결을 최소화할 수 있다.
- 외부와의 트래픽을 줄임으로써 네트워크 병목 현상을 방지할 수 있다.
그 외에도 보안을 목적으로 사용한다.
2) reverse proxy
(관련 클라이언트들을 위해 임의의 서버에 접속하는 중간 매개체인 포워드 프록시(forward proxy)와는 반대로)
리버스 프록시는 관련 서버들을 위해 임의의 클라이언트가 해당 서버에 접속하는 중간 매개체이다.
클라이언트가 서버에 요청을 보내면, 프록시 서버가 배후 서버(reverse server)로부터 데이터를 가져온다. 여기서 프록시 서버가 Nginx, 리버스 서버가 응용프로그램 서버이다.
"웹 응용프로그램 서버에 리버스 프록시(Nginx)를 두는 이유는 요청에 대한 버퍼링이 있기 때문이다. 클라이언트가 직접 App 서버에 직접 요청하는 경우, 프로세스 1개가 응답 대기 상태가 되어야만 한다. 따라서 프록시 서버를 둠으로써 요청을 배분하는 역할을 한다." (출처: https://whatisthenext.tistory.com/123)
3) load balancer
to manage incoming traffic and distribute it to slower upstream servers
'upstream'이라는 옵션으로 Nginx에서 로드 밸런싱(Load Balancing) 기능을 사용할 수 있다.
로드 밸런싱 (Load Balancing)이란?
여러 서버에 작업량(workload)을 분산시켜 웹사이트, 애플리케이션, 데이터베이스 그리고 다른 서비스들의 성능(performance)과 신뢰성(reliablity)을 향상하기 위한 인프라 서비스이다. 즉, 한 곳에 집중되는 부하를 여러 곳으로 분산해준다.
Q. 로드 밸런서와 프록시의 차이가 뭐죠?
A. 로드밸런서와 프록시 간에 겹치는 부분이 있으나, 많은 프록시가 로드 밸런싱 기능을 수행할 수 있다고 이해하면 된다. (https://prohannah.tistory.com/67)
👉 추후에 다시 살펴볼 사이트: 로드밸런서(Load balancer)와 프록시(Proxy) 아직은 모르는 내용이 너무 많다..ㅎ
추가 👻
Django는 "웹 프레임워크"로서 "웹 애플리케이션 서버(WAS)"로 동작하며, "웹 서버"가 아니다. Django에서 사용하는 python manage.py runserver
는 디버깅 등의 간단한 작업을 수행하기 위한 용도이며, 배포할 프로젝트에서는 WSGI 서버와 웹 서버를 별도로 사용함이 권장된다 (공식문서). 즉, 다음과 같은 구조인 셈이다:
여기서 WSGI는 'Web Server Gateway Interface'의 약자로, Python 언어를 사용하지 않는 웹 서버들과 Django가 커뮤니케이션 할 수 있도록 해주는 인터페이스, 즉 미들웨어이다. 웹 서버에서 볼 때는 WAS 처럼, WAS에서 볼 때는 서버처럼 동작한다. WSGI 서버로는 gunicorn 이 대표적이다.
고로, Django 애플리케이션을 배포하기 위해서는 1) Apache나 Nginx 등의 웹 서버와 2) 웹 서버와의 간극을 메워줄 WSGI 서버가 필수이다.
※ 웹 서버와 웹 애플리케이션 서버의 기능을 분리하는 이유
- 서버의 부하 방지 : 두 개의 서버 프로세스가 별개의 작업을 처리하게끔 하여 동적 데이터를 처리하기 위해 상대적으로 바쁜 WAS에 가해지는 부하를 줄인다.
- 정적컨텐츠는 대체로 처리량이 많은 멀티미디어 컨텐츠가 많기 때문에 해당 요청까지 WAS가 처리하면 부하가 커지게 된다.
- 물리적으로 두 서버를 분리하여 보안을 강화한다.
- 대용량의 처리를 필요로 하는 웹 서비스의 경우는 웹 서버 하나에 여러 개의 WAS를 분산하여 연결할 수 있다.
- 백사이드/프론트사이드로 분리한 WAS를 연결하면 무중단 운영이 가능해진다.
- 하나의 웹 서비스에서 여러 개의 어플리케이션 서비스가 가능해진다. (예: 서버 하나에서 PHP와 Java 어플리케이션 동시 제공 가능)
(출처: https://my-repo.tistory.com/31)
참고
'서버' 카테고리의 다른 글
CI/CD (지속적 통합, 지속적 제공/배포) (Feat. Jenkins, Docker) (0) | 2022.03.25 |
---|---|
EC2와 SSH (0) | 2022.03.22 |