CentOS7 Apache httpd-2.4.34 + HTTP / 2 + Brotli 설치 로그

2018년 7월 16일 Apache httpd2.4.34가 안정판으로 출시되었네요. 근 4개월 만의 버전업입니다.
Apache httpd 2.4.34에서는 mod_md (ACME 프로토콜을 사용하여 SSL / TLS 인증서 배포 및 업데이트를 자동화 해주는 모듈)의 버그 수정을 중심으로 각종 취약점 (CVE-2018-8011, CVE-2018 -1333)에 대해 패치 되었습니다. 그래서, CentOS7.5 (1804)에 Apache httpd 2.4.34을 설치하는 방법을 정리해 보았습니다. 

참고 자료 : 2.4 용 Complete ChangeLog


1. 개발 도구 설치

Apache httpd 및 각종 라이브러리를 소스에서 컴파일하기 때문에 CentOS7.5 (1804)를 "최소 설치"에서 설치하는 경우 기본 명령과 개발 도구를 설치하고 둡시다.

설치가 되어있다면 무시할꺼고, 버전이 옛날꺼면 업데이트 할 것이며, 이게 없다면 설치하겠죠!
yum -y groupinstall base
yum -y groupinstall development
yum -y update 

2. Nghttp2 설치

HTTP / 2 (mod_http2)의 핵심 엔진인 Nghttp2를 설치합니다.
Nghttp2 설치에 필요한 라이브러리 설치
yum -y install openssl-devel
yum -y install jansson-devel
yum -y install libev-devel
yum -y install c-ares-devell
Nghttp2 다운로드 (다운로드 전에 Nghttp2의 최신 버전 을 확인하여 둡시다)
cd /usr/local/src/ 
wget https://github.com/nghttp2/nghttp2/releases/download/v1.33.0/nghttp2-1.33.0.tar.gz
Nghttp2를 컴파일하고 설치합니다. (적당히 시간이 걸립니다)
tar xvzf nghttp2-1.33.0.tar.gz
cd nghttp2-1.33.0/
./configure -enable-app
make
make install 
HTTP / 2 라이브러리인  "libnghttp2" 는
/usr/local/lib 아래에 설치됩니다.
Nghttp2 관련 명령은 /usr/local/bin 아래에 설치됩니다.
(h2load는 참편합니다.)

3. Brotli 설치

Brotli 컴파일은 cmake를 사용하기 때문에 요놈을 설치해야합니다.
yum -y install cmake
Brotli 다운로드 (다운로드 전에 Brotli의 최신 버전 을 확인하여 둡시다)
cd /usr/local/src/
wget https://github.com/google/brotli/archive/v1.0.5.tar.gz 
Brotli를 컴파일하고 설치합니다.
tar xvzf v1.0.5.tar.gz
cd brotli-1.0.5/
mkdir out && cd out
../configure-cmake
make
make test
make install 
Brotli 라이브러리가 /usr/local/lib 아래에 설치됩니다.

4. 라이브러리 경로 추가

HTTP / 2와 Brotli 라이브러리가 "/ usr / local / lib"다음에 설치되어 있었으므로, 라이브러리 경로에 추가해야합니다. (이 후 설치 curl 최신 버전의 라이브러리도 이곳에 설치됩니다)
echo /usr/local/lib > /etc/ld.so.conf.d/usr-local-lib.conf
ldconfig 

5. curl의 최신 버전을 설치

mod_md 컴파일 버전 7.5 이상 curl 라이브러리가 필요하므로 최신 버전을 설치해야합니다. (설치 전에 curl의 최신 버전 을 확인하여 둡시다)
cd /usr/local/src/
wget https://curl.haxx.se/download/curl-7.61.0.tar.gz
tar xvzf curl-7.61.0.tar.gz
cd curl-7.61.0/
./configure
make
make install 

6. Apache httpd 설치 준비

Apache httpd 컴파일에 필요한 패키지를 설치해야합니다.
yum -y install pcre-devel
yum -y install expat-devel 
또한 Apache 2.4을 소스 코드에서 설치하는 경우에는 APR과 APR-util 가 필요하므로 설치해야합니다.
APR
cd /usr/local/src/
wget http://ftp.jaist.ac.jp/pub/apache//apr/apr-1.6.3.tar.gz
tar xvzf apr-1.6.3.tar.gz
cd apr-1.6.3/
./configure
make
make install 
APR-util
cd /usr/local/src/
wget http://ftp.jaist.ac.jp/pub/apache//apr/apr-util-1.6.1.tar.gz
tar xvzf apr-util-1.6.1.tar.gz
cd apr-util-1.6.1/
./configure --with-apr=/usr/local/apr
make
make install 

7. Apache httpd 2.4.34 설치

