このサイト(CentOS 7)のPHPを5.4から7.1にアップグレードした。

グーペのPHPバージョンを5.2から7.1にアップグレードしました – ペパボテックブログ
すぐ詐欺にあいそう、とよくいわれるくらい何かに影響を受けやすいのと、このサーバ上で動いているサービスのうち、PHPで動作しているものがWordPressしかないため、アップグレードすることにしました。
ちなみにWordPressの推奨PHPバージョンは7以上です。

アップグレード前

 !  ~  rpm -qa | grep php                                                                                                  2017年06月26日 22時05分45秒
php-mbstring-5.4.16-42.el7.x86_64
php-fpm-5.4.16-42.el7.x86_64
php-mysql-5.4.16-42.el7.x86_64
php-gd-5.4.16-42.el7.x86_64
php-common-5.4.16-42.el7.x86_64
php-pdo-5.4.16-42.el7.x86_64

yumのデフォルトバージョン、かつ最小構成ですね。ほぼ何も入ってなくて笑いました。ちなみにこのブログはphp-fpmとnginxの構成で動いています。
トラブル起こると嫌なのでfishからbashに切り替えてから作業しました。

インストール

$ sudo yum remove php-* # パッケージ削除
$ sudo yum install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm # remiリポジトリ追加
$ sudo yum install --enablerepo=remi-php71 php-fpm php-mbstring php-mysqlnd php-pdo php-gd php-common

php-mysqlではなくphp-mysqlndを使えという記事が多かったのでこちらを採用しました。あと、場合によってはyum install epel-releaseしないとだめかもしれませんね。

php-fpmの設定

設定ファイルは/etc/php-fpm.d/www.confにありました。
userとgroupをnginxの実行ユーザに合わせています。

user = www-data
group = www-data

; unix socketでリスンしてるので設定を変更。ファイルのパーミッションをnginxが読めるように設定
listen = /var/run/php5-fpm.sock
listen.owner = www-data
listen.group = www-data

無事動くようになりました。x-powered-byはPHP/7.1.6ですね。ちなみに私はx-powered-byでバージョン隠さない派です。

サーバのストレージ容量が半分切ったので原因を調べた。

Logwatch、普段はストレージサイズの項目読んでないのですが、久しぶりに見てみたらこんな感じで半分切っててびっくりしたので原因を調べました。

 --------------------- Disk Space Begin ------------------------ 

 Filesystem                               Size  Used Avail Use% Mounted on
 /dev/mapper/centos_tk2--212--15517-root   28G   14G   15G  48% /
 devtmpfs                                 487M     0  487M   0% /dev
 /dev/vda1                                497M  291M  207M  59% /boot

やったこと

以下コマンドで誰がどれだけ容量を占めているか確認する。

