Web Server란?

1 웹 서버란 간단하게 설명하자면 기본적으로 웹 사용자가 어떻게 호스트 파일들에 접근하는지를 관리합니다.
웹 서비스를 제공하려면 웹 서버(WebServer)가 필요합니다. 웹 서버와 클라이언트인 웹 브라우저는 자료를 요청하고 요청에 대한 응답을 처리하기 위해 HTTP로 통신합니다. 웹에서 텍스트, 이미지, 음성, 영상과 같은 다양한 형식의 자료를 주고받을 수 있는 이유도 웹 서비스의 기본 프로토콜인 HTTP 때문입니다.
이러한 웹 서버는 여러 종류가 있는데 대표적으로 apache와 nginx를 비교하여 설명하도록 하겠습니다.

Apache

apache는 client에서 요청을 받으면 MPM(Multi Processing Module:다중처리모듈)이라는 방식으로 처리를 합니다.
이는 쓰레드/프로세스 기반 구조로 요청 하나당 쓰레드 하나가 처리하는 구조입니다. 그래서 사용자가 많으면 많은 쓰레드를 생성하게 되고, 따라서 메모리 및 CPU 낭비가 심합니다.
아파치도 최근 event-driven을 기반으로 하지만, 여전히 nginx가 성능면에서 우수한 면을 보이고 있습니다.

Nginx


nginx는 비동기 event-driven 방식으로 클라이언트에 요청을 처리해주는 웹 서버입니다.
event-driven방식은 어떤 작업을 하는 도중 CPU가 관여하지 않는 작업이 시작되면 기다리지 않고 바로 다른 작업을 수행합니다. 그 작업들이 끝나면 전에 하고 있었던 작업을 다시 진행하면 된다는 이벤트가 발생하고 그 작업을 처리하게 됩니다.
nginx는 한 개 또는 고정된 프로세스만 생성하고, 그 프로세스 내부에서 비동기 방식으로 효율적으로 작업을 처리합니다. 따라서 동시 접속 요청이 많아도 프로세스 또는 쓰레드 생성 비용이 존재하지 않습니다.
따라서 nginx는 적은 수의 쓰레드로 효율적인 일 처리를 하며, 쓰레드를 많이 사용하지 않기 때문에 메모리 및 CPU소모도 적습니다.

Nginx vs Apache

성능

다음 차트는 apache와 nginx를 동일한 기준에서 성능 테스트를 한 결과입니다. 동시 접속자수가 늘어나도 apache보다 nginx가 훨씬 좋은 성능을 유지하고 있는 것을 알 수 있습니다. 2
3

지원 범위

아파치는 리눅스, bsd, unix, window. 지원범위가 다양하고 window까지 지원이 가능하여 일관성있는 웹서비스 아키텍쳐 구현이 가능합니다.
nginx는 리눅스, bsd, unix, window 부분지원. 다양한 운영체계를 지원하지만 apache보다는 지원 범위가 넓지 않습니다.

모듈 및 확장성

아파치는 60개 이상의 다양한 기능과 모듈을 지원하며, 필요에 따라 활성화 또는 비활성화 시킬 수 있습니다.
nginx는 다른 코어 모듈을 동적으로 로딩할 수 없도록 되어있습니다. 옵션을 최소화해서 성능에 포커싱했습니다.

Nginx 사용법

Nginx를 설치하고 설정파일을 설정하는 법을 알아보겠습니다.
위와 같이 sudo apt-get update && install nginx를 하여 nginx를 설치합니다.
설치가 끝난 후 nginx -v로 버전을 확인합니다.
nginx의 설정 파일들은 /etc/nginx에 위치하며, 제가 수정할 파일은 /etc/nginx/sites-available 폴더에 위치해 있으므로 해당 경로로 이동합니다. 해당 경로로 이동하여 파일 리스트를 확인해보면 default 파일이 하나 존재합니다.

이 파일을 수정하기 위해 vi 에디터를 사용하여 파일을 엽니다. 파일을 처음 열었을 때 디폴트로 다음과 같이 설정이 되어있습니다.

다음은 default 파일을 수정한 내용입니다.
여기서 server라고 되어있는 {} 안에 설정값이 쓰여 있는데, {}를 블록이라고 합니다. Server 블록안에 listen이라고 되어있는 부분이 있는데 이 부분은 nginx의 서비스 포트를 지정하는 것으로 서버블록이 http 통신 프로토콜로 들어오는 요청에 대한 처리를 한다는 내용입니다.
다음으로 root는 server_name으로 들어오는 도메인을 어디로 보낼지에 대한 설정을 하는 것입니다. 다음과 같이 react build폴더가 위치한 경로를 입력하면 됩니다.
server_name은 nginx에 접근하는 호스트 네임을 설정할 수 있습니다.
그리고 index는 도메인의 /(루트)경로에서 보여지는 화면을 지정하는 것입니다.
location은 저는 사용하지 않았지만 뒤에 경로를 지정하여 해당 경로로 요청을 받았을 시에 location 블록안의 내용을 실행하겠다 라는 뜻입니다. 그래서 location은 여러 개가 사용될 수 있습니다.

설정을 마친 뒤 저장하고 나와서, nginx 서비스를 시작합니다.
그러고 나서 status를 확인해보면 다음과 같이 active(running)이라는 화면이 뜹니다.
이제 도메인주소를 입력하면 우리가 만든 클라이언트 화면이 잘 뜨는 것을 확인할 수 있습니다.

  1. 출처:https://developer.mozilla.org/ko/docs/Learn/Common_questions/What_is_a_web_server 

  2. 출처:https://x443.wordpress.com/2012/11/17/apache-2-4-faster-than-nginx/ 

  3. 출처:https://x443.wordpress.com/2012/11/17/apache-2-4-faster-than-nginx/