dev/Cloud & Infra

Apache httpd 를 컴파일로 설치하기

lugi 2019. 4. 9. 07:46

웹서버를 운영하다보면 주기적으로 웹서버나 WAS 등의 보안 취약점 패치 권고가 날아온다. 그러면 작업 계획을 세우고 버전업을 해야하는데, 아무래도 운영 서버들은 망분리가 되어 있는 경우가 많아서 직접 컴파일을 해서 설치해야 하는 경우가 있다. 아파치 웹서버도 그 중 하나인데, 아파치 웹서버 2.2 에서 2.4로 버전업을 할 때 바뀐 설정값을 일일이 체크하지 못 해서 힘들었던 경험도 있고해서 아파치 웹서버는 개인적으로 좀 아픈 손가락이다.

 

이번에도 아파치 2.4.38 까지 보안 취약점이 발견되었다고 해서 2.4.39 로 패치를 조만간 할 계획을 잡아놨는데 간만에 연습도 하고 준비도 해 둘겸 Apache httpd를 컴파일로 설치하는 법을 정리 해 보려 한다.

 

5G가 개통하고 초연결 시대가 왔다는데 인터넷 끊긴 서버 환경에서 작업하는 걸 정리한다는 게 좀 그렇다...

 

이 작업에 있어서 전제 조건은 다음과 같다.

  1. 아래의 작업들 중 gcc, gcc-c++, perl은 미리 설치되어 있다는 가정하에서 진행한다. 이것까지 설치해야 하는 상황이면 깡통OS 란 얘기인데 이거까지 하기엔 너무 힘들다...

  2. 아마 리눅스 배포판이라면 다 엇비슷할 것이라고 생각하지만, 내가 주로 운영하는 서버들은 RHEL 7 혹은 CentOS7 기반이며 아래의 내용들도 해당 배포판과 버전에서 테스트하였다.

  3. /tmp 디렉토리 아래에 /tmp/apache-install 이라는 디렉토리를 만들어 작업하였고 최종 설치는 /tmp/apache2439 에 하였다. 실제로 반영할 때는 /usr/local 등에 반영이 될 것이다. 그건 prefix 설정할 때 적절히 하자

