Dev/Deployment

[Deployment] NGINX

隣席の開発者群 2024. 6. 8. 15:38
반응형

웹 서버계의 셀럽.

 

연달아 글을 써제끼는데 어쩔 도리가 없다. 배포 얘기 한번 하면 그 사이에 낑겨있는 애들이 한둘이 아니라서 하나하나 언급을 할 수 밖에 없다... 지금 얘기할 건 NGINX 얘긴데, 디테일한 설명은 내 블로그엔 전혀 없기 때문에, 그래도 한번 핥고 지나가는 정도는 써둬야하지 않나 싶어서 남겨본다. 

NGINX는 웹서버다. 걍 웹서버임. 요청하면 그 경로에 있는거 냅다 꺼내 주는 웹서버.

 

1. 웹서버가 그래서 뭘까?

내가 주구장창 웹서버 언급만 하지 디테일한 설명을 전혀 안했던 것 같은데, 솔직히 기본적인 기능에 대해선 설명할게 별로 없다.

일단 컴퓨터 한대를 준비한다. 그리고 뭐 특별히 conf 파일을 만들지 않고 실행한다고 가정하고, /usr/share/nginx/html 라는 NGINX의 default 경로안에 배포하고 싶은 내용을 넣어두고 NGINX를 실행시킨다. NGINX는 기본적으로 80포트에서 동작한다. 그러면 내 로컬에선 http://localhost:8080일거고, 뭐 외부에선 내 컴퓨터의 IP:8080일거임. 그리고 저 8080뒤에 "/workspace/myapp" 이런 모양으로 경로를 입력해주면 거기있는걸 꺼내다가 보내주는 뭐 그런 식이다. 웹서버가 하는 일이 애초에 이런거다. 웹브라우저로 요청을 할테니 경로에 있는 파일은 일반적으로 HTML일거고 말이다. 

뭐 리액트를 사용한 SPA를 만들었다면 내부적으로 Routing을 사용하고 있을텐데, 이러면 root 뒤에 별도의 경로를 붙여줬을 때 NGINX가 혼란스러워 404에러를 뱉어버리기 때문에 꼭 없는 경로를 요청하더라도, index.html을 바라보게끔 설정만 해주면 알아서 Application 내부적으로 설정해둔 Routing을 따라가게 된다.

 

2. NGINX를 많이 쓰는 이유

모던 웹 개발을 좀 하다보면 느끼는게 있을텐데, 웹서버의 전통강자인 아파치보다는 NGINX를 더 많이 사용한다는 것이다. 그 이유 중에 하나가 이제 클라이언트 쪽에서 처리하는 것도 상당히 많아져서 웹서버가 하는 역할이 많아졌다는 건데, 기존에 단순한 정적리소스의 배포라는 기능 제외하고도 웹서버가 해줘야하는 일들이 많아졌다는거임. 대표적으로 로드밸런싱, 리버스 프록시로의 사용 등이 있다. 이게 결국 대용량 트래픽과 연관이 있는 내용인데, 프로세스를 처리하는 방식이 사용자가 많은 시스템일 경우 매번 스레드를 할당해서 처리하는 아파치보단 싱글 스레드를 사용하고 이벤트 중심으로 비동기 처리방식을 채택하고 있는 NGINX가 더 리소스 소모 측면에서 효율적이고, 더 경량화된 웹서버기 때문에 많이 사용할 수 밖에 없다고 보면 되겠다. 뭐 용어가 좀 어렵긴 한데, 쉽게 요약하면 클라이언트 어플리케이션이 발전하고 확장됨에 따라 더 많은 것을 수용할 수 있게끔 더 발전하고 더 거기에 맞는 기능을 달고 있다고 생각하면 되겠다. 

 

3. 기능에 대한 용어정리

뭐 어렵게 로드밸런싱, 리버스 프록시 어쩌고 해두면 학원 출신 신입개발자는 걍 못 알아 듣는다. 그래서 쉽고 간략하게 뭔 얘기하는지만 살짝 정리해보자. 

 

로드밸런싱이라는 말은 서버가 혼자서 요청을 처리하기 버거울만큼 트래픽이 많아지는 경우가 있다.(경우가 있는게 아니라 그냥 퍼블릭한 서비스면 무조건 그렇다.) 그래서 동일한 기능을 가진 서버를 복수로 띄워두고 트래픽이 쏠리는거에 따라서 요청을 분배해서 하는거임. 

 

리버스 프록시는 로드 밸런싱의 배경이 되기도 한다. 왜냐면 로드밸런싱을 하려면 요청을 받아서 분배하는 대리인 있어야하기 때문이다. 웹서버가 말 그대로 프록시 역할을 하는거임. 여기서 신입개발자 입장에서 생각해보면 프록시란 말부터 이해가 안갈텐데, 프록시의 영단어 뜻이 대리, 대리인이라는 뜻이다. 그래서 프록시란 어떤 영역이 됐든(자바스크립트에도 프록시란 개념이 있고, 프록시 서버라는 것도 있고, 애초에 뭐 대신해주면 일단 다 프록시 붙여놓고 봄) 뭔가를 대신해준다고 생각해주면 된다. 전통적인 포워드 프록시라는 개념은 내부망에서 외부망(인터넷)에 배포되어있는 서비스로 요청을 해야할 경우에 이 포워드 프록시를 향해 요청하면 이 프록시가 대신 요청하고 결과를 내부망으로 전달하는 역할을 한다. 리버스 프록시는 이거를 거꾸로 생각해서 서버 앞에 프록시를 둔다고 생각하면 된다. 요청을 직접 받지 않고 프록시를 통해 전달 받는거임. 뭐 글로 설명하면 똑같은 얘기하는거 아님? 이런 생각할텐데, 클라이언트 쪽이 포워드, 서버쪽에 붙어있는 애가 리버스 뭐 이런 식인거다. 

LIST

'Dev > Deployment' 카테고리의 다른 글

[Deployment] React App 배포하기  (0) 2024.09.23
[Deployment] React App을 배포하기 전에  (2) 2024.06.06
[Docker] Docker  (0) 2023.08.02
[Deployment] 배포 (Deployment)를 시작하기 전에  (0) 2023.08.02