NginxとLet'sEncryptを使ってCentOS7でhttps&http2対応する
ずっとやりたかったやつをやったのでメモ
借りてるVPSにdocker入れようと思ったらのCentOS6だとダメだったから7入れようとして失敗してる
— こむ (@petitviolet) 2016年4月17日
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
確認
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
https対応したしnginx新しくしてhttp2対応した
— こむ (@petitviolet) 2016年4月18日
感想
let’s encrypt便利だな〜〜〜
— こむ (@petitviolet) 2016年4月18日
Let's Encrypt便利すぎる。 Nginx使えば簡単にhttp2対応できて最高。