아파치 웹서버 Apache Web Server 간단히 알아보기

Stock 286617357 Editorial

가장 일반적인 웹 어플리케이션 스택 중 하나인 ‘LAMP’ 즉, 리눅스 운영체제, 아파치 웹서버, MySQL 데이터베이스, PHP/Python/Perl 프로그래밍 언어 중에서 오늘은 아파치 웹서버에 대해 알아보려고 합니다. 아파치 소프트웨어 재단(ASF: Apache Software Foundation)에서 관리하고 있는 아파치 HTTP 웹서버는 웹 콘텐츠를 서비스하는 무료 오픈 소스 웹서버로, 1995년 출시 이래 늘 최고의 HTTP 클라이언트의 자리를 지키고 있습니다. 다양한 경쟁 웹서버들이 등장하면서 점유율이 많이 감소하긴 했지만, 여전히 전세계 웹사이트의 40% 이상은 아파치에서 돌아가고 있습니다. 이러한 아파치의 기능과 작동원리, 장단점 등을 간단히 살펴보겠습니다.

아파치 웹서버의 기능


모든 웹서버의 기본 작업은 클라이언트(예: 방문자의 웹 브라우저)의 요청을 받아 그에 대한 응답을 다시 클라이언트로 보내주는 것입니다. 이에 추가로, 아파치의 특징적 기능들로는 다음과 같은 것들이 있습니다.

  • 정적인 데이터 처리: 클라이언트가 브라우저를 통해 정적인 데이터(이미지, html파일 등) 요청에 대한 응답을 다시 브라우저로 보내줍니다.
  • 동적 모듈 적재 방식: 동적 모듈 적재 방식(DSO: Dynamic Shared Object)과 정적 모듈(Static Object) 방식 중 선택적 설치가 가능합니다. 동적 모듈 적재 방식으로 설치된 아파치는 설정 파일에 근거하여 필요한 모듈을 필요한 시점에 로드하였다가 작업이 끝나면 로드 해제함으로써 시스템 자원을 보다 효율적으로 사용하게 됩니다.
  • 자동 인덱싱: 설정에서 자동 인덱싱 옵션을 활성화하면 클라이언트의 디렉토리 인덱스 요청에 해당 디렉토리 인덱스를 반환해줍니다. 이 설정이 꺼져있으면 아파치는 디렉토리 인덱스 대신 “403 Forbidden” 오류를 반환합니다.
  • .htaccess: 워드프레스 웹사이트를 운영하면서 FTP나 파일매니저를 사용하다 보면 .htaccess라는 이름의 파일을 보게 됩니다. 이 파일은 아파치 디렉토리 관련 설정 파일로, 허가, 인증, URL재작성, 스팸봇 차단, SSL, 디렉토리 리스팅, 에러 응답 커스터마이징 등을 위해 사용됩니다. 기본적으로 디렉토리 관련 설정은 apache2.conf 또는 sites-enabled 파일에서 이루어지지만, 사용자가 디렉토리 권한 설정을 변경하고 싶지만 서버 시스템에 root 권한이 없는 경우 .htaccess 파일을 사용합니다. 
  • IPv6과 호환 가능: 버전 2.0.43 이후부터 최신 버전의 인터넷 프로토콜인 IPv6 지원이 내장되어 활성화되어 있습니다.
  • HTTP/2 지원: HTTP/1.1에서 속도와 보안이 강화된 HTTP/2를 지원합니다.
  • FTP 연결: 간단한 방법으로 FTP 연결을 사용할 수 있습니다.
  • gzip 압축 및 압축 해제: mod_deflate 모듈을 사용하여 gzip 압축/압축 해제가 가능합니다.
  • 대역폭 조절: mod_cband 모듈을 사용하여 웹사이트 조회수 제한, 동시 접속자수 제한, 도메인 대역폭 제한 등의 트래픽 관리가 가능합니다.
  • Perl, PHP, Lua 스크립트: mod_perl, mod_php, mod_lua 모듈을 사용하여 Perl, PHP, Lua 스크립트를 사용할 수 있습니다.
  • 로드 밸런싱: 보안성을 강화하고 웹서버의 자원을 효율적으로 사용하기 위해 아파치 웹서버에 WAS 서버(예. 톰캣Tomcat)를 연동하는 경우가 많습니다. 하지만, 정작 수행되는 작업들이 골고루 분산되지 않으면 연동의 효과가 제대로 나기 어려운데, 이때 작업을 균형있게 분산시켜주기 위한 방법으로 로드 밸런싱을 사용하게 됩니다.
  • 세션 트래킹: HTTP 프로토콜은 서버-클라이언트 통신시 연결이 지속되는 방식이 아니고, 서버도 클라이언트의 상태를 보존하지 않기 때문에, 서버에서는 클라이언트의 현재 상태 및 이전 작업 내용을 알 수 없습니다. 그래서, 어떤 방식으로든 현재 페이지의 정보를 저장하거나 다음 페이지로 넘겨줘야 하는데, 이를 세션 트래킹이라고 합니다. 아파치는 세션 추적에 사용할 수 있는 다양한 모듈을 지원합니다. mod_session 및 mod_session_cookie 모듈은 아파치 HTTP 서버 프로젝트의 일부로 세션 관리 기능을 제공하도록 설계되었으며, 서버 측에 세션 데이터를 저장하고 쿠키를 사용하여 클라이언트에 전송되는 세션 식별자와 연결하여 사용자 세션을 관리할 수 있도록 해줍니다.
  • URL 재작성: mod_rewrite 확장 모듈을 이용하여 URL을 동적으로 리다이렉션하거나 재작성할 수 있습니다. 복잡한 URL을 간단하게 만들어야 하는 경우, 사용자가 추가될 때마다 가상 호스트가 추가되는 웹서버의 동적인 호스트명을 처리해야 하는 경우, 웹사이트 URL이 변경되어 기존 URL을 새 URL로 리다이렉션 해야 하는 경우, SSL가 적용된 웹사이트에서 HTTP를 HTTPS로 리다이렉션 해야 하는 경우 등등, 다양한 용도로 사용할 수 있는 기능입니다.
  • WebDAV: WebDAV(Web-based Distributed Authoring and Versioning)는 문서나 파일의 관리를 쉽게 하기 위해 만들어진 HTTP/1.1 프로토콜의 확장으로, HTTP에 새로운 메서드를 추가하여 사용자가 원격 웹 서버에서 파일을 공동으로 편집하고 관리할 수 있게 해줍니다. 아파치에서도 WebDAV 모듈을 활성화하여 WebDAV 서버를 구현할 수 있습니다.
  • IP 주소를 기반으로 한 지리적 위치: mod_geoip, mod_maxminddb 등의 모듈을 설치하면 IP 주소를 기반으로 사용자의 지리적 위치(국가, 지역, 도시 또는 좌표 등)를 파악하여, 그에 맞게 타겟팅된 콘텐츠를 전송하거나, 위치에 따라 액세스를 제어하고, 위치 정보를 분석에 활용하는 등 다양한 용도로 사용할 수 있습니다.

