동시 접속 처리에 특화된 웹서버로 클라이언트로부터 http 요청을 받아 요청에 해당하는 파일을 http 통신을 통해 응답해주는 프로그램이다. 웹서버 특성상, WAS와는 다르게 정적 컨텐츠 호스팅에 특화되어있고 이 밖에 리버스 프록시, 캐싱, 로드 밸런싱, 미디어스트리밍 등 유용한 여러 역할을 수행한다.
리버스 프록시는 외부에 노출시키려는 리소스 앞 단에 위치한다. 리버스 프록시를 수행하는 Nginx의 역할은 다음 그림과 같다.
리버스 프록시와 포워드 프록시의 차이는 아래의 두 그림에서 보여지는 것처럼 웹서버의 위치가 다르다는 점이다.
출처: https://www.lesstif.com/system-admin/forward-proxy-reverse-proxy-21430345.html
대부분의 WAS 는 Web Server 기능을 제공하므로 Reverse proxy 가 없이 내부 WAS 가 직접 서비스를 제공해도 되지만 이렇게 구성하는 이유중 여러가지가 있다.
리버스 프록시의 웹서버를 리소스의 앞 단에 위치 시킴으로, DB와 연결된 WAS의 보안을 강화 할 수 있다.
Cache Server 를 붙이거나 SSL 하드웨어 가속기를 연동하는등 아키텍처 측면에서 성능 향상을 하기가 해진다.
리버시 프락시를 cluster로 구성해 놓으면 가용성을 높일 수 있고 사용자가 증가하는 상황에 맞게 Web Server 나 WAS 를 유연하게 늘릴 수 있는 장점이 있다
가장 저렴하고 쉽게 무중단 배포를 구축할 수 있다. 리버스 프록시를 통해 환경을 구축하는데, 이러한 구조로 무중단 배포 자동화를 구현한다.
출처: https://doorisopen.github.io/spring/2020/03/18/spring-freelec-springboot-chap10.html
서버가 부담하는 부하를 분산해주는 기술을 로드밸런싱이라고 한다. 트래픽이 증가하면, 기존 서버의 성능을 높이는 scale up을 진행하거나, 물리적 또는 논리적으로 여러 대의 서버를 두어 트래픽을 분산시키는 scale out 방식을 취해 대처하는데, scale out 전략을 취할경우 로드밸런싱이 필요해진다.
서버가 두대 이상으로 늘어날때, nginx를 서버 앞에 두어서 WAS를 중계해주는 역할을 수행하게 하는데, 그때 Nginx가 받는 요청의 load를 고르게 들어가게 해주는것을 로드 밸런싱이라고 한다.
설정방법:
1. https://kamang-it.tistory.com/entry/WebServernginxnginx%EB%A1%9C-%EB%A1%9C%EB%93%9C%EB%B0%B8%EB%9F%B0%EC%8B%B1-%ED%95%98%EA%B8%B0
2. https://velog.io/@kimjiwonpg98/Nginx-%EB%A1%9C%EB%93%9C%EB%B0%B8%EB%9F%B0%EC%8B%B1-%EA%B0%9C%EB%85%90-%EB%B0%8F-%EA%B5%AC%EC%B6%95
Apache 보다는 단순하고, 비동기 event-driven 기반 구조를 가지고 있다.
Apache는 다중처리 모듈 방식으로 요청을 처리하기에 접속때마다 thread가 생성이 되는 구조여서 동시 접속 요청시 효율성 측면에서 취약한 반면, Nginx는 Event-driven 방식을 수행하기에, 한 개 또는 고정된 프로세스만 생성 하고, 그 프로세스 내부에서 비동기 방식으로 효율적으로 작업을 처리한다. 따라서 동시 접속 요청이 많아도 Process 또는 Thread 생성 비용이 존재하지 않는다.
프로젝트에 웹소켓 이용한 채팅 및 알림기능이 포함되기 때문에 Nginx로 배포를 하는것이 여러모로 유용할 것 같았다. Nginx를 선택한 이유는 다음과 같다.
채팅 기능 때문에 동시 접속자 수의 증가에 대해 대응하기에 적합한 방식의 웹서버라고 생각했다.
서버 확장에 용이하고, 보안적으로도 더 뛰어났다.
서버가 두대 이상이 될 경우 서버 부하를 줄여 준다.
CORS 세팅에 용이하다.
무중단 배포가 가능하여 채팅 기능이 있는 웹사이트이기에 배포시 중단되지 않는점이 사용자들에게 사용성 및 편의성을 증대시킨다.