petitviolet_blog

@petitviolet blog

NginxとLet'sEncryptを使ってCentOS7でhttps&http2対応する

ずっとやりたかったやつをやったのでメモ

CentOS6から7にOSアップデートしたので、この機会を活かしてやりたかったhttp2対応した。

portあける

まずやるべきこと。 httpとhttpsのportをあける。

firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload

Nginxのインストール

新しいバージョンじゃないとhttp2対応してないので注意

yum install http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
yum install --enablerepo=nginx nginx
systemctl enable nginx

2016/04/18時点だと1.9.14だった

$ nginx -v
nginx version: nginx/1.9.14

Let's EncryptでSSL証明書

Let's EncryptでSSL証明書wwwあり/なしの両方で取得しておく。 Dockerでやろうとしたら何故かうまくいかなかったので、cloneしてきてコマンドを実行する。 この時点でNginxが起動しているとLet's Encryptのプロセスと競合するので止めておくこと。

git clone https://github.com/letsencrypt/letsencrypt
mv letsencrypt /usr/local/
/usr/local/letsencrypt/letsencrypt-auto certonly -a standalone --webroot-path /path/to/root -d www.example.com -d example.com

ちなみにDockerだと以下のようにすれば出来た、らしい。 上記のコマンドでやると色んな依存モジュールがインストールされて環境が汚れる感じがするので、可能ならDockerでやったほうがよい。 これぞDockerの使いどころという印象。 (このためにDocker入れたくてOSアップデートしたにも関わらず使えなかった)

sudo docker run -it --rm -p 443:443 -p 80:80
  --name letsencrypt
  -v "/etc/letsencrypt:/etc/letsencrypt"
  -v "/var/lib/letsencrypt:/var/lib/letsencrypt"
  quay.io/letsencrypt/letsencrypt:latest certonly

Nginxの設定

まずはvirtualhostの設定をincludeするように変更

  • /etc/nginx/nginx.conf
...

http {
  ...

  include /etc/nginx/conf.d/example_com.conf;
}

次にincludeされるconfファイルの設定。 今回はwww.example.comのようにwww付きに統一する。

  • /etc/nginx/conf.d/example_com.conf
    • listenのところに443 http2と書くのが大事らしい
server {
    listen       443 ssl http2 default_server;
    listen       [::]:443 ssl http2 default_server;
    server_name  www.example.com;

    ssl on;
    ssl_certificate     /etc/letsencrypt/live/www.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem;

    access_log  /var/log/nginx/access.log  main;

    location / {
        root   /path/to/root/;
        index  index.html index.htm;
    }
}

# httpで来たのをwww.example.comにhttpsに飛ばす
server {
    listen       80;
    server_name  example.com www.example.com;
    return 301   https://www.example.com$request_uri;
}

# httpsで来たけどwwwついてないのにwwwつける
server {
    listen       443;
    server_name  petitviolet.net;
    return 301   https://www.petitviolet.net$request_uri;
}

ここまでやったらNginx再起動

systemctl restart nginx

確認

Macからhttp2対応したcurlで確認してみる。

brew reinstall curl -- --with-nghttp2
brew link curl --force
exec $SHELL -l
curl https://www.example.com -i --head

結果はこうなったので出来たらしい

HTTP/2.0 200
server:nginx/1.9.14
date:Mon, 18 Apr 2016 14:46:29 GMT
content-type:text/html
content-length:6009
last-modified:Sun, 17 Apr 2016 08:13:19 GMT
vary:Accept-Encoding
etag:"5713459f-1779"
accept-ranges:bytes

感想

Let's Encrypt便利すぎる。 Nginx使えば簡単にhttp2対応できて最高。