내 서버에 http/2 적용기 (Ubuntu + Nginx + SSL 인증서 발급받기)

오늘은 내 서버에 http 2를 적용했다. 딱히 뭐가 없는 사이트긴 하지만 그냥 해볼 수 있을때 해두자.. 정도로… 생각해서 진행했다.

HTTP/2 란?

기존의 HTTP/1.1은 99년도에 출시되어 지금까지 유지하고 있는 프로토콜이다.
… 사실 여기까지만 말해도 이해가 될 것 같긴 하지만…
처음에 웹은 정말 논문을 공유하는 정도의 수준을 생각했었고..
속도나 현재 디바이스들과 인터넷 환경에 고려가 전혀 되지 않은 채로 정해진 규격이다.

HTTP/1.1의 Connection 요청 처리를 개선하기 위해 pipelining 등을 사용하기도 하고.. 그로 인해서 Round Trip 문제도 생긴다고 한다.

웹 속도와 처리를 개선하기 위해 다양한 노력이 있었는데 제일 유명한 것이 Google사의 SPDY 프로토콜이고.. 자세한 건 이 글을 참조하면 좋을 듯 하다.

HTTP/2도 SPDY를 고안하여 만들어졌다고 하니 이런 역사를 공부해봐야 할 것 같다.

아무튼(…) 이러한 개선을 위해 노력하고 있고. 지원하는 브라우저도 늘어난다고해서 내 개인 서버에 적용해보았다.

NGINX 업그레이드

처음 적용할 때 내 Ubuntu 버전은 14.04 LTS 였고 apt로 nginx 패키지를 업그레이드 하려했지만 되지 않았다.

NGINX 버전을 올리기 위해서 apt 소스 리스트를 업데이트해주어야 했다.

우선 /etc/apt/sources.list.d/nginx.list 라는 파일을 만들고 아래와 같이 입력한다.

deb http://nginx.org/packages/mainline/ubuntu/ trusty nginx
deb-src http://nginx.org/packages/mainline/ubuntu/ trusty nginx

그리고 사이닝 키를 추가한다.

wget -q -O- http://nginx.org/keys/nginx_signing.key | sudo apt-key add -

그 후 nginx 를 설치한다. 만약에 이전에 설치한게 있으면 지우고 설치하는게 제일 깔끔하더라. (설정 파일은 안날라감)

sudo apt-get update
sudo apt-get install nginx

설정 파일을 덮어 쓸 것인지 물어보는데 기존의 설정 파일이 복잡하지 않아서 나는 덮어쓰기를 했다.

설정을 바꾸려고 보니.. HTTP/2는 HTTPS에서만 적용되고.. SSL 인증서가 필요하다.

아 맞다 나 인증서가 없네..?;

SSL 인증서 발급받기

개인 사이트인데 인증서를 막상 구입해서 쓰려니 부담이 됐다.

문득 떠오른 Let’s Encrypt.. 무료로 SSL를 발급해준다는 이야길 들은 적이 있었다.

설치 방법

https://certbot.eff.org에 가면 자신의 환경에 맞는 설치 방법들을 볼 수 있다.

나는 nginx on ubuntu 14.04 를 기준으로 진행한다.

다운을 받고 실행 권한을 맞춰준다.

wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto

실행을 한다.

./certbot-auto certonly --standalone -d example.com -d www.example.com

그리고 자동으로 90일이 되면 자동으로 리뉴얼 하도록 하는 명령어

./certbot-auto renew --dry-run

이렇게 발급받은 후 nginx 에 세팅을 해야하는데 이 부분은 Mozilla SSL Configuration Generator를 이용했다.

간단하게만 세팅한 걸 설명하자면

/etc/nginx/sites-enables/880322.tld 파일에 433 port ssl 을 추가한다.

server {
  listen 443 ssl http2;

  ssl_certificate /etc/letsencrypt/live/880322.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/880322.com/privkey.pem;
  ssl_session_timeout 1d;
  ssl_session_cache shared:SSL:50m;
  ssl_session_tickets off;

  # Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
  ssl_dhparam /etc/nginx/ssl/dhparam.pem;
  # run openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048

  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
  ssl_prefer_server_ciphers on;
}

정로도 세팅했다.

잘 됐는가! 했는데 안되더라..;

예상이 가능한 원인은 openssl 버전이었는데.. 귀찮아서 ubuntu 버전을 업데이트 했더니 http2가 적용됐다.

다음번엔 openssl을 따로 업그레이드 하넌 방법을 알아보는 편이 나을듯.

아무튼 오늘의 뻘짓은 여기까지..