이 글을 읽기 앞서, 관련된 OS, 네트워크 사전 지식들을 정리한 아래의 글을 보고 오면 도움이 됩니다.
https://codenme.tistory.com/80
WAS란?
DB 조회 혹은 다양한 로직 처리를 요구하는 동적 컨텐츠를 제공하기 위해 만들어진 Application 서버이다. HTTP 프로토콜을 기반으로 사용자 컴퓨터나 장치에 애플리케이션을 수행해주는 미들웨어로서, 주로 데이터베이스 서버와 같이 수행된다.
WAS는 JSP, Servlet 구동환경을 제공해주기 때문에 서블릿 컨테이너 혹은 웹 컨테이너로 불린다.
이러한 WAS는 웹 서버의 기능들을 구조적으로 분리하여 처리하고자 하는 목적으로 제시되었다. 분산 트랜잭션, 보안, 메시징, 쓰레드 처리 등의 기능을 처리하는 분산 환경에서 사용된다. WAS는 프로그램 실행 환경과 DB 접속 기능을 제공하고, 여러 개의 트랜잭션을 관리 가능하다. 또한 비즈니스 로직을 수행할 수 있다.
이러한 WAS에는 Tomcat, JBoss, WebSphere 등이 있다.
웹 서버란?
HTTP 프로토콜을 기반으로 클라이언트가 웹 브라우저에서 어떠한 요청을 하면 그 요청을 받아 정적 컨텐츠를 제공하는 서버이다. 정적 컨텐츠란 단순 HTML 문서, CSS, 이미지, 파일 등 즉시 응답 가능한 컨텐츠이다.
이때 웹 서버가 정적 컨텐츠가 아닌 동적 컨텐츠를 요청받으면 WAS에게 해당 요청을 넘겨주고, WAS에서 처리한 결과를 클라이언트에게 전달하는 역할도 해준다.
대표적으로 Apache, Nginx 가 있다.
Apache
prefork MPM(멀티 프로세스 모듈) 방식
-매 요청마다 http 요청을 처리하는 프로세스를 하나 복제하여 할당한다.
Worker MPM: 프로세스의 관리 작업이 무겁기에, 각 요청마다 스레드를 할당하여 작업. ->
프로세스와 달리, 하나의 프로세스가 cpu에 들어가도, 다양한 작업을 병렬적으로 수행할 수 있다.
apache의 구조적 한계
worker MPM(멀티 스레드) 방식이 이 Prefork에 비해 대량의 클라이언트를 잘 다루는 것은 맞지만, 클라이언트 접속 시 마다 프로세스 또는 스레드를 생성하는 구조적인 특성으로 인해 여전히 아쉽다.
NginX 한 개 또는 고정된 프로세스만 생성하고, 모든 http요청들을 Event-Handler를 통해 비동기 방식으로 처리한다.
- 적은 양의 스레드만 사용되기 때문에 Context Swiching 비용이 매우 적고, CPU 소모가 적다.
( http요청마다 프로세스, 혹은 스레드 생성 작업이 거의 필요 없기에, 시스템 자원 관리에 이점이 있다.)
- Apache와 달리 동시 접속자 수가 많아져도 추가적인 생성 비용이 들지 않는다. (고정된 프로세스 내에서 이벤트로 처리)
-웹서버에서 대부분의 http 요청은 정적인html 파일을 제공하는 것인데, html에는 이미지, 비디오, 스타일 시트 등 다양한 요소를 포함하고, 크기도 거대하기에 html 데이터를 모두 반환하기까지 많은 양의 네트워크 통신을 주고 받아야한다 -> 네트워크 IO 작업이 대부분이다.
- Nginx는 CPU와 관계없이 모든 I/O들을 전부 Event Listener로 미루기 때문에 흐름이 끊기지 않고 응답이 빠르게 진행되어 1개의 프로세스로 더 빠른 작업이 가능하고, 메모리를 적게 사용하기에 네트워크 IO작업이 대부분인 웹서버에서 좋은 성능을 발휘할 수 있다.
** 네트워크 IO란?
흔히 disk에 IO 를 하는 디스크 IO는 잘 알고 있을 것이다. 디스크 IO와 네트워크 IO를 비교해서 설명해보겠다.
대상
디스크 IO는 하드 디스크나 SSD와 같은 저장 장치에서 데이터를 읽고 쓰는 작업을 의미합니다. 반면에 네트워크 IO는 네트워크를 통해 다른 컴퓨터나 장치와 통신하여 데이터를 주고받는 작업을 의미합니다.
속도에 영향을 미치는 요소
디스크 IO는 저장 장치의 속도에 따라 영향을 받는다. 하드 디스크의 경우 플래터가 회전하고 헤드가 움직여서 데이터를 읽고 쓰기 때문에 상대적으로 느릴 수 있다. 반면에 SSD는 플래시 메모리를 사용하기 때문에 더 빠른 속도로 데이터를 처리할 수 있다. 네트워크 IO는 네트워크 속도에 영향을 받는다. 일반적으로는 디스크 IO보다 더 느릴 수 있다.
동기, 비동기 처리
디스크 IO는 대개 동기적으로 처리된다. 즉, 읽기/쓰기 작업이 완료될 때까지 대기하는 것이 일반적이다. 반면에 네트워크 IO는 비동기적으로 처리될 수 있다. (tcp는 동기적으로 처리함) 즉, 데이터를 보내거나 받는 동안 다른 작업을 처리할 수 있다.
에러 처리
디스크 IO는 대개 에러가 발생하면 작업이 중단됩니다. 따라서 에러가 발생하면 디스크나 파일 시스템을 검사하고 복구해야 합니다. 반면에 네트워크 IO는 일부 패킷이 손실되거나 전송에 실패해도, 재전송이나 다른 방법을 통해 데이터를 재전송할 수 있습니다.
왜 http 요청으로 html을 반환하는 것이 "대부분 IO 작업" 이 되는 걸까?
이는 클라이언트 <> 서버가 네트워크를 사용한 HTTP 프로토콜을 통해 통신하기 때문이다.
많은 접속자를 가정한다면(apache는 동시에 많은 스레드, 혹은 프로세스를 생성, 관리한다), Nginx가 시스템 자원 관리 측면에서 효율적일 수 있다.
아래는 표, 글로 정리한 Apache와 Nginx의 비교글이다.
Nginx경량화된 웹 서버로, 웹 서버뿐만 아니라 리버스 프록시 서버, 로드 밸런서, 캐시 서버 등 다양한 용도로 사용된다.
- Nginx는 적은 자원으로 높은 성능을 발휘할 수 있어서, 고부하 환경에서도 안정적으로 동작할 수 있습니다.
- 특히, 정적 파일이 많은 웹 사이트에서는 높은 성능을 발휘할 수 있습니다.
- 비동기 이벤트 기반 아키텍처를 사용하기 때문에, Apache와 같은 프로세스 기반 웹 서버보다 적은 리소스로 높은 동시 접속 처리를 가능하게 합니다.
Apache
- 다양한 모듈을 제공하고, 다양한 환경에서 유연하게 사용할 수 있습니다.
- PHP 애플리케이션과 같은 동적 콘텐츠를 처리하는 서버에 적합하다다.
- Apache는 다양한 인증과 보안 기능을 제공하기 때문에, 보안에 민감한 서버에서 사용하기 좋다.
따라서, 보통은 정적 콘텐츠가 많은 웹 사이트에서는 Nginx가 더 효율적이고, 동적 콘텐츠가 많은 웹 사이트에서는 Apache가 더 효율적일 수 있다.
하지만 요새는 정적 파일을 비동기 방식을 매우 빠른 속도로 처리하여 동적 파일을 대체하는 등의 방안들도 사용되고 있기에,
성능 측면이 중요한 서비스에서는 Nginx를, 보안이 중요한 서비스에서는 Apache를 사용하는 것이 좋다.
결 론
- 정적 분석은 동작 방식 차이에 따라 Nginx가 유의미하게 속도가 빠르다.
- 동적 분석은 동일하게 PHP를 이용하여, 유사한 성능을 보인다.
'DevOps' 카테고리의 다른 글
[도커] Nginx 웹서버 설정 이해하기 (1) | 2023.04.20 |
---|---|
[도커] Docker Compose (0) | 2023.04.19 |
[도커] 도커 활용 (0) | 2023.04.19 |
[도커] Docker File 기본 사용법 (0) | 2023.04.18 |
[도커] Mac에서 도커 세팅법 (0) | 2023.04.14 |