nginx? web-server? was?

1

Nginx란 무엇인가?

우리 프로젝트는 node-js를 이용해서 동작하고 있습니다. 그런데 우리서버에 nginx를 적용하라고 하셨습니다. nginx에 대해 찾아보니 웹서버의 한종류라고 나와있었습니다. node-js가 이미 웹서버인데, 웹서버에 웹서버를 적용하라고?.. nginx로 다시 웹서버를 만들라는 건가?


WAS와 Web-Server의 차이

사실 우리의 node-js로 구동되고 있는 서버는 Web Server가 아니라 WAS 입니다.

Web ServerWAS는 모두 웹 애플리케이션을 실행하기 위한 소프트웨어입니다. 클라이언트에게 정보를 전달한다는 공통점이 있죠, 하지만 Web Server는 HTML, CSS, 이미지 파일 등과 같은 정적인 파일을 클라이언트에게 제공합니다. 반면 WAS는 동적인 콘텐츠를 생성하고 처리하기 위한 기능을 제공합니다. Web Server와는 달리, 데이터베이스와의 연동, 비즈니스 로직 실행, 세션 관리 등과 같은 웹 애플리케이션의 동적인 처리를 담당합니다.

web-server 에는 nginx, apache 등이 있고 WAS에는 우리가 개발을 하는 spring, node-js, django등이 있죠.


클라이언트가 웹 애플리케이션에 요청을 보내면, 웹 서버는 해당 요청을 받아들입니다. 웹 서버는 정적인 콘텐츠(HTML, CSS, IMG…)에 대한 요청인 경우, 그에 맞는 파일을 찾아 클라이언트에게 반환합니다. 그러나 동적인 처리가 필요한 경우, 웹 서버는 해당 요청을 WAS로 전달합니다.

WAS는 클라이언트의 요청을 받아 애플리케이션 로직을 실행하고 동적인 데이터를 생성합니다. 이 데이터는 WAS가 다시 웹 서버로 전달합니다. 웹 서버는 이를 클라이언트에게 전송하여 결과를 보여줍니다. 이를 통해 클라이언트는 WAS로부터 생성된 동적인 데이터를 웹 서버를 통해 수신하게 됩니다.


왜 굳이 nginx를 사용할까?

그럼 node.js가 정적, 동적인 콘텐츠에 대해 모두 처리해주면 되는데 왜 nginx를 사용할까요? nginx를 사용하면 무슨 이점이 있을까요?

was의 할일 분산

우선 당연히 정적 콘텐츠는 nginx가 처리해주기 때문에 우리의 node.js서버의 부담이 줄어들 것입니다. 마치 cpu와 gpu의 관계같네요. 또한 Nginx는 정적 파일을 효율적으로 서빙하는데 최적화되어 있어, 정적 파일의 전달에 매우 빠르고 경량적이기 때문에 웹 애플리케이션의 성능을 향상시킬 수 있습니다.


reverse proxy

저희 프로젝트에서 nginx를 도입한 이유 입니다. reverse proxy가 무엇이냐? 그전에 proxy란 무엇일까요?

프록시(proxy)는 클라이언트와 서버 사이에서 중계 역할을 수행하는 컴퓨터나 애플리케이션입니다. 프록시는 클라이언트와 서버 간의 통신을 대리하고 필요한 중개 작업을 수행하죠.

포워드 프록시(foward-proxy)는 클라이언트와 인터넷 사이에 위치하여 클라이언트의 요청을 인터넷으로 전달합니다.

리버스 프록시는(reverse-proxy) 는 인터넷과 서버사이에 존재하며 클라이언트가 인터넷에 데이터를 요청하면 리버스 프록시 서버가 해당 요청을 받아 내부 서버에서 데이터를 받은 후 클라이언트에게 응답한다.

포워드 프록시(foward-proxy)를 사용하면 클라이언트를 감출 수 있습니다.

요청 받는 서버는 포워드 프록시 서버를 통해서 요청을 받기 때문에 클라이언트의 정보를 알 수 없습니다.

리버스 프록시는(reverse-proxy) 는 반대로 서버를 감출 수 있습니다.

클라이언트는 리버스 프록시 서버에게 요청하기 때문에 실제 서버의 정보를 알 수가 없습니다.

80번 포트는 일반적으로 HTTP 트래픽을 처리하는 포트이고, 443번 포트는 HTTPS 트래픽을 처리하는 포트입니다. 그리고 우리는 HTTP와 HTTPS에 대한 차이점을 앞선 글에서 공부하였습니다.

nginx는 http로 80번 port에 들어온 요청들을 앞에서 먼저 대리로 받은 다음, 443번 port redirect시켜서 보내줍니다. 그리고 4000번에서 작동하고 있는 node.js서버로 요청이 가게 되죠. 이렇게 리버스 프록시는(reverse-proxy)를 통해 서버를 감추고, SSL/TLS 암호화를 사용하여 데이터를 안전하게 전송할 수 있게 됩니다.


load balancing

nginx는리버스 프록시는(reverse-proxy)로 사용할 수 있다고 하였습니다. 이를 통해 클라이언트 요청을 받아 웹 애플리케이션 서버로 전달하고, 애플리케이션 서버의 응답을 클라이언트에게 전달할 수 있습니다. 이 과정에서 nginx는 각 요청이 어디로 갈지 정해주는데요 , 만약 우리가 서버를 두대 이상 띄웠다면 nginx는 요청으로 인한 부하(load)가 균형(balancing)있게 들어가게 해주는 로드 밸런싱 역할을 하게 됩니다.


caching

nginx는 캐싱 기능도 제공합니다. nginx는 이전에 요청된 리소스의 사본을 저장하여 동일한 요청이 발생할 때 원본 서버에 다시 접근하지 않고 사본을 반환함으로써 응답 시간을 단축시킵니다.


보안

Nginx는 보안 헤더를 설정하여 애플리케이션의 보안을 강화, IP 기반의 접근 제어 리스트(Access Control List, ACL)를 사용하여 특정 IP 주소 또는 IP 범위의 액세스를 제어, 또한 DDoS(Distributed Denial of Service) 공격에 대응하기 위한 다양한 기능을 제공합니다.


ssl 지원

그리고 가장 중요한 점인 클라이언트와 서버 간의 통신에 SSL/TLS 프로토콜을 사용할 수 있습니다. 우리가 앞서 공부했던 https통신에 사용된 ssl방식을 이용해 client에게 요청을 받고 응답을 줄 수 있는 것이죠.

이외에도 nginx가 지원하는 기능은 매우 많습니다. 사용하지 않을 이유가 없겠네요

profile
https://www.youtube.com/watch?v=__9qLP846JE

0개의 댓글