自分のサイトをHTTP/2対応にしようとしたらものすごいはまった。

Life with open mind: コミケ90で「Get Started with HTTP/2」を出します(3日目 西4 f-44b)
これを読みまして、「よし、自分のサイトもこのビッグウェーブに乗せよう」と思い、(Raspberry Piで運用してる以外のSSLに対応してる)サイトをHTTP/2対応にしました。

サーバ弄る前にクライアントのWindows 10マシンにRS1適用したらOSごと起動しなくなって死ねって思いました。

薄いご本にはOCSP Staplingの設定や、ssl_ciphersの設定について解説してあったのですが、結構前に「SSL LabsでA+取らなきゃ(使命感)」みたいな時期があって、そこら辺は全部済ませてたので飛ばしました。

環境

OS: CentOS 7
nginx: nginx/1.11.3(yum install)→ nginx/1.11.3 (make install)
openssl: OpenSSL 1.0.1e(yum install) → OpenSSL 1.0.2h(make install)

nginx側の設定

http2に対応しているのが1.10.0以上ですが、yumで入ってるのが1.11.3なので何もしなくていい!余裕ですね。$nginx -Vで確認しても「–with-http_v2_module」がついてるので一安心です。そんなふうに思ってたら30分後に自分でビルドすることになったんですけどね。confのserverディレクティブに以下の設定をすると、http2で通信できるようになります。

listen  443 ssl http2;

あとはnginxを再起動すればOKですね。簡単。

http/2で通信してるか確認してみる

firefoxとedgeとchromeで確認してみました。
firefox以外http/1.1で通信していました。

原因を調べる

Supporting HTTP/2 for Google Chrome Users | NGINX
これでした。Chromeでhttp/2通信させようと思ったら、ALPNに対応させないといけないのですが、openssl 1.0.2以降でないと対応してないようです。薄いご本に「ALPNはopenssl 1.0.2以降じゃないと対応してないよ」って書いてあったけど、こういう理由だったんですね。(ALPNに対応させないといけない理由が本にはなかったので、そこはちょっと残念だったかも。)

必要なものをビルドする

opensslの最新版を展開(ビルド不要)。
# cd /usr/local/src
# wget https://www.openssl.org/source/openssl-1.0.2-latest.tar.gz
# tar -zxf openssl-1.0.2-latest.tar.gz
nginxをビルド。

予め$nginx -Vでconfigureがどうなってるのか調べておくと良いです。

SRPMがあるからそれを使う手もあります。
Index of /packages/mainline/centos/7/SRPMS/
RPMのコンパイルオプションを変更してインストールする方法 | あぱーブログ

今回は自力でmakeしました。コマンド書こうと思ったのですが、綺麗なまでに以下の記事と同じところではまったので、記事のURLを紹介しておきます。
nginxのコンパイルメモ – Qiita
上記Qiitaと違う点として、私の環境のconfigureではnjsのバージョンは0.1.0だったため、tipではなく0.1.0を指定しました。
njs: cdb8d20935ee
configureに以下を追加して使いたいopensslの場所を指定します。

--with-openssl=/usr/local/src/openssl-1.0.2h

無事、make installできました。

結果

SSL Labsの結果

SSL Labsの結果

HTTP/2 Testの結果

HTTP/2 Testの結果

SSL Server Test: retrorocket.biz (Powered by Qualys SSL Labs)
HTTP/2 Test | A simple HTTP/2.0 test tool

いくばくか早くなったと信じています。

raspbianでnginx 1.9.3のビルド&init scriptを作成する。

Raspberry Pi 2 model Bにnginxを入れようとしたのですが、Debian wheezy用のリポジトリを指定したら404が返ってきたので自分でビルドしました。使用OSはraspbian(2015-05-05)です。

#入ってなければインストールする。
#ここで何が必要かは環境によって違うかもしれないのでビルドが通らなければ追加する
sudo apt-get install libpcre3 libpcre3-dev
wget http://nginx.org/download/nginx-1.9.3.tar.gz
tar -xvf nginx-1.9.3.tar.gz
cd nginx-1.9.3
./configure #実際は自分の使用する環境に合わせてオプションを指定
make
sudo make install

