このサイト(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でバージョン隠さない派です。

TwitterのアイコンをAPI経由でアップロードするツールに強制PNGモードを追加した。

TwitterのアイコンをAPI経由でアップロードするツール

ImageMagickとPerlMagickを入れるのがひたすらめんどくさいという理由だけで対応してなかったのですが、アイコンも丸くなるし強制JPGにされるしでうんざりしたので対応しました。
githubには後でpushしておきます。ソースはこんな感じで、左上の1pxの透明度を1から0.99に変更して元画像に極力影響ないようにPNG32に変換しています。

	#PNG変換モード
	if($self->session("png32")){
		my $img = Image::Magick->new;
		$img->Read($image_file);
		$img->Set(alpha => 'On');
		my @pixels = $img->GetPixel(x=>1,y=>1);
		$pixels[3]=0.99; #透明度を99%にする。
		$img->SetPixel(x=>1, y=>1, color=>\@pixels);
		binmode(STDOUT);
		$img->Write("PNG32:".$image_file);
		undef $img;
	}

やっぱりImageMagick便利ですね。クライアント側で変換させてもよかったのですが、upico使用ユーザ層のITリテラシー的にクライアントで変換させると余計トラブルになりそうなのでやめました。
みんなもうちょっと自分で調べるとかしてくれるといいんですが。

入れたImageMagickは7.0.6で、PerlMagickがうまいこと入らなかったので以下の記事を参考にしました。
ImageMagickインストール済みのとこからImage::Magick(PerlMagick)をコンパイル・インストールする方法 – Qiita
make perl-sources してなくてハマりました。

ブートループして起動しないnexus5xを電子レンジで直す。

expansysで2016/3/7に購入したnexus5xが2017/3/29にブートループで起動しなくなりました。
保証期間直後にぶっ壊れるなんていい度胸してますね。

症状

  • Googleのロゴがひたすらループする
  • ブートローダーは表示できる
  • リカバリモードには入れない
  • fastbootコマンドは使用できる
  • 使用OSは7.1.1

試したこと

  • 7.0.0 (N5D91L, Nov 2016)のファクトリーイメージを焼く
  • 6.0.1 (MTC20K)のファクトリーイメージを焼く

だめだったのでOSではなくハードがイカれてると判断。
ちなみに、修理の相場くらいは教えてもらえるかと思ってLGジャパンに電話したのですが、
本当にマジで神経逆撫でするようなことばかり言ってきたので、かなりイライラしました。
電話してきた人は全員怒らせるような指示でもされてるのでしょうか。

頭にきたのでもうぶっ壊しても良いやと思い、以下ブログの方法を試してみることにしました。
Nexus5X Android 7.0での再起動ループを直した(失敗) – とある地味なブログ
これ以降に書いてることは、ハードド素人が勘で試した最終手段なので、ぶっ壊してもいいと思った人だけが試してください。

ホットプレートがないのでドライヤーを使おうと思ったのですが「安定して同じ温度を供給できない」と言われたので、電子レンジのオーブンモードを使用します。
シャープ製の電子レンジです。200度が上限なので200度で試すことにしました。

電子レンジ

電子レンジで試したこと(1回目)

  1. Nexus 5X Motherboard Replacement – iFixit を見ながら分解。nexus5に比べて分解しやすすぎて感動しました。
  2. オーブンモードで200度で予熱した後、1分加熱する
  3. 常温に戻るまで放置
  4. 電源オン

やったー!!!起動したー!!!

起動した!

よっしゃ最新のファクトリーイメージ焼こう→ブートループ→やべえ6.0.1 (MTC20K)焼こう→ブートループ

焼きが足りなかったのかも…と判断し、再度電子レンジチャレンジを実施しました

電子レンジで試したこと(2回目)

  1. 200度で予熱した後、2分加熱する
  2. 常温に戻るまで放置
  3. 電源オン

やったー!!!起動したー!!!もう怖いからOSのアップデートはしない!!

起動した!!!

nexus5もブートループ頻発してるし、2chのnexus5xスレはブートループの怨嗟で溢れかえってるし、LG製品は今後遠慮したいですね…。なんでリコールしないんでしょうこれ…。
あと、リフローって単語で調べすぎてりくろーおじさんのチーズケーキが異様に食べたくなりました。宅配で頼もうかと思います。

とりあえず、参考にしたブログを書いた方の端末はGPUが死んだようなので予後を観察しようと思います。

追記(2017/4/16)

またブートループを起こすようになりました。焼いたらもとに戻る→2日くらいしたらまたブートループでもう駄目っぽいので諦めました。救出したいデータとかゲームのデータ移行しなきゃならないとかそういう時は一時的に復旧できるので使えるけど、完全再生は無理ですね。

追記(2017/06/17)

Twitterで調べたらこんなツイートが見つかりました。

アア、オワッタ・・・・・・・・!3万もするものが1年で壊れてしまって直せもしないのはさすがにあり得ないと思うので、今後LG製は遠慮したいです。

ちなみに、リフローは私の場合200度5分で3日持ったのが最高記録でした。もっと温度が高ければ直せるかもしれませんが、ジャンク品として流してしまったのでもうわかりません。
あとリフローするときはSIMカードトレイごとSIMカードを外すのを忘れないようにしましょう。SIMカードトレイ入れっぱなしで電子レンジにインしてカードを溶かしました。(ヤスリで削って無理やり剥がして事なきを得ました)

???「えー、ということで!ですね、本日はふっ飛ばしたDBの復旧をやっていきたいと思います!」

GitLab.com Database Incident – 2017/01/31
読んでて胃が痛くなりましたが、詳細をここまで公開した上で復旧作業ライブストリーミングで配信するとかぶっ飛びすぎててすごいです。
今見てるんですがめっちゃ面白いしコメント欄一体感で溢れてるし悲壮感ないのでエンジニアじゃない方も是非見てほしい!

重大なミスをした時どうすればいいか学びを得られた気がします。問題が起こらないのが一番だけど、何か問題を起こした時にどう対応するかが大切なんですよね。
私はコードホスティングにgithubを使っていますが、たとえgitlab使ってたとしてもきっと笑いながらこの配信見てたと思います。

* Who did it, will they be fired?
Someone made a mistake, they won’t be fired.

このブログのSSL設定とかの話。

前Cipher Suitesの話をしたのでこのブログのSSL設定を紹介します。Webサーバはnginxです。
試験的にtag.retrorocket.bizにだけh2oを使ってるのですが、なかなかいい感じなのでそのうち乗り換えるかもしれません。
サブドメインで運用しているサービスは一部設定が足りてなかったりしてSSL LabsでA+じゃなかったりするのですが、AかA-なので及第点と思っています。retrorocket.bizはA+です。
SSL Server Test (Powered by Qualys SSL Labs)
http/2には対応済みです。

設定の一部

ssl_dhparam /etc/nginx/ssl/dhparam.pem;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
ssl_prefer_server_ciphers on;

add_header Strict-Transport-Security max-age=15768000;

ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/nginx/ssl/ca-certs.crt;

resolver 8.8.8.8 8.8.4.4 valid=300s;

設定の根拠

基本的に「瀕死のリテラシー メカニカルに殺す」「世の中のいけてるところが推奨しているものは信頼できるもの」、という考えなので、MozillaWikiのIntermediate compatibilityの設定を使用しています。
Security/Server Side TLS – MozillaWiki
Modernの設定に寄せたいので、TLS1.0は切っていいかなと思ってアクセスログを見たのですが、利用者にAndroid4系の人がめちゃくちゃ多いので諦めました。
openssl 1.1.0以上を使用しているとCHACHA20-POLY1305が使用できます。
新しいTLSの暗号方式ChaCha20-Poly1305 – ぼちぼち日記

参考にしたサイト等

自分で理解しないまま設定するのは絶対避けたいので、以下のサイトを参考にしています。
理解してるつもりの SSL/TLS でも、もっと理解したら面白かった話 · けんごのお屋敷
httpsだからというだけで安全?調べたら怖くなってきたSSLの話!? – Qiita
我々はどのようにして安全なHTTPS通信を提供すれば良いか – Qiita
OCSP StaplingはMozillaWiki見るまで知らなかったので勉強になりました。

Start SSLの証明書で運用しているサービスはそろそろ証明書更新の時期なので、Let’s Encryptに乗り換えようと思っています。