ずっとやりたかったやつをやったのでメモ
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
するように変更
...
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対応できて最高。