cd /
sudo  du -sh ./*
(略)
4.0K    ./tmp
3.8G    ./usr
8.6G    ./var

なるほど、var配下が怪しそうです。多分wwwかログでしょうね。

cd /var
sudo  du -sh ./*
(略)
7.2G    ./log

あっ…。

原因

mongodbのログが7GB超えてた。
そういえば、今まで特にトラブルなかったからmongoのログ見たこと無いんですよね。やばい。以下のドキュメントを見てローテートの設定を行いました。
Rotate Log Files — MongoDB Manual 3.2
あとは定期的に古いログを圧縮すればOKですね。
おかげでストレージ利用率27%まで落とせました。良かったです。

Let’s Encryptでsplapiをhttp/2に対応させた。

retrorocket.bizは強制的にhttpsで通信するようになっています。retrorocket.bizで試しに作ってるWebアプリがあって、そこから適当なAPIを呼ぼうと思ってJavaScriptからsplapiを呼んだらエラーになって自爆しました。SSL対応してないから当然ですね。
時代は常時SSLだし自爆したのでいい加減対応することにしました。
最初StartSSLで証明書を取得しようとしたのですが、手続きが心底めんどくさいのと、返事がめちゃくちゃ遅いのでLet's Encryptでさっさと証明書を取得することにしました。

証明書の取得は以下のサイトを参考にしました。gitとPythonが必須です。CentOS 7では特に問題なく動作しました。
Let’s Encrypt サーバー証明書の取得と自動更新設定メモ | あぱーブログ
splapiはリバースプロキシにnginxを使っているので、webrootを使用しました。
nginx用のオプションもあるらしいのですが、指定するとnginx.confを書き換えるとかいうとんでもない仕様だったので自前で設定します。

nginxのほうですが、/.well-known/acme-challenge/は403を返すと認証がこけたので、404を返すように指定しました。

        location ^~ /.well-known/acme-challenge/ {
                root /var/www/acme;
        }

        location = /.well-known/acme-challenge/ {
                return 404;
        }

証明書の取得用に実行したコマンドは以下。

./certbot-auto certonly --webroot -w /var/www/acme -d splapi.retrorocket.biz

/.well-known/acme-challenge/配下に認証用のファイルを作って、 http://ドメイン名/.well-known/acme-challenge/hogehoge にアクセスし、認証が終わったらファイルを消す、という動作をします。
/etc/letsencrypt/live/配下にシンボリックリンクが作成されるので、あとはssl_certificateとかに作成された証明書のパスを設定するだけでOKです。
nginx再起動まで5分もかからずに終わったのでめちゃくちゃ爆速ですね。

ssllabsの判定はAでした。
結構きつめの設定にしてるのと、Let’s Encryptへの対応状況がよくわからないので使用しているライブラリによってはSSLでAPIが呼べないかもしれません。
少なくともChrome52でJavaScript実行した時にエラーが出ないので私はこれでいいです。

Bash on Ubuntu on WindowsでMojolicious::LiteとかNet::Twitter::Liteを動かす。

Windows 10 Anniversary Update(Windows 10 バージョン 1607)を適用したので、Bash on Ubuntu on Windowsを使ってみました。念には念を入れて、アップグレードツールを使わずにWindows Updateから適用できる段階でアップデートしたのですが、失敗してOSごと起動しなくなったりしました。相変わらずですね。
私の環境の場合、MacTypeとセキュリティソフトとタッチパッドのドライバが原因だったので、セーフモードで無理やり起動させて原因のアプリを停止させた後、ツールからアップデートしたらうまくいきました。
自分のマシンだとWindows Helloは予想通りサポートされなかったので、使いたかった機能がbashだけになりました。
OSビルドは14393.51です。

Tech TIPS:Windows 10のLinux/Ubuntu互換環境でbashを使う – @IT
ここを見ながらbashを使えるようにしてみました。ちなみに、私の環境だと、bashを使うときにコマンドプロンプトのオプションから「従来のコンソールを使う」のチェックボックスを外さないと動きませんでした。
Bash on ubuntu on Windowsが起動できません。 – マイクロソフト コミュニティ

sudoすると、「名前解決が出来ません」と言われてしまうので、/etc/hostsに「127.0.0.1 ホスト名」を追加しておきました。
ちなみにPerlはv5.18.2でした。メイン環境のさくらVPS/CentOS 7環境がv5.16.3なので、ubuntuのほうがバージョン上ですね。
ubuntuのバージョンは以下のとおり。

➜  ~ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.5 LTS"

ちなみにoh-my-zsh使ってみたのですが、(やっぱり)文字化けしちゃいました、

ホームディレクトリの実体は以下にありました。

C:\Users\ユーザ名\AppData\Local\lxss\home\ubuntuのユーザ名

cpanでモジュールを導入しようとした

最初はcpanでMojoliciousを入れようとしたのですが、「Warning: the following files are missing in your kit」みたいな感じで全然makeできないので、cpanは使えませんでした。cpanmならいけるかもしれないけどめんどくさいので試してません。

apt-getで導入する

ubuntuだとapt-getでperlのモジュールを導入できるので、sudo apt-getで導入してしまいました。

➜  ~ sudo apt-get install libmojolicious-perl
➜  ~ sudo apt-get install libnet-twitter-lite-perl

無事導入できました。

Mojolicious:Liteを動かしてみる

以下のスクリプトをhypnotoadで実行して、http://localhost:8181にアクセスしてみました。

#!/usr/bin/perl

use strict;
use warnings;
use utf8;

use Mojolicious::Lite;
app->config(
  hypnotoad => {
    listen => ['http://*:8181'],
    },
);

get '/' => sub {
  my $self = shift;
  return $self->render(json =>{test => "hello world"});
} => 'index';
app->start;

bashから動かすMojoLite

bashから動かすMojoLite


わーい動いた。

Net::Twitter::Liteを動かしてみる

以下のスクリプトを動かしてみました。

#!/usr/bin/perl

use strict;
use warnings;
use utf8;

use Net::Twitter::Lite::WithAPIv1_1;
use Encode;

my $nt = Net::Twitter::Lite::WithAPIv1_1->new(
consumer_key => $consumer_key,
consumer_secret => $consumer_key_secret,
access_token => $access_token,
access_token_secret => $access_token_secret,
ssl => 1
);

my $tl = $nt->user_timeline();

for my $status(@$tl){
    print encode_utf8($status->{text} ."\n");
}

コンソールから実行してみる

コンソールから実行してみる


わーい動いた。

試したけどできなかったこと

mongodb3は導入できませんでした。以下のStackOverflowの記事と同じ症状です。
Windows 10 Linux Subsystem. How to install MongoDB – Stack Overflow

感想

VirtualBoxでやれ。
ちなみにrm -rfしたらどうなるのかなーと思ったら、やっぱり試してる人がいて「あっ…」てなりました。
`rm -rf /` on Bash on Ubuntu on Windows – Qiita

自分のサイトを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

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