아파치 웹서버의 작동 원리


사용자가 웹사이트 또는 웹 응용 프로그램에 액세스하면 아파치 웹서버로 요청이 전송되고, 아파치는 지정된 포트(HTTP는 포트, HTTPS는 포트 443)에서 요청을 수신한 후 구성 파일에 근거하여 요청을 처리하게 됩니다. 기본적으로 모듈식 구조를 갖고 있는 아파치 웹서버는 필요할 때마다 기능별 다양한 모듈을 동적으로 로드/언로드하며 액세스 권한 확인, URL 재작성 또는 콘텐츠 압축 등 다양한 요청들을 처리합니다.

아파치 웹서버는 HTML, CSS, 이미지 및 기타 파일과 같은 정적 컨텐츠들은 파일 시스템으로부터 직접 서비스하지만, 동적 컨텐츠의 경우 관련 모듈(mod_php, mod_python)을 로드하여 통신하거나의 Tomcat 또는 Node.js와 같은 웹 애플리케이션 서버(WAS: Web Application Server)와 연동하여 처리합니다. 아파치의 성능을 최적화하기 위해 서버 관리자는 다양한 구성 설정을 이용하여 작업 프로세스 수나 스레드 수, 캐시 주기, 동시 소켓 연결 수 등을 제어합니다.