설치하는데 쓴 준비물은 다음과 같다 (모두 소스코드 버전이다)

  1. httpd-2.4.39 (아파치 웹서버이다)

  2. apr-1.7.0 (Apache Portable Runtime, 웹서버가 Native API 기반으로 동작하게 하기 위한 라이브러리이다. Embedded Tomcat의 성능이 설치 버전보다 낮다는 이야기가 가끔 들리는데, 주로 Java의 표준IO나 NIO 기반으로 동작하기 때문에 나오는 이야기이다. Embedded Tomcat 도 APR을 활성화시켜서 동작시키면 설치 버전이나 매한가지다. https://medium.com/@crueda/tomcat-native-openssl-in-spring-boot-2-0-a341ad07471d 이 글을 참조하자)

  3. apr-util-1.6.1 - APR을 추상화 해 유용한 기능들을 제공해주는 라이브러리이다.

  4. tomcat-connectors-1.2.46 - 톰캣과 웹서버를 연결시켜서 쓸 때 쓰는 녀석이다. 흔히들 mod_jk라고 한다. AJP로 톰캣과 연결할 때 쓰는 그것이다.

  5. openssl-1.0.2r - 설명이 필요한지?

  6. pcre-8.43 - Perl 정규식을 위한 라이브러리다.

  7. expat-2.2.6 - XML 파서이다

  8. zlib-1.2.11.targz - mod_deflate 기능이 활용하는 압축 라이브러리이다.

설치과정은 다음과 같다

  1. 준비한 파일을 디렉토리에 옮기자. (이 테스트는 /tmp/apache-install 디렉토리 아래에서 이루어졌다)

  2. 해당 디렉토리로 가서 압축을 풀자

    for file in *.tar.*; do tar -xvf "$file"; done  
  3. pcre 디렉토리로 가서 컴파일을 하자

    ./configure --prefix=/tmp/apache-install/pcre-for-httpd  
    make  
    make install  
  4. openssl 디렉토리로 가서 컴파일을 하자

    ./config --prefix=/tmp/apache-install/openssl-for-httpd -fPIC shared
    make   
    make install

    openssl 은 OS별 의존성을 타는데 ./configure가 아니라 ./config를 통해서 그걸 자동으로 맞춰준다

    -fPIC shared를 통해서 openssl을 공유라이브러리로 만들어준다고 한다. 사실 gcc를 잘 몰라서 이렇게 안 하면 에러가 뜬다는 것만 알고 있다...

  5. expat 컴파일을 하자

    ./configure --prefix=/tmp/apache-install/expat-for-httpd  
    make
    make install
  6. apr-1.7.0, apr-util-1.6.1 디렉토리는 추후 설치시 included로 사용할 수 있게 httpd 하위 디렉토리로 옮기자

    mv apr-1.7.0 httpd-2.4.39/srclib/apr  
    mv apr-util-1.6.1 httpd-2.4.39/srclib/apr-util  

    http://httpd.apache.org/docs/2.4/en/install.html 에 따르면 included 옵션으로 설치하기 위해서는 unpack them into /httpd_source_tree_root/srclib/apr and /httpd_source_tree_root/srclib/apr-util (be sure the directory names do not have version numbers) 라고 apr, apr-util 을 하위 경로로 옮기라고 나오는데 한글 버전 메뉴얼엔 그런 말이 없다. 왜일까...

  7. httpd 디렉토리로 가서 아파치 웹서버를 컴파일 하자
    http://httpd.apache.org/docs/2.4/programs/configure.html#installationdirectories 을 참고하여 여기서 기본적으로 포함되는 모듈이라고 지칭된 것들은 별도로 옵션을 주지 않아도 설치가 된다. 기본적으로 포함하지 않는 모듈 중에서 필요한 것이 있다면 설치하도록 하자. 다만 기본적으로 포함하지 않는 모듈 중에서 필요한 것을 활성화하기 위해서는 추가로 설치해야 하는 것이 있을 수도 있다.
    예를 들어 mod_deflate의 압축 기능은 zlib에 의존적이다. 추가로 설치가 필요하다면 아래와 같이 컴파일하여

    ./configure --prefix=/tmp/apache-install/zlib-for-httpd
    make
    make install

    --with-z=/tmp/apache-install/zlib-for-httpd 로 설정하자

    --with-mpm 옵션은 2.4에서는 설정하지 않으면 event이다. prefork나 worker가 필요하다면 별도로 조정하자

    ./configure \
    --prefix=/tmp/apache2439 \
    --enable-mods-shared=most \
    --with-included-apr \
    --with-pcre=/tmp/apache-install/pcre-for-httpd \
    --with-expat=/tmp/apache-install/expat-for-httpd \
    --with-z=/tmp/apache-install/zlib-for-httpd \
    --enable-ssl --with-ssl=/tmp/apache-install/openssl-for-httpd
    make
    make install
  8. tomcat-connector를 컴파일 하자

    apxs가 필요하다. apxs는 아파치의 확장 모듈을 컴파일하는데 필요한 도구이다. https://httpd.apache.org/docs/2.4/ko/programs/apxs.html 을 참조하자

    tomcat-connector 아래의 native 디렉토리에서 작업해야한다.

    컴파일시에 설치된 아파치 디렉토리의 bin의 apxs 경로가 필요하다

    cd /tmp/apache-install/tomcat-connectors-1.2.46-src/native  
    ./configure --with-apxs=/tmp/apache2439/bin/apxs  
    make  
    make install  

    make까지 수행했을 때 libtool: warning: remember to run 'libtool --finish /tmp/apache2439/modules' 이라고 뜨는데 크게 신경쓰지 말자. 이 명령어는 make install할 때 수행된다.

  9. 여기까지 끝났으면 아파치 디렉토리의 modules에 mod_jk.so가 생겼고 아파치에서 모듈을 로드해서 쓸 수 있다.
    이제 conf를 설정하고 apache의 bin 디렉토리에 가서 ./apachectl -k start 해보면

    root     30949     1  0 16:44 ?        00:00:00 /tmp/apache2439/bin/httpd -k start  
    daemon   30950 30949  0 16:44 ?        00:00:00 /tmp/apache2439/bin/httpd -k start  
    daemon   30951 30949  0 16:44 ?        00:00:00 /tmp/apache2439/bin/httpd -k start  
    daemon   30952 30949  0 16:44 ?        00:00:00 /tmp/apache2439/bin/httpd -k start  

    을 볼 수 있다.
    이걸 서비스로 등록하는 건 리눅스 배포판에 맞게 하면 되겠다.