- 웹서버와 WAS 의 차이
"웹프로그래밍 스터디"라는 주제로 글을 작성하고자 한다. 그동안 공부하고 싶었던 주제를 정리했는데, 웹개발의 전반적인 내용이 포함될 예정이다. 아마 바쁘다는 핑계로 글 올라오는 속도가 매우 느릴 수 있다. 하루에 한시간씩이라도 시간을 내서 스터디 해야한다!! 라고 내 자신에게 다짐해본다. 아래와 같은 목차로 진행 예정이며, 목차는 변경 될 수는 있다.
https://brunch.co.kr/@springboot/15
웹프로그래밍을 하기 위해서는 기본적으로 웹서비스가 어떻게 동작하는지 이해를 해야 하며, 기본적인 웹서버의 역할에 대해서 알아야 한다. 그래서 이번 글의 주제는 [웹서버 vs WAS 의 차이]라는 주제로 글을 쓸려고 한다. 웹서버를 이해하기 전에는 HTTP 통신에 대한 이해를 해야 하는데 지난 번에 작성한 HTTP 관련 글을 먼저 읽어보길 바란다. 혹시, HTTP에 대해서 상세히 알고 싶은 개발자는 [HTTP 완벽가이드] 를 정독하기를 바란다. 원서를 사서 읽으면 더 좋을 것 이다. 솔직히 내가 쓴 글은 별로 도움이 안 될 수 있다.
https://brunch.co.kr/@springboot/16
https://brunch.co.kr/@springboot/19
웹프로그래밍을 이제 막 시작한 학생은 반드시 HTTP 에 대한 이해 --> 웹서버,WAS 의 이해 의 순서로 공부를 시작하기를 바란다. 웹은 HTTP 라는 프로토콜을 사용하여 서버간 통신을 한다. 클라이언트 측에서 요청(Request)를 보내고, 서버 측에서 응답(Response)가 되돌아 오는 구조이다. 웹서버는 이런 HTTP 요청을 받아들이고 HTML, 이미지 파일,CSS 같은 문서 또는 리소스 데이터를 반환하는 역할을 하는 프로그램이다.
https://ko.wikipedia.org/wiki/%EC%9B%B9_%EC%84%9C%EB%B2%84
대표적인 웹서버는 IIS, Apache, Nginx, GWS 등이 있다. apache 는 HTTPD 라고도 부르기도 한다. 참고로 본인은 닷넷 환경에서의 개발 경험이 많기 때문에 웹서버로 IIS 를 많이 사용했고, 자바&리눅스 환경의 회사로 이직한 이후로는 Nginx, Apache 를 주로 사용 중이다.
웹프로그래밍을 이제 막 시작한 학생은 반드시 HTTP 에 대한 이해 --> 웹서버,WAS 의 이해 --> 웹프로그래밍 의 순서로 공부를 시작하기를 바란다.
웹서버 중에서 Nginx 를 콕(?) 찝어서 정리하는 이유는... 지금 다니는 회사에서 주로 사용하는 웹서버이기 때문이다. (참고로,Nginx 관련 번역 서적이 몇권 있는데 추천하고 싶지는 않다.) 인터넷에서 떠도는 글에서는 Apache 와 Nginx 의 성능 차이에 대한 글이 꽤 많다. 대부분 글이 Nginx 의 성능이 상대적으로 좋다는 내용이지만, 무조건 좋다고 쓰기 보다는 시스템 환경에 맞게 운영 하는 것이 중요하다. Apache가 적합한 시스템이 있을테고, Nginx 가 적합한 시스템이 있을 것이다. 어쨋든 Nginx 나 Apache 나 기본적인 웹서버의 역할은 비슷할 것이다. Nginx 를 사용하면서 느낀 경험을 정리해보면 아래와 같다. 지극히 개인적인 느낌이다.
Reverse Proxy(리버스 프록시)를 잘 활용하면 깔끔하고 안정적인 서비스 운영이 가능하다.
Nginx 에서 제공해주는 캐싱 기능을 잘 활용하면 안정적인 서비스 운영이 가능하다.
Apache 보다는, 설정이 심플하다고 생각한다.
대용량 트래픽의 서비스에서 안정적인 성능을 보여준다.
단, Nginx 캐싱은 conf 파일에서 심플하게 설정을 할 수 있지만 주의해서 사용해야 한다. 잘못된 설정으로 너무 많은 트래픽을 캐싱을 하는 경우에는 DISK FULL 이슈가 발생을 할 수도 있다. 또한, 404 에러 등도 캐싱을하기 때문에 정상적인 파일을 배포한 이후에도 계속 404 에러가 발생을 하는 경우도 종종 경험한다. 분명 파일이 있는데 왜 없다고 나오지? 라고 생각하며 한참을 헤매던 기억이 있다. Nginx 에서 404 에러까지 캐싱을 했기 때문이고, 정상적인 파일을 넣어도 Nginx 가 404 로 서빙(클라이언트에 전달)을 하기 때문이다.
nginx에서 가장 중요한 개념은 바로 Reverse Proxy이다. 일단 아래 설명을 참고하기 바란다.
https://www.nginx.com/resources/admin-guide/reverse-proxy/
Reverse Proxy 라는 단어가, 마치 프록시서버 느낌이 나는데, 특정 네트워크의 다른 서버로 전달하는 역할을 수행한다 정도로 이해를 하면 된다. 하지만, 다른 서버가 아니더라도... 로컬서버의 특정 포트로의 전달이 가능하다. 즉, WAS 로 전달하는 역할을 수행할 수 있다. 아...WAS 에 대한 설명을 아직 안했지만, 대부분 개발자가 잘 알고 있을 것이다.
Reverse Proxy
Reverse Proxy 는 클라이언트 사용자의 리퀘스트 요청을 받아서, 실제로 운영하고 있는 내부 서버의 애플리케이션에 전달하고 결과를 받아서 클라이언트에 리턴하는 역할을 한다. 아래 캡쳐 화면을 보자.
외부에 공개된 도메인은 DNS 에 의해서 해당 서버의 위치, 즉 IP 주소를 알수 있다. 하지만, 내부 서버의 IP를 외부에 공개할 수 없는 경우가 많다. 보안상의 이유도 있다. 어쨋든, 예를 들어서 필자가 internal.springboot.co.kr 이라는 애플리케이션, admin.springboot.co.kr 이라는 관리자 애플리케이션 두대를 운영중이라고 가정하자. 해당 두대의 서버는 외부에 오픈이 되지 않은 상황이다. 즉, 외부 DNS 서버를 통해서 해당 서버들을 찾을수가 없는 것이다. 이 때 Nginx Web Server 에서는 외부 요청을 받으면 내부 서버로 요청,응답,전달 하는 역할을 수행한다. springboot.co.kr 로 Nginx Server 로 요청이 오면, internal.springboot.co.kr 로 전달하고, springboot.co.kr/admin 으로 Nginx 요청이 오면, admin.springboot.co.kr 로 전달하는 것이다. Nginx Config 설정은 아래와 같을 것이다.
#생략...
#샘플 Config 입니다. 이렇게 할필요는 없고, 각자 서비스 상황에 맞게 구성하시면 됩니다.
location / {
proxy_pass internal.springboot.co.kr:8082;
}
#생략...
location /admin/ {
proxy_pass admin.springboot.co.kr:443;
}
WAS는 웹애플리케이션을 실행하여 동적으로 서버 콘텐츠를 생성하는 역할을 담당하는 미들웨어이다. WAS 에는 아파치 톰캣, 웹로직, 제이보스 등이 있다. Nginx 가 HTML, 이미지 등의 정적인 리소스를 전달하는 역할을 한다면, WAS 는 동적으로 동작하며, DB 와 연동되고 비즈니스 로직을 포함한다. 우리가 일반적으로 웹프로그래밍으로 공부하는 JSP, ASP, PHP 등이 모두 WAS 에서 동작하는 것이다. (참고로 최근에는 WAS에서 웹서버의 역할을 동시에 수행하는 제품도 있다고 알고 있다.) 아래 그림은 참고만 하길 바란다. 정말 못그렸지만,
그림에서 Nginx 가 웹서버이고, 톰캣이 WAS 이다. Nginx는 앞단에서 리버스 프로시를 수행한다. 정적 콘텐츠(HTML, CSS, JS, 이미지) 에 대한 리버스 프록시는 nginx 설정으로 캐싱되어있는 파일을 호출할수도 있고, 정적인 스태틱 파일 서버를 호출할수도 있다. 또한 동적 실행이 필요한 경우에는 마찬가지로 리버스 프록시 설정으로 같은 서버에 8081, 8082 포트에 올라와있는 톰캣 WAS 를 호출한다. 물론 경우에 따라서는 다른 네트워크에 있는 서버를 호출할 수도 있다.
이 글에서 혹시라도 잘못된 내용이 있다면 꼭 의견 부탁드립니다. 피드백을 간절히 원합니다.
위에서 설명한 톰캣(WAS..)은 외장 톰캣이다. 기본적으로 웹서비스를 구축할려면 톰캣도 설치해야 하고, JSP 프로젝트를 톰캣에 연동을 해야 한다. 하지만, 스프링부트를 사용 하면 외장톰캣 없이 임베디드 톰캣 기반으로 "바로 실행", "독립 실행" 할 수 있는 환경을 구축할 수 있다. (참고로, 스프링 부트에서도 외장 톰캣을 연동하여 구축할 수는 있다.) 스프링 부트 관련해서는 아래 링크를 통해서 확인하길 바란다.
https://projects.spring.io/spring-boot/
이번 글에서는 [2.웹서버vsWAS] 라는 주제로 글을 작성하였다. 웹서버와 WAS 에 대해서 아주 간단하게만 정리하였고, 마지막으로 스프링 부트에 대해서 소개를 하였다. 다음 글에서는 디자인패턴에 대해서 작성할 예정이고, 그 이후에 스프링부트 기반 스프링MVC 웹프로젝트를 공부할 예정이다.sWAS2.웹서버
회사 일도 바쁘고... 실력도 부족하고, 여러가지로 어렵지만...퇴근 후에 하루에 한시간씩이라도 공부하여 글을 작성할 수 있도록 노력을 해야겠다.