[httpd] http/2 설정
http/2
http/1.x
는 요청 하나당 하나의 응답을 제공한다. 하나의 페이지에 모든 리소스들을 때려넣었다면 단 한번의 요청으로 웹페이지를 렌더링할 수 있겠지만 다양한 목적이나 제약에 의해서 대부분의 웹페이지들은 리소스들을 분리시킨다.
스타일시트나 자바스크립트 등의 정적인 리소스들은 캐시해두고 재사용하면 통신 비용이 절감될 것이고 미디어파일들은 대부분 다이나믹이기때문에 (미디어도 코드로 넣을 수는 있지만) 분리하는게 편리하기 때문이 아닐까
이런 상황에서 기존의 방식은 HOL
(Head Of Line) Blocking, RTT
(Round Trip Time) 증가와 같은 문제가 발생하는데 이런 똑똑하지 못한 통신 방식을 개선한 것이 http/2 이며, Multiplexed Streams
, Proioritization
, Server Push
, Header compression
과 같은 핵심 기능을 제공한다.
데이터베이스에서 한 건씩 처리하는 것보다 bulk 처리를 하며 공통된 부수작업을 한번에 끝내고, 같은 작업에 대해 효율이 좋은 압축을 사용하는 등의 개념인 것 같다.
설치
기존 http/1.x 표준을 대체하는 것이 아니기때문에 운영하고 있는 웹서버와 클라이언트가 http/2 를 지원한다면 굳이 http/2 를 이용하지 않을 이유가 없는 것 같아서 집에서 운영하는 httpd에 적용해본다.
활성화 방법은 https://httpd.apache.org/docs/trunk/howto/http2.html 에 자세히 나와있지만 httpd.conf
에 아래 모듈을 불러오기만 하면 되는데
LoadModule http2_module modules/mod_http2.so
ProtocolsHonorOrder On
Protocols h2 h2c http/1.1
해당 모듈이 빌드가 돼 있지 않아서 httpd 를 처음부터 다시 설치했다.
nghttp2 라이브러리를 먼저 설치하고
yum -y install libnghttp2 libnghttp2-devel
아래 옵션을 추가해 다시 설치한다.
–with-mpm=event –enable-http2
mpm은 prefork 방식으로 했을 때 살짝 문제가 될 수도 있다고 한 것 같아 권장하는대로 event 형태로 변경했다.
./configure \
--prefix=/usr/local/2.4.27 \
--with-apr=/usr/local/apr \
--with-apr-util=/usr/local/apr-util \
--with-pcre=/usr/local/pcre \
--enable-module=shared \
--enable-so \
--enable-mods-shared=ssl \
--with-ssl=/usr/local/openssl \
--enable-ssl=shared \
--enable-rewrite \
--with-mpm=event \
--enable-http2
아래와 같이 모듈을 불러오면
LoadModule http2_module modules/mod_http2.so
<IfModule http2_module>
ProtocolsHonorOrder On
Protocols h2 h2c http/1.1
</IfModule>
끝일 줄 알았는데 apxs로 설치했던 php 라이브러리가 날아가서 php랑 php 확장들도 다시 설치했고, httpd mod_wsgi 도 다시 설치해야만 했다.
브라우저에서 개발자 도구로 확인했을 때에는 http/2+quic/46
프로토콜로 접속하는 것을 확인할 수 있었고, access_log 에서도 아래와 같이 찍힌다.
00.000.00.00 - - [26/Oct/2019:00:00:00 +0900] "GET /workspace/........ HTTP/2.0" 200 29064
nextcloud를 좀 더 써보면서 http/2 적용한 게 성능 체감이 되는지는 봐야할 것 같다.
참고자료
http/1.x 버전에서 발생하는 문제와 여러 개발자들의 우회 방법은 https://www.popit.kr/%EB%82%98%EB%A7%8C-%EB%AA%A8%EB%A5%B4%EA%B3%A0-%EC%9E%88%EB%8D%98-http2/ 에 잘 정리가 돼 있다.
http/2에 대한 자세한 명세는 다음 URL을 참고하면 좋을 것 같다.
https://developers.google.com/web/fundamentals/performance/http2/?hl=ko