사용자가 어플리케이션을 사용하기 위해서는 반드시 배포작업을 거쳐야한다. 최근 웹서버로 NGINX를 많이 쓰는 것을 볼 수가 있는데 과연 이놈이 어떤 놈인지 알아보고 사용해보자.
web server의 종류로는 apche, nginx 등 여러 종류가 존재한다. 그 중 Nginx는 비동기식 이벤트 기반에 가벼움과 높은 성능을 목표로 하는 Web server 소프트웨어이다. 그리고 동시에 높은 성능의 로드밸런서, 웹서버, 리버스 프록시, API게이트웨이이다.
Nginx가 높은 성능을 가질 수 있는 이유는 요청에 응답하기 위한 비동기식 이벤트 기반 구조이기 때문이다. 구글 검색엔진에서 Nginx와 함께 상위 랭킹을 차지하고 있는 Apache는 nginx와 다르게 스레드/프로세스 기반 구조를 가진다.
스레드/프로세스 기반의 구조는 클라이언트 하나당 스레드 하나를 사용하기 때문에 클라이언트가 많아질수록 계속해서 스레드가 생성되게 된다. 즉, 서버에 많은 부하가 가게 된다. 그러나 Nginx는 비동기식 구조이기 때문에 모든 클라이언트의 요청을 쓰레드가 아닌 event handler가 처리한다. 따라서 스레드의 사용이 적으므로 Nginx의 서버 자원 활용 능력이 더 좋다.
[Nginx의 구조]
[Apache의 구조]
리버스 프록시와 함께 일반 포워드 프록시에 대해서도 간단하게 알아보자. 포워드 프록시는 서버가 존재하는 인터넷에 접속하기 전에 사용자의 request를 받아 서버로 전달하고 요청에 대한 서버의 응답을 다시 사용자에게 전달하는 중개인 역할을 한다.
[포워드 프록시]
이미지 출처 : https://www.lesstif.com/system-admin/forward-proxy-reverse-proxy-21430345.html
포워드 프록시의 한 예로, 특정 기관에서 방화벽을 세워 인터넷 접속에 제한을 두어 일부 인터넷만 사용하는 것이 있다. 즉, 사용자들이 인터넷에 접속하기 전 하나의 중개인(proxy)를 두어 보안성을 높인다.
[리버스 프록시]
이미지 출처 : https://www.lesstif.com/system-admin/forward-proxy-reverse-proxy-21430345.html
한편 리버스 프록시는 인터넷 내부에서 서버들 앞단에 위치한다. 어떤 서버에 request를 보낼지 결정하고 효율적이고 안전하게 요청/응답을 관리하기 위한 목적을 가진다. Nginx는 이처럼 서버들 앞에 proxy를 세워두고 사용하는 리버스 프록시이다.
프록시와 리버스 프록시에 대한 차이점과 리버스 프록시에 대한 장점은 다음 링크를 참조한다.
https://www.lesstif.com/system-admin/forward-proxy-reverse-proxy-21430345.html
주소를 분기해서 프론트엔드와 백엔드를 나눈 뒤 두 부분에 대한 설정을 모두 .conf에 작성하여 배포할 수 있다. 이 경우가 정적인 파일들을 서비스하는 Webserver, 백엔드의 API gateway로서의 역할을 하는 nginx이다.
frontend, backend, db가 있는 서비스 구조를 가지고 말하자면, 이미지나 css 등 정적 리소스에 대한 요청을 NGINX가 처리하도록 하고, 동적으로 계산하거나 전달해야하는 것들은 WAS에 맡기도록 한다. 마지막으로 DB에 대한 요청은 DB서버가 처리하도록한다. 이렇게 서비스를 담당하는 서버를 분할함으로써 보다 효율적으로 서버관리를 할 수 있다.
물론 프론트와 백엔드를 합쳐서 배포해도 된다.예를 들어, spring boot나 java 기반의 어플리케이션을 개발하다보면 webpack으로 하나의 실행 파일인 .jar파일로 백엔드와 프론트엔드를 합쳐서 배포할 수 있다. 나는 스프링부트 기반의 .jar파일을 배포하였는데 사실 https를 지원하기 위해서 nginx를 설치하였다. 이에 대해서는 다른 포스팅에서 이야기 해보고자 한다.
NGINX는 80번 443포트를 사용하여야 한다. 아무 포트를 사용해서 배포하면 안된다. 이는 인터넷 제공자(ISP ex. KT, SKT...)에 따라서 닫혀 있는 포트들이 있을 수 있기 때문이다. 당연히 사용자들이 접속하는 환경의 인터넷 제공자가 모두 동일하지 않게 때문에 닫혀있는 포트들 역시 각기 다를 수 있다. 따라서 내가 20003번 포트에서 배포를 했는데 KT에서는 20003포트를 닫아놨다면 해당 환경의 사용자들은 서비스에 접근할 수 없을 것이다. 따라서 어느 곳에서는 사용할 수 있고, 어느 곳에서는 사용할 수 없는 경우가 발생하게 된다. 이러한 이유를 알리 없는 사용자들은 당연히 서비스가 안된다고 생각하고 사용하지 않을 수도 있다...ㅠㅠ
그.래.서 http와 https인 80,443번 포트를 사용한다.
인터넷 상에서 이루어지는 요청과 응답 중에 회원가입등의 민감 정보들이 오갈 수 있기 때문에 사용자의 정보를 보호하기 위해서는 해당 데이터에 대한 암호화작업을 해야한다. 통신이 이루어질 때마다 민감 정보 데이터를 암호화하는 방법도 있겠지만 번거롭기에 주로 SSL혹은 TLS의 보안프로토콜을 적용한다. niginx는 http에 SSL, TLS프로토콜 기반 인증서를 적용하여 https프로토콜을 지원한다. 특히 cerbot라이브러리를 통해 무료 ssl 인증서를 발급받아 https를 지원하게 할 수 있다.
(https와 ssl/tls 보안 프로토콜도 웹 서비스에서 중요한 개념이니 다음에 포스팅할 기회가 있었으면 좋겠다..)
nginx의 기본 개념 및 정리 :
https://ko.wikipedia.org/wiki/Nginx
https://developer88.tistory.com/299
nginx의 비동기 구조 :
https://m.blog.naver.com/jhc9639/220967352282
https://smjeon.dev/etc/nginx/
https://blog.naver.com/jhc9639/221108496101
ssl/tls:
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=hai0416&logNo=221623579719
와 엔진엑스 정리 잘하셨네요 잘봤습니다