태그 Archives: apache

apache 2.4.x HTTP/2적용

SPDY ( Stream Control Transmission Protocol )

  • HTTP/2 로 전환 되기 전 google 이 진행했던 웹 가속 프로토콜로 https 기반의 프로토콜 서비스로 현재는 HTTP/2에 흡수되어 개발이 종료 되었음.
    SPDY 지원 가능 브라우져 사용율( 77.39% ) ( 2016년에 chrome에서 지원 제거될 예정 )

 

HTTP/2 ( HyperText Transfer Protocol 2 )

  • 프로토콜 선언 h2, h2c 가 존재함 ( 좀더 확장 가능성 있음 )

 

  • h2의 경우 https 프로토콜 http/1.1 을 http/2 프로토콜로 사용이 가능
    h2는 SSL인증서를 통한 TLS 암호화를 통해 헤더를 압축 전송한다.
  • 단점: 브라우져 지원에 차이가 있음 (h2 HTTP/2 지원 가능 브라우져 사용률 = 70.15%)
    Internet Explorer 11 지원 (윈도우 10만 지원)
    EDGE 지원
    EDGE mobile 지원
    Firefox 36이상
    Firefox for Android 45이상
    Chrome 41이상
    Chrome for android 49 이상
    Safari(OSX 10.11) 9 이상
    Safari(iOS) 9.2이상
    Opera Software Opera 28 이상
    Opera Software Opera mobile 36 이상
  • 결론: 보편적 HTTPS 서비스가 된다는 조건하에 구현 가능( let’s encrypt )

 

  • h2c의 경우 http 프로토콜 http/1.1 을 http/2 프로토콜로 전환 가능
    h2c는 인증서없이 보편적 웹 프로토콜을 목표로 하기 때문에 base64로 압축 전송을 한다.
  • 단점: 지원하는 브라우져가 현재(2016-04-07) 없음
  • 결론: 구현 방법이 쉽지만 지원하는 브라우져가 없음 (현재 curl 7.43 버전 지원 )

 

아파치 2.4.17 버전 부터 DSO 모듈로( mod_http2.so ) HTTP/2를 지원 한다.

CentOS 6.x 대에서의 적용 방법에 대한 문서 이다.

 

먼저 CentOS 6.x 의 경우 기본적으로 openssl-1.0.1 이 설치 되므로 1.0.2 버전을 별도 컴파일 해야 한다.
( https://www.openssl.org/source )

 

이후 의존성인 nghttp2 를 설치한다 epel-release 에 있기 때문에 yum 에 repo 추가가 되어 있어한다.

 

Centos6 에 apache 2.4 설치의 경우 apr, apr-util, pcre 버전을 별도 컴파일 해야 설치 할 수 있다.
( https://apr.apache.org/download.cgi / ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre )

 

이후 아파치를 컴파일 한다. 여기서는 apache 2.4.20 버전을 설치 하였다. ( http://httpd.apache.org )

 

이후 httpd.conf 에서 http2_module을 주석 해제 하고 httpd-ssl.conf를 HTTP/2를 지원하도록  수정 한다.

 

파이어 폭스 > 디버그 모드 > 네트워크 에서 헤더 확인을 할경우 HTTP/2.0 을 확인할 수 있다.

20160406_PicPick_142800

Server Name Indication.

아파치 2.2.12이상 / 아파치 2.4.8 이상 버전에서는 Server Name Indication 를 지원한다.
Server Name Indication은 TLS를 이용한 핸드쉐이크의 확장 기능이라고 보면 되겠다.

몇몇 브라우져 및 기기의 접속 제한이 있지만 이를 무시할 수 있을경우 하나의 서버에서
여러사이트의 SSL(https)를 단일 443 포트로 연결할 수 있다.

 

SNI를 설정할때는 먼저 서버명의 443포트를 먼저 선언해야 고객들의 혼란을 방지 할수 있다.
아파치의 경우 커넥션이 웹서버에 도달했을때 매칭이 되는 가상호스트가 없을경우 최상위에
선언되 버츄얼호스트로 연결한다.( nginx 는 반대로 마지막에 선언된 버츄얼호스트로 작동한다 )

서버 버전이 CentOS 6.5 미만에서는 ca-certificates / nss 업데이트가 필요할 수 있다.

아파치 2.4의 경우 버전을 만족한다면 단순히 443포트로 선언된 여러 가상호스트를 추가하는것만으로 세팅이 완료가 된다.

 

아파치 2.2 버전은 NameVirtualHost 를 선언해야 한다.

위와 같은 세팅만으로 여러 사이트가 443 기본 포트로 ssl 이용이 가능하다.
단  아래 조합은 브라우져에서 SNI 접속 기능이 없기 때문에 접속이 불가능 하다.
Windows XP – 인터넷 익스플로어(모든버전), 사파리
Android 2.3.7(진저브레드)을 포함한 이전 버전
BlackBerry 7.1을 포함한 이전 버전
WindowsMobile 6.5을 포함한 이전 버전
https://en.wikipedia.org/wiki/Server_Name_Indication

 

SNI 는 nginx 0.8.21 이상 / IIS 8.0 이상 역시 지원 한다.