현재 근무하는 회사에서 모델 서빙 인프라를 구축하는 일이 있었습니다. BentoML 기반의 서빙 시스템을 구축하였고, NGINX와 Gunicorn을 사용해서 인프라를 구축해야 했습니다. 이 때 NGINX에 대해 많이 공부하였는데, 이 기회를 빌어서 NGINX에 대해 포스트를 작성하고자 합니다.
웹개발을 공부하는 사람이라면 NGINX에 대해 들어보았을 것입니다. 물론 본인도 웹 인프라를 구성할 때 NGINX를 사용하여야 한다는 것을 들었었고 파이썬을 사용하여 인프라를 구성한다면, Gunicorn과 NGINX를 사용하여야 하여야 한다는 것으로 알고 있었습니다.
NGINX
일반적으로 NGINX는 WSGI의 앞단에서 위치하여 정적 파일 요청을 처리하고, 리버시 프록시 서버 역할도 수행한다고 합니다. 따라서 동적 처리는 Gunicorn에 넘기고, 이미지 요청등의 정적 파일 요청은 NGINX가 처리하는 것입니다. 크게 웹서버는 Apache와 NGINX를 사용하는데 두 웹서버는 아래와 같은 특징을 갖고 있습니다.
- Apache는 요청을 처리할 때 프로세스 혹은 스레드를 생성한다.
- NGINX는 이벤트 기반 비동기 방식을 사용한다.
따라서 NGINX는 Apache에 비하여 상대적으로 가벼운 특징을 갖고 있으므로 점유율이 점점 증가하는 추세입니다.
또한 NGINX는 클라이언트의 요청을 중간에 가로채어 요청을 받는 실제 서버에 전달하고, 요청에 대한 응답을 클라이언트에 전달하는 역할을 수행합니다. 이를 리버스 프록시라고 하는데, 이번 프로젝트에서도 NGINX의 로드밸런싱 기능을 유용하게 사용하였습니다. 여러대의 GPU를 갖고 있는 서버에 요청을 분배해야했는데, NGINX의 기능을 사용하여 손쉽게 로드밸런싱을 수행하여 작업을 적절히 분배할 수 있었습니다. 또한 SSL 인증 기능도 수행하여 HTTPS 통신도 수행할 수 있었고, 허가받은 아이피만 접속하거나 아이디 비밀번호를 통한 인증 기능도 사용하여 보안을 강화한 적이 있었습니다.