Category: Apache

Apache is very popular in the world. It has used on Linux. So Apache provides SAPI and PHP script languages used it.

Apache HTTP SERVER Project 개요

Apache Logo

 Apache HTTP SERVER Project 는 아파치 소프트웨어 재단(Apache Software Foundation)이 운영하는 수많은 프로젝트중에 톱(Top) 프로젝트 입니다. 유닉스(Unix)와 윈도우즈 NT 계열의 운영체제를 위한 오픈소스(Open Source) HTTP 서버를 개발하는 프로젝트 입니다. 이 프로젝트의 목적은 HTTP 표준을 준수하면서도 안정적, 효율적, 확장가능한 HTTP 서비스를 제공하는데에 있습니다.

현재 가능 널리쓰이고 인기 있는 이 프로젝트는 1996년에 시작되었으며 올해(2014)년 2월에 18년째를 맞이했습니다.

1. 역사

1995년 2월즘에 웹에서 운영되어지는 HTTD 데몬으로 일리노이 대학의 슈퍼컴퓨팅 애플리케이션 국립센터의 Rob McCool씨가 만든 것을 대부분 사용했었습니다. 그런데 1994년 중반즘에 Bob McCool이 NCSA를 떠난 이후에 개발이 정체되었습니다. 이러한 조그마한 웹마스터 그룹은 이메일을 통해서 정보를 교환하고 기능을 개선하거나 버그를 패치하는데 협력을 시작합니다. Brian Behlendorf 과 Cliff Skolnick 는 캘리포티아 베이 지역에 있는 컴퓨터에 코어개발을 위해 그들의 정보를 메일링 리스트에 공유합니다. 1995년 2월 말에 8명의 공헌자(Contributor)로 구성된 재단의 원조 아파치 그룹이 갖춰집니다.

  • Brian Behlendorf
  • Roy T. Fielding
  • Rob Hartill
  • David Robinson
  • Cliff Skolnick
  • Randy Terbush
  • Robert S. Thau
  • Andrew Wilson

1995년 4월, 아파치의 첫번째 공개 릴리즈(0.6.2 Version)된다. 이즘에 NCSA에서도 웹서버 개발을 진행하고 있었는데, NCSA의 서버개발팀의 Brandon Long 과 Beth Frank는 명예 멤버처럼 메일리스트에 합류하면서 두 프로젝트에 아이디어와 버그등을 수정하게 됩니다.

첫번째 공개 릴리즈는 빅 히트였지만 전체적인 개선과 재디자인이 필요한 시점에서 1995년 5월 ~ 6월달동안 Rob Hartill 과 나머지 그룹멤들은 0.7.x 에 새로운 기능을 구현(pre-fork기능)과 작지만 성장하고 있는 아파치 사용자 커뮤니티를 지원하는데 힘을 쏟습니다. Robert Thau는 새로운 서버 아키텍쳐를 디자인했는데, 코드명 Shambhala, 모듈화된 구조와 보다 많은 확장성을 위한 API 구조, pool 기반의 메모리 할당 그리고 Adaptive pre-forking 프로세스 모델이였습니다. 아파치 그룹은 0.7.x 에 이 기능들을 넣고 서버 베이스를 바꿉니다. 그리고 8월에 0.8.8을 릴리즈 됩니다.

많은 베타 테스트 이후에 잘 알려져 있지 않은 플랫폼에 포팅하고 새로운 문서를 작성하고 많은 새로운 기능을 추가해 1995년 12월 1일에 아파치 1.0 을 릴리즈 합니다. 그리고 1999년 6월에 아파치 HTTP 서버를 법적, 재정적으로 지원하기 위해 아파치 그룹 멤버들은 Apache Software Foundation 을 설립하게 됩니다.

2. 참고사이트

리눅스 아파치 설치

Apache LogoApache 는 전세계 웹 서버로 가장 많이 쓰이는 HTTP 서버 입니다.

Apache 는 최신 2.4 으로 넘어오면서 많은 변화를 겪었습니다.

이 문서는 리눅스 아파치 설치 하는 방법을 설명한 것입니다.

1. 개요

CentOS 7 배포판은 RHEL 7 을 재컴파일해서 만들어진 배포판 입니다. 이전 버전과 달리 서비스 데몬 관리로 Systemd 를 채용했고 기본 파일 시스템으로 XFS 를 채용하는등 많은 변화를 겪었습니다.

CentOS 7 에 서버 프로그램을 설치하게 될 경우에 이 Systemd 와 결합을 시키는 것도 중요한 일로 떠올랐습니다. Systemd 는 단순하게 서비스 데몬을 관리하는 것뿐만 아니라 시스템의 전반적인 인프라자체이므로 매우 중요한 요소가 되었습니다.

이 문서에 Apache 2.4.10 은 바로 Systemd 와 통합하는 방법을 포함 합니다. 이 문서의 내용은 Fedora 22 배포판을 많이 채용한 것입니다.

2. Apache 2.4.10

2.4.10 버전에서는 이전과 달리 기본 MPM으로 Event 입니다. 별도로 MPM을 지정해주지 않으면 Event 로 지정되었습니다. 하지만, 이 기본 Event 가 라이브러리 의존성을 가지고 있기 때문에 라이브러리가 갖추어지지 않았다면 Prefork 와 Worker 가 공유라이브러리로 컴파일되고 설치 이후에 무엇을 쓸것인지를 지정해줘야 합니다.

2.4.10 버전의 경우에 Event 를 활성화하기 위해서는 Apr, Apr-utils 의 버전이 1.5 이상이여 합니다. 하지만 CentOS 7 배포판에서는 현재 1.4 버전임으로 컴파일 설치할때에 1.5 이상을 같이 컴파일 해줘야 합니다. 