아파치 웹서버의 경쟁 서버들


아파치는 언제나 웹서버들 중 가장 높은 점유율을 기록해온 반면, 소프트웨어 자체가 너무 무겁다던지, 트래픽이 높아질수록 CPU/메모리 부하가 심해지고, 여러 연결을 동시에 처리할 수 없는 등의 단점도 갖고 있어, 이를 보완하는 다양한 경쟁 웹서버들이 아파치의 대안이 되고 있습니다.

  • 엔진엑스(Nginx): 엔진엑스는 현재 아파치 웹서버의 점유율을 거의 따라잡은 가장 큰 경쟁자라고 할 수 있습니다. 초경량에 효율성이 강점이며 동시 접속 처리에 특화되어 아파치의 단점을 거의 다 커버했다고 하는 차세대 웹서버이지만, 기본적으로 동적 컨텐츠를 처리할 수 없어 외부 프로세서의 도움을 받아야 하는 점, 그 과정에서 속도 지연이 발생하는 점, 아파치에 비해 지원되는 모듈이 많지 않다는 점 또한 고려해야 할 부분입니다.
  • 아파치 톰캣(Apache Tomcat): 톰캣(Tomcat) 역시 아파치 소프트웨어 재단에 속해있는 웹서버로, JSP나 JAVA 서블릿 등의 웹 어플리케이션을 실행할 수 있는 웹 어플리케이션 서버(WAS: Web Application Server)이기도 합니다. 톰캣은 WAS로서 동적인 데이터 처리가 가능하기 때문에, 정적인 데이터를 처리하는 아파치나 엔진엑스 등 기존 웹서버와 함께 연동되어 보완적으로 사용됩니다. 주로 아파치 웹서버와 톰캣이 연동된 형태가 많아 아파치 톰캣으로 불립니다.
  • Node.js: 크롬 브라우저에 내장되어 있던 자바스크립트(JavaScript) 엔진인 V8을 브라우저 외에서도 사용 가능하게 하기 위해 만든 자바스크립트(JavaScript) 런타임입니다. Node.js 자체가 서버는 아니지만 Node.js를 이용하여 서버를 만들 수 있고, 웹브라우저 없이도 서버에서 자바스크립트(JavaScript)를 실행할 수 있게 해줍니다.
  • 라이티(Lighttpd): 속도, 효율성 및 유연성을 위해 설계된 오픈 소스 웹서버로, 아파치 웹서버보다 적은 메모리 공간을 사용하면서도 처리 속도는 더 빠른 것으로 알려져 있습니다. 엔진엑스처럼 이벤트 중심의 아키텍처와 비동기식 단일 스레드 모델을 사용하기 때문에 여러 연결을 동시에 처리할 수 있다는 것이 장점입니다. 정적 데이터 처리용, 혹은 동적 애플리케이션 구동을 위한 프론트엔드 서버로서 널리 사용되고 있습니다.
  • 체로키(Cherokee): 체로키(Cherokee)는 웹 애플리케이션 서비스를 위한 사용자 친화적 고성능 플랫폼을 제공하는 것이 목표인 오픈소스 웹서버입니다. 구성 및 관리가 용이하도록 설계되어 서버 관리 경험이 많지 않은 사용자에게도 접근이 용이합니다. 체로키의 가장 두드러지는 특징은 다른 웹서버들과 달리 웹 기반 그래픽 사용자 인터페이스(GUI)를 제공한다는 것입니다. 이는 텍스트 인터페이스에서의 수동식 서버 파일 구성보다 좀 더 직관적인 설정을 가능하게 해줍니다.
  • 마이크로소프트 IIS(Microsoft IIS): 이름에서 알 수 있듯이 마이크로소프트 IIS는 마이크로소프트에서 개발한 웹서버입니다. 서버 운영체제 윈도우의 구성 요소로 포함되어 있지만, 데스크톱 운영체제 윈도우에도 설치 가능합니다. 기본적으로 HTTP 및 HTTPS 요청을 처리하는 웹서버이지만, 정적 콘텐츠와 동적 콘텐츠 모두 처리 가능하기 때문에 웹 애플리케이션 호스팅에도 사용됩니다. .NET 프레임워크 등 여타의 Microsoft 기술들과 연동이 가능하고, 보안 및 확장성이 뛰어나며, 해를 거듭할수록 그 기능이 향상되고 있기 때문에 특히 기업 환경에서 각광받는 웹서버입니다.
  • 앱웹(Appweb): IoT(사물 인터넷) 장치나 내장형(임베디드) 시스템 등, 리소스가 제한된 환경에서 사용하도록 설계된 경량의 내장형 오픈 소스 웹서버입니다. 앱웹은 메모리 공간이 작기 때문에 아파치 웹서버 또는 엔진엑스처럼 모든 기능을 갖춘 웹 서버가 너무 무겁고 과할 수 있는 시나리오에 적합합니다. 물론, 임베디드 시스템이 아닌 리눅스, 윈도우 등의 다양한 운영체제에서도 사용 가능합니다.
  • 히아와타(Hiawatha): 히아와타(Hiawatha) 웹서버는 단순함, 성능 및 보안을 위해 설계된 가볍고 안전한 웹서버 소프트웨어입니다. 많은 수의 동시 연결을 효율적으로 처리하는 것을 최우선 목표로 하고 있으며, 악성 트래픽과 공격으로부터 웹 애플리케이션을 보호해주는 웹 애플리케이션 방화벽(WAF: Web Application Firewall)을 내장하고 있는 것이 특징입니다. 아직은 아파치 웹서버나 엔진엑스처럼 널리 사용되고 있지는 않지만, 우수한 성능으로 인정받고 있는 웹서버입니다.

