트래픽이 많은 웹 사이트의 확장성을 위해 개발된 경량의 고성능 웹서버라고 한다.
아파치 웹서버에서 트래픽이 감당이 어려운 문제를 해결하기 위해 등장했다고 한다.
동시 접속 처리에 특화된 웹서버로,
클라이언트로부터 http 요청을 받아 요청에 해당하는 파일을 http 통신을 통해 응답해주는 프로그램
정적 컨텐츠 호스팅, 리버스 프록시, 캐싱, 로드밸런싱, 미디어 스트리밍 등 유용한 여러 역할을 수행한다고 한다.
대부분의 WAS 는 Web Server 기능을 제공하므로 Reverse proxy 가 없이 내부 WAS 가 직접 서비스를 제공해도 되지만 이렇게 구성하는 이유중 여러가지가 있다.
리버스 프록시의 웹서버를 리소스의 앞 단에 위치 시킴으로, DB와 연결된 WAS의 보안을 강화 할 수 있다.
Cache Server 를 붙이거나 SSL 하드웨어 가속기를 연동하는등 아키텍처 측면에서 성능 향상을 하기가 해진다.
리버시 프락시를 cluster로 구성해 놓으면 가용성을 높일 수 있고 사용자가 증가하는 상황에 맞게 Web Server 나 WAS 를 유연하게 늘릴 수 있는 장점이 있다
무중단 배포를 구현하는데 가장 저렴하고 쉬운 방법이다.
엔진엑스 기능 중 리버스 프록시 를 통해 무중단 배포 환경을 구축할 수 있다.
리버스 프록시란 엔진엑스가 외부의 요청을 받아 백앤드 서버로 요청을 전달하는 행위라고 할 수 있다.
리버스 프록시 서버(엔진엑스)는 요청을 전달하고, 실제 요청에 대한 처리는 뒷단의 웹 애플리케이션 서버들이 처리한다.
이 방식은 꼭 AWS와 같은 클라우드 인프라가 구축되어 있지 않아도 사용할 수 있는 범용적인 방법이다.
즉, 개인 서버 혹은 사내 서버에서도 동일한 방식으로 구축할 수 있다.
자세한 구축방법과 개념에 대해서는 아래 참조사이트를 확인하면 좋다.
참고 : https://doorisopen.github.io/spring/2020/03/18/spring-freelec-springboot-chap10.html
서버가 부담하는 부하를 분산해주는 기술을 로드밸런싱이라고 한다. 트래픽이 증가하면, 기존 서버의 성능을 높이는 scale up을 진행하거나, 물리적 또는 논리적으로 여러 대의 서버를 두어 트래픽을 분산시키는 scale out 방식을 취해 대처하는데, scale out 전략을 취할경우 로드밸런싱이 필요해진다.
서버가 두대 이상으로 늘어날때, nginx를 서버 앞에 두어서 WAS를 중계해주는 역할을 수행하게 하는데, 그때 Nginx가 받는 요청의 load를 고르게 들어가게 해주는것을 로드 밸런싱이라고 한다.
현재 프로젝트에서 사용중인 방법은 ReversProxy로 사용중이라고 볼 수 있다.
EC2에 서버를 Nginx를 통해 배포함으로서 서버의 확장성을 높이고, 중간에 암호화되어서 요청이 전달됨에 따라 보안성을 높일 수 있는 장점도 있다. 또한 Nginx를 통해서 SSL인증서를 등록하고 HTTPS통신을 가능하게 배포했다.
EDA(Eventt Driven Architecture)란?
분산된 시스템에서 이벤트를 생성(발행)하고 발행된 이벤트를 수신자에게 전송하는 구조로 수신자는 그 이벤트를 처리하는 방식의 아키텍처입니다.분산 아키텍처 환경에서 상호 간 결합도를 낮추기 위해 비동기 방식으로 메시지를 전달하는 패턴으로 주로 Message Broker(Kafka, RabbitMQ)와 결합하여 구성됩니다.
상세내용 및 출처: https://akasai.space/architecture/about_event_driven_architecture/
Nginx를 통해서 서버를 배포하는것은 생각보다 어렵지 않으나
Nginx가 어떤 역할을 하는지 모른다면 내가 개발한 코드내부에서 아무리 찾아봐도 왜 에러가 발생하거나 데이터 통신이 되지않는지 이유를 찾기가 정말 어렵다(경험)... 간단한 명령어와 Nginx의 개념 그리고 어떤 추가설정들이 있는지 공부를 하고 사용하면 활용도가 정말 높아지는 기술이라고 생각된다.
위 3개의 참고 사이트에 감사하면서 이번 프로젝트에서 성공적으로 알람기능을 만들 수 있었다.
추가적으로 SSE연결이 1분마다 연결을 지속적으로 시도한다면(Time out) Nginx의 proxy_header_readtime의 기본값이 60s 이기 때문이다 이부분을 변경해도록 하자.
그리고 별도로 코드에서도 timeOut을 지정해주는 부분이 필요하다.