Chienomi

とあるLinuxerの訓話: 今そこにある問題を解決しても、理解したわけではない

Live With Linux::episode

これは将来に渡る教訓である。

知っての通り、私のLinux歴は2002年からとそれなりに長く、そしてその間Linuxには深く関わってきた。

また、サーバー歴としても、2000年に初めて自宅サーバーを立ててから、2002年にpublicサーバーを開設し(このときはFreeBSDだった)、どちらもここまで18年に渡る。

これなりに経験豊富だと言えるだろうし、「経験豊富だ」と言えるのは今になってではなく、それがたとえ6年前だったとしても12年の経験があるわけで、「経験豊富」といっても差し支えなかっただろう。

だが、6年前、2014年に構築したサーバーの甘さが故に、私はついにサーバーを落としてしまった。

事の次第

サーバーが落ちた原因はメモリ不足である。OOM Killerが発動する状況にあった。 長く、メモリが不足している(恒常的にswapに頼らざるを得ない)状況は続いていたし、ある程度予測はできた。 (実際は多くのpostmasterプロセスと、UID1000のRubyプロセスが多数走っていることから、引き金を引いたのはスパムメールが一度に送られて死んだのだと推定できる)

さて、それは運用に対して少ないリソースにしている(毎月お金かかるので…)ので仕方ない、と(仮に)する。 今回の話はそこではない。これは「決して落ちてはならないサーバー」ではないため、特殊な状況下で短時間停止することは許容しているのだ。

今のVPSの仕様は、2014年に立てたServerManのサーバーの設定を引き継いだもので、この際DeleGateをやめていくつかのサーバーソフトウェア(例えばNginx)に移行している。

このとき私はNginxの経験がなく、2016年からNginxについて検討した上で2年近くを費やして移行を決断したことになる。 だからある程度の知識はなかったが実戦経験がなかった。これまでDeleGateならそれなりにチューニングなども心得ていたが、DeleGateを使わなくなればその知識は有効ではない。 Nginxは獲得した知識を元に、手探りで構築した。

また、当初WordPressを使うサイトが残っていた(Chienomiもそう)ため、php-fpmを使う仕様だった(現在はWordPressのサイトがひとつも残っていないため、PHP自体が使われていない)。 これは実はちょっと前に問題になっている。ConoHa VPSのディスク容量は50GBだが、これが埋まってしまったのだ。 Pacman cacheを消すことである程度確保できたが、大きな容量をとっていたのはWordPressのデータであった。 このとき、PHPは使っていないことは直ちに判断できたが、「MySQLを必要とする他のソフトウェアが存在するかどうかがわからない」という状態になった。かなりの時間をかけて調査をし、残っていないと判断できたため現在はMySQL(mariaDB)そのものを削除している。

ConoHaに移行してからLet’s Encryptが導入された。2018年にはDiscourseを導入したが、DiscourseはDocker上で動作するため、Dockerを理解する必要があった。結局のところ、「十分に経験していないことを、必要とされるためにその場で学んで実戦投入する」という状況が常に発生していた。

もちろん、safetyである限り(つまり発生する問題がサービスダウン程度に留まる限り)それは勉強を兼ねていると考えれば重大なことではない。 しかし、別の問題がある。

サーバーが動作する以上私はサーバーを管理すべきであり、本来であればここまで大きく当初と仕様が代わっている以上(Postfixしか残っていないし、ディストリビューションもかわったし、Postfixは非互換変更のあった世代を越えている)むしろ新しいサーバーを立てるべきである。(ConoHa VPSは今サーバーを立てると少し安くなる上に、リソースも増える)

だが、そのどちらも簡単な話ではなくなっている。

理由は簡単。「その場で調べながら実施」した結果、「なぜそうして、結果どうなるのか」をきちんと理解していないために、「なにをしたのか」がちゃんと把握できていない状態に陥ったのだ。 (それでも、安全性だけは保てるように実施時点で入念にやっている) Let’s Encryptなどは不適切な設定(動きはする)があったので修正したりしているし、Nginxの設定も何度も修正が入っている。これらによって「問題のないもの」も存在する一方、「今見たら問題があると認識できるもの」が残っている可能性が高い。

特に発展的な、かなり調べなければわからないような設定は、その時調べて適用するということがどうしても発生する。 そして同様の条件のものが次の発生したときは、このとき適用したものをコピペしてパラメータだけ書き換えてしまう。 最初のときは曖昧ながらそれがどういうもので何の作業をしたか頭にあるが、二回目のときは全く理解していない。

そして、それらは新しいサーバーを立てるのであれば、修正するよりも、「当時の意図を理解した上で、今新たに書きなおす」ほうが早いし、正しい結果になるようなものだ。 中にはまだ理解していない、そのとき書いただけで終わっている要素もあるかもしれないが、この6年の間にも私は随分と修練を重ねてきた。当時は理解に至らないままただ「動くまでトライ」したものが、今は確信を持って書けるようになっているものは決して少なくないだろう。

元になるサーバーは2014年に立てた。Mimir Yokohamaを始められると決断するレベルになってから立てたものだ。 それでもこのようなことになる。

それは、この6年で私も随分と成長したということでもあるが、それ以上に教訓とすべきことは: 可能な限り、泥縄式で学ぶべきでなく、その場で動くことで事を成したと考えるべきではない。その達成によって残るものは負である。

今、「動かす」ことを達成するためにすることは、決して己の力となったから達成できたのではない。 なぜそれでいいのか、何をしたから動いたのか、ようやく考える下地ができたところで止めてしまっては、「わかったつもりになった自分」と「わかっていなかったけど動いたもの」が残ってしまうのだ。