3. Download and Unpack

Apache 2.4.10 을 Event 로 동작하도록 컴파일 하기위해서 다운로드 합니다.

  • Httpd-2.4.10
  • Apr-1.5.1
  • Apr-utils-1.5.4

다운로드한 후에 압축을 해제하고 apr, apr-utils 는 srclib 디렉토리에 압축을 해제하고 버전을 제거한 패키지 이름으로 변경해 줍니다.

4. Patch Download and Patch

이 패치는 Fedora 22 에 httpd-.2.4.10 패키지에 있는 것을 가지고 온 것 입니다. 여기에는 보안 패치와 더불어 Systemd 와 통합되는 모듈이 들어있습니다.

패치는 다음과 같이 다운로드 받습니다.

download: httpd-2.4.10_patch.tar.bz2

httpd-2.4.10 디렉토리에서 다운로드 받은 파일을 압축해제하고 패치를 적용합니다.

5.Configure and Compile and install

프로그램에 설정을 할때는 어떤 기능을 쓸것인지를 결정해야 합니다. 어떤 역활로 서버를 사용할 것인지를 고민한 후에 프로그램을 설정하는 것이 좋습니다.

위 configure 는 다음과 같은 기능을 제공하지 않습니다.

  • dav 안됨

이제 컴파일과 설치를 해줍니다.

6. mod_systemd 설치.

httpd-2.4.10 에 Systemd 와 통합을 위한 패치를 했지만 컴파일할때에 모듈설치 옵션을 ‘all’이나 ‘most’ 로하지 않는 이상 컴파일 설치가 되지 않습니다. 이는 apxs 를 이용해서 모듈 설치를 해줍니다.

위에 잘 보면 link 시에 systemd_daemon 링킹이 되지 않습니다. 이것을 다음과 같이 수동으로 다시 만들어 줍니다.

그리고 다음과 같이 설치해 줍니다.

7. systemd 파일 등록.

이제 httpd 의 systemd 파일을 등록해 줍니다. 파일은 다음과 같습니다.

‘httpd.service’ 파일로 저장하고 다음과 같이 systemd 디렉터리로 옮겨 줍니다.

httpd.service 를 systemd 에 등록하고 시작해주면 됩니다.

실행상태는 다음과 같이 확인 가능 합니다.

추가 관련내용

Apache 웹 서버, Configtest 체크 만들기

Apache 웹 서버 시스템을 다루다보면 자주 접하게 되는 문제가 Apache 웹 서버의 재시작 문제입니다. 이것이 왜 문제가 되는가 하면, 재시작을 위해서는 Apache 웹 서버의 설정 파일들이 문제가 없는지에 대한 테스트가 선행되어야 하기 때문입니다.

다행스럽게도 Apache 는 설정 파일에 대한 적합성 테스트를 제공 합니다.

만일 설정파일에 문제가 있다면 다음과 같이 됩니다.

Apache 웹 서버는 어떻게 설정 파일에 문법 체크를 하는 걸까?

1. server/main.c

httpd 실행파일은 server/main.c 에서부터 만들어집니다. 이 파일에는 main() 함수가 존재하고 Switch 문으로 httpd 의 옵션들을 받도록 되어 있습니다.

configtest 옵션을 주면 내부적으로 configtestonly 값이 1루 세팅 됩니다.

Apache 에서 configtest 를 실행하면 바로 위 구문이 실행됩니다. ap_run_test_config 가 실행되네요. ap_run* 은 일종의 매크로 같은 것인것으로 보인다.

server/config.c 에는 Apache의 설정 파일들을 읽고, 검사를 하고, 추가된 모듈이 있다면 모듈에 맞게 문법을 검사 합니다.

내용이 복잡한데, 어째되었던간에 결과는 다음과 같은 문자열을 화면에 뿌리도록 되어 있습니다.

  • ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, “Syntax OK”);
  • return apr_pstrcat(p, “Syntax error in -C/-c directive: “, errmsg, NULL);
  • return apr_psprintf(p, “Syntax error on line %d of %s: %s”,

위와같이 문제가 없으면 ‘Syntax OK’, 문제가 있으면 ‘Syntax error’ 라는 문장을 가진 문자열을 리턴 합니다.

2. 쉘 종료 변수와 stdout, stderr

쉘은 프로그램이 정상 종료나 비정상 종료에 대해 다음과 같은 환경변수를 가집니다.

  • 0 : 정상종료
  • 1 : 비정상 종료

그런데, Apache 웹 서버도 Configtest 를 진행해서 ‘Syntax OK’ , ‘Syntax error’ 는 stderr 로 메시지를 리턴합니다.

이렇게 파일에 저장이 되지 않습니다.  다음과 같이하면 파일에 저장이 됩니다.

Apache 웹 서버는 설정 검사 결과가 통과되던 안되던 메시지는 stderr 로 메시지를 출력 합니다. 단, 쉘 리턴 변수만 달리 됩니다.

3. python 으로 체크 테스트 만들기

python 의 apache configtest 모듈이 있다면 좋았겠지만, 그런게 없더군요. 결국에는 python 에서 외부명령어를 사용하는 방법밖에 없습니다.

python 에서 외부명령어 사용을 위한 방법에는 다양하지만, subprocess 를 이용해 보겠습니다.

위 코드에서 핵심은 Popen 객체에 stderr=sys.stdout 를 주고 외부 프로세스가 끝나기를 기다려 리턴값을 받는 ‘p_status = p.wait()’ 에 있습니다.