본 게시글은 직접 공부한 내용을 바탕으로 작성한 글입니다.
만약 틀린 부분이 있다면 댓글을 통해 말해주시면 감사하겠습니다.
웹서버의 역할은 뭘까요?
서버 개발자는 개발을 하며 웹서버, 웹서버 합니다.
그리고 우리는 node.js를 이용하여 처음 개발을 시작하며 node.js를 사용해서 "웹서버를 연다!"라고 배우며 node.js를 배우기 시작하죠, 하지만 우리는 지금 Nginx에 대해 공부하고 있습니다.
그런데 어라? 조금 찾아보니 Nginx도 웹서버라고? 라는 생각이듭니다. 이에 대해 설명해 보겠습니다.
웹서버
서버 개발자가 말하는 웹서버는 일반적으로 아래와 같은 구조의 형태를 말하는 웹 서버입니다.
web server → was (web application server) → database
이 일반적인 웹서버는 어떤 역할을 할까요?
클라이언트로부터 HTTP 요청을 받아들이고, 요청에 해당하는 컨텐츠를 제공하는 역할을 합니다.
이때, web server와 WAS 의 차이점은 정적인 파일과 동적인 처리이후 응답한다는 차이가 있습니다.
web server는 정적인 파일에 대해 응답합니다. 예를들어 HTML, CSS, 자바스크립트, 이미지 등입니다.
WAS는 요청에 대해 동적인 처리를 한 이후 응답합니다. 예를들어 아이디 비밀번호에 대해 로그인 처리를 요청한다면, 그 로그인 처리를 진행하는겁니다. 이때, 이 로그인 로직에 대해 갖고 있는 것이 WAS입니다.
그럼 다시 위 구조를 정리해보자면 아래와 같이 나타낼 수 있습니다.
web server (Nginx) → WAS (node.js) → database (mariaDB/mongoDB)
web server를 왜 운영해?
우리는 node.js를 공부할 때 분명 웹 서버의 역할을 한다고 하지 않았나?라고 공부합니다.
결론적으로 말씀 드리자면 WAS의 부담을 줄이기 위해 만들어졌습니다.
WAS가 다양한 동적 처리를 하며 시간을 할애할 때 정적인 파일에 대한 응답까지 할 여유가 없는것입니다. 따라서 이런 정적인 처리를 맡기는겁니다.
그럼 이 web server(Nginx)의 역할은 무엇이 있을지 한번 알아보겠습니다.
web server(Nginx)의 역할
리버스 프록시로 사용이 가능하다
프록시는 forward proxy와 reverse proxy가 있습니다.
포워드 프록시는 클라이언트와 인터넷 사이에 있는 것을 말합니다. 리버스 프록시는 인터넷과 백엔드 사이에 있는 서버(web server, was등)를 이야기합니다. 리버스 프록시로 사용 가능하다는 것이 무엇이고 왜 좋을까요?
만약 우리가 2대의 WAS서버를 사용중입니다.
프록시 서버 Nginx가 “너는 1번 was로 가, 너는 2번 was로 가”와 같이 길을 정해줄 수 있습니다. 이러한 행위를 로드 밸런싱이라고 합니다. 즉, 이러한 로드 밸런싱을 리버스 프록시가 해줄 수 있습니다.
또한, 캐싱 서버 기능을 합니다. (이때 redis의 캐싱과는 다릅니다. 이에 대해서는 아래에서 이어나가겠습니다.)
만약 리버스 프록시 서버는 한국, 실제 서버는 미국에 있다면 지리적으로 멀기에 페이지 접속시 네트워크상 지연이 발생할 수 있습니다. 이때 리버스 프록시 단에서 캐싱하게 된다면 미국까지 가지 않고 한국에서 캐시해둔 데이터를 주며 네트워크 지연을 방지 가능합니다.
이 캐싱이라는 것이 레디스의 캐시 서버와 헷갈릴 수 있습니다. 제가 이해한 바로는, 레디스를 WAS단에서의 캐싱은 key-value쌍 데이터에 대해 캐시를 합니다. 따라서 둘은 사용되는 영역이 다릅니다. 즉, 저 개인적으로는 nginx를 이용한 캐싱은 페이지에 대한 web server단의 캐싱(물론 이미지 등도 가능합니다.) redis는 데이터에 대한 WAS단에서의 캐싱으로 이해하였습니다.
캐시라는 용어는 광범위하게 사용되어, 무언가 요청이 있을 때 한번 조회한 것에 대해 갖고 있다가 주는 것은 다 캐시서버다 (캐시서버도 종류별로 용도가 다르다)라고 이해하고있습니다.
또 보안 효과도 있습니다. WAS의 응답에는 다양한 정보가 담겨있습니다. 이러한 데이터에 대해 리버스 프록시가 암호화를 해주는 기능을 합니다.
SSL 지원
SSL은 HTTPS 인증 처리 보안에 관한 것인데요. Nginx는 이러한 HTTPS의 인증서를 제공할 수 있습니다.
웹페이지 접근 인증을 해줍니다.
사용자가 로그인을 할 경우, 이 로그인에 대해 WAS에서 올바른 사용자인지 검증할 수 있습니다. 하지만 이에 대해 굳이 WAS에서 하지 않고 Nginx가 해줄 수 있습니다.
비동기 처리
아파치와의 차이점입니다. 아파치의 경우 클라이언트의 요청마다 각 하나의 프로세스를 할당받습니다. 이렇게 될 경우 많은(1만개 이상) 클라이언트의 요청에 응답할 수 없습니다(=C10K문제). Ningx는 “이벤트루프” 방식을 사용합니다.이는 nodejs도 마찬가지인데요, 이 nodejs가 비동기로 작동하도록 해주는 것이 이벤트루프 입니다.
nginx 또한 비동기처리, nodejs 또한 비동기처리를 이용하기에 web server단에 nginx, was단에 nodejs를 사용하여 성능의 향상을 노릴 수 있습니다.
'Web' 카테고리의 다른 글
[NestJs/트러블슈팅] mongoDB document 반환 (0) | 2023.11.20 |
---|---|
[NestJs/트러블슈팅] NestJs에서 mongoDB find(), virtual field (0) | 2023.10.26 |
[좋은 웹 API 디자인] 사용하기 좋은 API 디자인 (0) | 2023.03.03 |
[좋은 웹 API 디자인] API 디자인 기초 (0) | 2023.03.01 |
[OAuth2.0] 카카오 로그인 구현 (0) | 2023.02.25 |