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対応できて最高。

新卒としてエンジニアになって1年が経った

krrrr.hatenablog.com

このエントリ読んだ感化されたので自分も雑に振り返って書いてみる。
仕事は大きく分けて前半Android、後半Scalaという感じだった。

Android

多少はエンジニアリングの知識があったこともあり、エンジニアとしての研修はだいたいスキップしてすぐに業務に入ることが出来たのは幸運だった。
そもそも人数が少なくてじっくり教育されてる暇も無かったし、こちらも出来るだけ早く何かしら貢献したかったので良かった。
入社して半年間は学生時代にとった杵柄でAndroid書いてた。 ちなみにちょっとiOS(Objective-C)もやってた。

東京に来てテンション上がってたこともあって、頻繁に勉強会に参加してた。
あとは自分自身で勉強会も開催してみたり。

petitviolet.hatenablog.com petitviolet.hatenablog.com

当時、業務ではSDKと呼ばれる類のものをpure javaで開発してて、 RxJavaとかRealmみたいな流行りの技術を使うことがなかったため、プライベートで触ってほくほくしてた。
ライブラリは使わないけど、アーキテクチャはそれっぽくしてやろうと思って、MVP + Clean Architectureを取り入れて開発していた。
この時に学んだことや試行錯誤した体験のおかげで、アーキテクチャとかに興味を持つようになった。
昔から思いついたらとりあえず手を動かして書きながら直していく、みたいなスタイルだったけど少しずつちゃんと考えながら書くようになってきている。

Scala

後半の半年間はチーム異動し、Scalaでサーバーサイドエンジニアとしてアプリケーション開発をしている。
AndroidJavaじゃないな、と強く感じている。
Scala自体は学生の頃からほんのり触っていたのと、Scalaチームになる前にすごいH本を読んで関数型プログラミング勉強してたのが活きて、最初からぼちぼち書けて良かった。

すごいHaskellたのしく学ぼう!

すごいHaskellたのしく学ぼう!

今は特にパフォーマンスが要求されるタイプのアプリケーションを作っているが、だからこそより綺麗に実装しようという気持ちが強くなった。 そのためにもDDD勉強していて、これが最新のアーキテクチャか!と感動したけど、エリック・エヴァンスが最初に本出したのは10年以上前だと知ってエンジニアリングの進歩は意外と遅いのかもしれない。

エリック・エヴァンスのドメイン駆動設計 (IT Architects’Archive ソフトウェア開発の実践)

エリック・エヴァンスのドメイン駆動設計 (IT Architects’Archive ソフトウェア開発の実践)

関数型プログラミングとDDDを深めて自分の武器としたいと思っているが難しすぎる。

アプリケーションの運用を多少は自分もやっていて、環境構築とか障害対応とかで経験値だいぶ積めた。
とはいえ知識は不足してるし未だにDockerたいして分かってないし自動化もまだまだやれてないしまだまだ。

ScalaMatsuriには2日間フルで参加して世の中には強者がたくさんいると再確認したので、上を見て頑張っていこうという気持ちが強くなった。
最近はあんまり勉強会出てなくて、何となくぽけーっと話を聞くくらいなら自分で勉強したほうがよっぽど効率がいいので、 聴きたいトピックがピンポイントでないと参加しないようになってきた。
何かしらいい感じのネタがまとまったらどこかで発表したいなぁ。

雑感

社会人1年目だけど意外とやれている感覚はある、といっても26歳で全く若くないし危機感の方が強い。
いつまでものんびり.vimrcを弄っていられないんだ俺は。

あと「何を作るか」より「どうやって作るか」に意識が寄ってきている感覚があり、これはまずい。
どれだけ最高のアーキテクチャで高パフォーマンスで美しいコードでもユーザーがいなければ無価値なので、「何を作るか」が根本にはあるべきだと思っている。
普段の開発における姿勢を見直していかねば。

hubotの画像検索とそれにまつわるGoogleのUIについて

hubotの画像検索が死んでたので、以下のページを参考に直した
hubot-google-image で Google Custom Search API を利用する設定 - Qiita

その作業途中でGoogleカスタム検索の設定で画像検索をONにしなければならないとあったので以下のようにトグルボタンを設定していたが、何度リクエスト送っても検索結果が0件で終わってしまう現象になっていた。

f:id:petitviolet:20151227173404p:plain

正しくは以下の状態だった。それだけのことだが、わかりづらすぎる。
f:id:petitviolet:20151227173403p:plain

herokuにhubotをdeployしているので、

heroku config:set HUBOT_GOOGLE_CSE_KEY=<KEY>
heroku config:set HUBOT_GOOGLE_CSE_ID=<ID>

として無事復活