드디어 본론의 Apache httpd 설치합니다.
Apache httpd 소스 코드 다운로드
cd /usr/local/src/
wget http://ftp.jaist.ac.jp/pub/apache//httpd/httpd-2.4.34.tar.gz 
다운로드 한 소스 코드를 압축하여 디렉토리를 이동합니다.
tar xvzf httpd-2.4.34.tar.gz
cd httpd-2.4.34/ 
HTTP / 2와 Brotli 모듈, SSL / TLS와 mod_md를 사용하여 설치합니다.
./configure \
--enable-http2 \
--enable-brotli \
--with-brotli=/usr/local/lib \
--enable-ssl \
--enable-md \
--with-apr=/usr/local/apr \
--with-apr-util=/usr/local/apr \
--enable-so \
--enable-mods-shared=all \
--enable-mpms-shared=all
 
make
make install 
이상에서 Apache/usr/local/apache2/ 아래에 설치되었습니다. 
바로 SSL 서버 인증서 만들기 및 Apache 설정합니다.

8. 자체 서명 된 SSL 서버 인증서 만들기

정품 인증 기관에서 발급 한 서버 인증서를 무료로 얻을 수 있습니다. 참고하세요 mod_md을 사용하여 Let 's Encrypt 서버 인증서를 얻을 수 있습니다. 
HTTP / 2 및 Brotli은 HTTPS가 필요하므로 Apache의 설정 전에 SSL 서버 인증서를 작성해야합니다.
비밀 키를 생성 ECDSA (256 비트 키를 생성)
openssl ecparam -name prime256v1 -genkey -out server.key
CSR (인증서 서명 요청) 만들기 (아래 2개만 입력하세요)
openssl req -new -key server.key > server.csr
 
Country Name (2 letter code) [XX]:KR
State or Province Name (full name) []:<엔터>
Locality Name (eg, city) [Default City]:<엔터>
Organization Name (eg, company) [Default Company Ltd]:<엔터>
Organizational Unit Name (eg, section) []:<엔터>
Common Name (eg, your name or your server's hostname) []:www.example.com
Email Address []:<엔터>
 
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:<엔터>
An optional company name []:<엔터> 
SSL 서버 인증서 생성 (유효 기간 10 년)
openssl x509 -days 3650 -req -signkey server.key <server.csr> server.crt
비밀키와 SSL 인증서 이동
mv -i server.key / etc / pki / tls / private / 
mv -i server.crt / etc / pki / tls / certs
권한 변경
chmod 600 /etc/pki/tls/private/server.key 
chmod 600 /etc/pki/tls/certs/server.crt
SELinux를 사용하는 경우는 비밀 키와 SSL 인증서에 보안 컨텍스트를 붙여 둡시다. (Apache 시작시 오류가 발생할 수 있으니)
restorecon -v /etc/pki/tls/private/server.key 
restorecon -v /etc/pki/tls/certs/server.crt
CSR 삭제
rm server.csr

9. Apache httpd 설정

원래의 설정 파일 백업
mv -i /usr/local/apache2/conf/httpd.conf /usr/local/apache2/conf/httpd.conf.org
mv -i /usr/local/apache2/conf/extra/httpd-ssl.conf /usr/local/apache2/conf/extra/httpd-ssl.conf.org 
· 설정 파일을 만들자
vi /usr/local/apache2/conf/httpd.conf
vim /usr/local/apache2/conf/extra/httpd-ssl.conf

10. systemd 서비스 파일 만들기

Apache httpd 용 systemd 서비스 파일 (시작 스크립트의 일종)을 만듭니다.
vim /etc/systemd/system/httpd.service
[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target
 
[Service]
Type=forking
ExecStart=/usr/local/apache2/bin/apachectl start
ExecReload=/usr/local/apache2/bin/apachectl graceful
ExecStop=/usr/local/apache2/bin/apachectl stop
 
[Install]
WantedBy=multi-user.target 
만든 서비스 파일을 systemd에 반영
systemctl daemon-reload 
systemd에 반영되어 있는지 확인
systemctl list-unit-files | grep httpd 
httpd.service disabled  ← 이렇게 나오면 OK
시작
systemctl start httpd
자동 시작 설정
systemctl enable httpd

11. firewalld 설정

HTTP (80 / tcp)와 HTTPS (443 / tcp)를 열어 둡니다.
firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --add-port=443/tcp --permanent
firewall-cmd --reload 
· 확인 
firewall-cmd --list-all
public (default, active)
interfaces: enp0s3 enp0s8
sources:
services: dhcpv6-client ssh
ports: 443/tcp 80/tcp ← 이게 나오면 OK
(생략)

12. 로그 순환 설정

· 설정 파일을 만듭니다 
vi /etc/logrotate.d/httpd
· 확인합니다 
logrotate -dv /etc/logrotate.d/httpd 
----- (아래와 같이 나오면 됩니다) -----
reading config file /etc/logrotate.d/httpd
 
Handling 1 logs
 
rotating pattern: /usr/local/apache2/logs/*log after 1 days (60 rotations)
empty log files are rotated, old logs are removed
(중략) 
이상! 끝.