Apache httpd 에서 https http2 brotli 사용하기

# 2019-07-16 최신 버전 기준으로 내용 수정
# HTTP 2 는 기존 HTTP 1.x 의 비효율적인 속도를 개선한 버전으로 Multiplexed Strem, Header Compression 등의 기술이 포함되어 있다.
# 참고
# http://www.bloter.net/archives/210122
# https://icing.github.io/mod_h2/howto.html
# http://httpd.apache.org/docs/trunk/new_features_2_4.html
# http://httpd.apache.org/docs/2.4/programs/configure.html#installationdirectories

# apr 설치
wget http://apache.mirror.cdnetworks.com/apr/apr-1.7.0.tar.gz
tar zxvf apr-1.7.0.tar.gz
cd apr-1.7.0
./configure --prefix=${HOME}/apr
make -j8 && make install

# apr-util 설치
wget http://apache.mirror.cdnetworks.com//apr/apr-util-1.6.1.tar.gz
tar zxvf apr-util-1.6.1.tar.gz
cd apr-util-1.6.1
./configure --prefix=${HOME}/apr-util --with-apr=${HOME}/apr --with-crypto
make -j8 && make install

# openssl 설치
wget https://github.com/openssl/openssl/archive/OpenSSL_1_1_1c.tar.gz
tar zxvf OpenSSL_1_1_1c.tar.gz
cd openssl-OpenSSL_1_1_1c
./config --prefix=${HOME}/openssl -fPIC
make -j8 && make install

# nghttp2 설치
# 아파치 httpd 에서는 mod_http2 모듈을 로딩하여 HTTP 2 처리를 하게 된다.
# 자세한 내용은 https://httpd.apache.org/docs/2.4/mod/mod_http2.html
wget https://github.com/nghttp2/nghttp2/releases/download/v1.39.1/nghttp2-1.39.1.tar.gz
tar zxvf nghttp2-1.39.1.tar.gz
cd nghttp2-1.39.1
./configure --prefix=${HOME}/nghttp2 OPENSSL_CFLAGS="-I${HOME}/openssl/include" OPENSSL_LIBS="-L${HOME}/openssl/lib -lssl -lcrypto"
make -j8 && make install

# brotli 설치
# gzip 보다 향상된 압축방식이다.
# cmake 로 빌드하기 때문에 없으면 설치하자.
sudo yum install cmake
wget https://github.com/google/brotli/archive/v1.0.7.tar.gz
tar zxvf v1.0.7.tar.gz
cd brotli-1.0.7

# 빌드 결과물이 현재 위치에 생성되기 때문에 out 디렉토리를 생성하고 빌드하자.
mkdir -p out
cd out
../configure-cmake --prefix=${HOME}/brotli
make -j8 && make install

# httpd 설치
# 아파치 httpd 2.4.17 (부터 http2 지원) 이후 버전을 설치하자.
wget http://apache.tt.co.kr//httpd/httpd-2.4.39.tar.gz
tar zxvf httpd-2.4.39.tar.gz
cd httpd-2.4.39
./configure \
--prefix=${HOME}/apache-httpd \
--with-apr=${HOME}/apr \
--with-apr-util=${HOME}/apr-util \
--enable-brotli \
--with-brotli=${HOME}/brotli \
--enable-http2 \
--with-nghttp2=${HOME}/nghttp2 \
--enable-ssl \
--with-ssl=${HOME}/openssl \
--with-mpm=prefork \
--enable-mods-shared="unixd authz_core authz_user rewrite authz_host include log_config mime_magic headers unique_id setenvif mime status dir alias"
make -j8 && make install

# 참고
# apr, apr-util 소스를 별도로 빌드하지 않고
# httpd/srclib/apr, httpd/srclib/apr-util 이름으로 압축을 해제하면
# --with-apr --with-apr-util 옵션을 사용하지 않고 httpd 빌드할 수 있다.
# libapreq 설치
wget http://mirror.apache-kr.org//httpd/libapreq/libapreq2-2.13.tar.gz
tar zxvf libapreq2-2.13.tar.gz
cd libapreq2-2.13
./configure --with-apache2-apxs=${HOME}/apache-httpd/bin/apxs

# ${HOME}/apache-httpd/modules/mod_apreq2.so 로 설치된다.
make -j8 && make install

# http2 를 사용할 수 있도록 설정파일에 다음을 추가한다.
sudo vi conf/httpd.config
LoadModule http2_module modules/mod_http2.so
<IfModule http2_module>
LogLevel http2:info
</IfModule>

# h2 -> TLS(SSL) https 로 요청되는 경우
# h2c -> http 로 요청되는 경우
Protocols h2 h2c http/1.1

# 아파치 httpd 시작시 nghttpd 라이브러리를 참조할 수 있도록 환경변수 스크립트 수정
# 기존 경로에 openssl 과 nghttp2 를 추가해 준다.
vi ${HOME}/apache-httpd/bin/envvars
LD_LIBRARY_PATH="${HOME}/apache-httpd/lib:${HOME}/openssl/lib:${HOME}/nghttp2/lib:$LD_LIBRARY_PATH"
export LD_LIBRARY_PATH

# brotli 설정 추가
sudo vi conf/httpd.config
LoadModule brotli_module modules/mod_brotli.so
SetOutputFilter BROTLI_COMPRESS

# 아파치 httpd 시작~
sudo ${HOME}/apache-httpd/bin/apachectl -k start

# gzip brotli 압축 사용시 사이즈 보기
curl -H "Accept-Encoding: gzip" -o out.gz https://ysoftman.com/test
curl -H "Accept-Encoding: br" -o out.br https://ysoftman.com/test

# gzip 압축해제
gzip -d -k out.gz

# brotli 압축해제
# brew install brotli 설치
# https://github.com/google/brotli/blob/master/c/tools/brotli.md

comments:

댓글 쓰기