configureに指定できる引数は下記の「Configure Arguments」です。
nginx: Linux packages
libpcre3-devはPlatformUbuntu – Nginx Communityを参照しましたが、結局のところ何が必要なのかはconfigureやインストール済みのパッケージにも依存すると思うので、ビルドが通らなければ調べる必要があります。

自分でビルドするとinit scriptがなくて不便なので、誰かが公開しているものを使うことにしました。
Fleshgrinder/nginx-sysvinit-script
Installの項目通り、git cloneしてsudo makeすればinit scriptが作成されます。
pidのパスとかも特に意識する必要ないです。便利ですね。

Raspberry Pi 2 model B、無印のModel Bに比べてかなりスペックが高いだけあって、無印時代に動かすのがちょいちょいきつかったWordPressが特にストレスなく使用できるのに驚きました。

ひと通り設定済んだので公開しておきます。
r2@raspberrypi | WordPress on Raspberry Pi 2 Model B + nginx + MySQL

CentOS 7でmongoDB 3.0のWarningを回避する。

CentOS 7環境でmongoを3.0系にアップグレードしたらWarningが出まくってたのですが、時間なくてしばらく放置してたのを回避することにしました。

** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
**        We suggest setting it to 'never'
** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
**        We suggest setting it to 'never'
** WARNING: Readahead for /var/lib/mongo is set to 4096KB
**          We suggest setting it to 256KB (512 sectors) or less
**          http://dochub.mongodb.org/core/readahead
** WARNING: soft rlimits too low. rlimits set to 4096 processes, 64000 files. Number of processes should be at least 32000 : 0.5 times number of files.

hugepageとsoft rlimitsのエラーについては下記を参照しました。
困った何かメモ |mongoDB 3.0.2 mongo shellのWARNINGを回避する
…echo never > /sys/kernel/mm/transparent_hugepage/enabled…については、mongoのサービス起動コマンドをrc.localに書きたくないので、/etc/init.d/mongodのstart()関数を直接いじりました。
soft rlimitsについては公式ドキュメントそのまんま、/etc/security/limits.d/99-mongodb-nproc.confを新規作成しました。

Readaheadのエラーについては下記を参照しました。
centos – Readahead for /var/lib/mongo is set to 4096KB – Server Fault
$df -hでファイルシステムとマウントポイントを調べて$sudo blockdev –setra 256 ファイルシステム を実行します。

最後にmongodを再起動。
$sudo systemctl daemon-reload
$sudo systemctl restart mongod.service

無事Warningが消えました。

OS起動時(Linux)に特定ユーザにスクリプトを実行させたい。

VPS再起動ネタに絡んで。普段OS再起動時に実行させたいスクリプトはrc.localに書いているのですが、特定ユーザでスクリプトを実施させる場合(主にhypnotoadの起動)、suコマンドの-lオプションと-cオプションを使ってコマンドを実行させてたので、すごく気持ち悪くて嫌だなーと思っていました。
具体的には下記の記事と同じ感じです。
rc.localの実行権限とsuによるユーザー切り替えで詰まった – あお日記

仕方ないのでGoogle先生に教えてもらった結果が下記。
システム起動時に特定のコマンドを実行するには - @IT
crontabに@rebootなんていうのがあるのを初めて知りました。スクリプトを実行したいユーザのcrontabを編集してOS再起動したら見事に思ったような挙動になったので良かったです。
ちなみにCentOS 7ですが、Debian系でも同じような挙動をすると思います。

グラディウス2とは関係ない。

【重要】VENOM(KVM・XenなどのQEMUの脆弱性)に関する対策について(5/15 18:10更新) | さくらインターネット
【重要】【さくらのVPS】「VENOM」脆弱性対応に伴うメンテナンス実施のお知らせ(5/20更新) | さくらインターネット

仮想マシンからホストに対して任意のコードが実行できちゃう脆弱性です。あんなとこやこんなとこで試してみたいと思った方も多いんじゃないでしょうか。
自分が使用していたサーバは当初「VENOMの影響を受けない」とアナウンスされていたのですが、残念ながら全VPSが影響を受けるとのことで、さくら側から強制的に再起動を食らう前に自分で電源を入れ直しました。久々にさくらVPSのコンパネにログインしたのですが、さくら本体のメニュー画面とだいぶクオリティが違うなぁと思いました。