현재 사용중인 웹서버 확인하는 방법


모든 웹사이트는 웹서버에서 구동되고 있습니다. 따라서, 사용중인 브라우에서 특정 웹사이트가 어떤 웹서버에서 실행되고 있는지 확인할 수가 있습니다.

아파치 웹서버: 현재 사용중인 웹서버 확인하기

Ctrl+Shift+I 단축키를 눌러 개발자 도구 Developer tools를 실행합니다. 상단에서 ‘Network’를 선택하고 웹사이트를 ‘새로고침’ 한 후, 목록 최상단에 나오는 웹사이트 주소를 클릭합니다.

아파치 웹서버: 현재 사용중인 웹서버 확인하기

HTTP 응답의 헤더 Headers 뷰에서 스크롤을 내리면 위와 같이 Server 헤더에 구동중인 웹서버 정보가 나옵니다. 지금 이 블로그가 호스팅되어 있는 클라우드웨이즈는 엔진엑스(nginx)를 사용하고 있다고 나오네요. 실제로 많은 웹호스팅 업체에서 서로의 장점을 취하고 단점을 보완하기 위해 아파치와 엔진엑스를 함께 사용하고 있고, 클라우드웨이즈 역시 아파치와 엔진엑스를 함께 사용하고 있는 것으로 알고 있습니다. 이렇게 여러 개의 웹 서버를 사용하는 경우, Server 헤더는 일반적으로 클라이언트와 직접 커뮤니케이션 하는 프론트엔드 서버 정보를 표시합니다.

Leave a Reply

Your email address will not be published. Required fields are marked *