Pietサーバーの建立を手伝った話

私の入っているサークルKMC(京大マイコンクラブ)はエイプリルフール企画として「KMCはKPC(京大Pietクラブ)に改名しました」というものをやりました。
kmc.hatenablog.jp

その中でPietでサーバーを立てるというものがあり、それを手伝うことになったので、何をしたかを書いておこうと思います。
なお、最終的に立ち上がったPietサーバーはこちらです→ http://april-2016.kmc.gr.jp/ (本日限定)

前日まで

KMCでは毎年エイプリルフール企画をしていたようなのですが、今年の企画が形になったのは3日前のことだったらしいです。
私はKMC部員で在りながらPietがわからない(!)ので、「大変そうだなー」と思いながらPietを打つひとたちを眺めていました。
したことといえば、UTF-8の文字列しか吐けないPietで如何にPNGバイナリを返すかということについての相談に乗ったくらいです。コードは一行も書いていません。
(なお、結局それは無理と言うことでbase64エンコーディングしたPNG画像を返すことになりました。先程のアドレスにアクセスしてソースを表示してみるとその苦労の跡がわかるかと思います)


で、なんとか間に合って公開されたーというのを自宅からサークルのSlackで見て、お疲れ様、と思いつつ寝ようかとしていたのでした。

応召

が、Pietサーバーには問題がありました。
重いのです。
最初に公開したものでは繫がってからPNG画像を返すまでが約8秒とのこと。しかもそれは運が良かったときのみで、たいていは「502 Bad Gateway」を返すという状況でした。
で、
f:id:suzusime:20160401165124p:plain
ということで、「まじかー」とか呟きながら小雨降る今出川通りを自転車で駆け下りて部室に急行したのです。

補足をすると、駆逐艦というのは部室にある同じ型のPC群のことで、それぞれAbukuma、Inazuma、Ikazuchi、Hibiki、Akatsukiという名前が付いています。今回は(まともに使われていない)これらを動員してPietサーバーの負荷を分散させようという話でした。
で、それらのうちAbukumaとInazumaには私が「普通にUbuntuとかDebianだと面白くないし~」とかいってScientific Linux 7.1を入れていた訳です(他の駆逐艦にはUbuntuが入っていました)。はい、自業自得ですね。Scientific Linuxがよくわからんとかいわれたら行くしかない。

うーん、深夜0時に呼び出される学生サークルKMC、やばいですね!
深夜に呼び出されるとか良く聞くインフラエンジニア力が鍛えられます。

IP固定

まずやってほしいと言われたのがAbukumaのIP固定です。Inazumaのほうは前からサーバーとして動かしていたのでIPが固定されていたのですが、Abukumaのほうはサーバーとして動かすつもりがなかったのでそんなことはしていなかったのです。ならそんなOSを突っ込むなって話ですね。
というわけで、

# nmtui

で便利なTUIを使ってIPアドレスゲートウェイDNSサーバーを設定して、

# systemctl restart network.service

で再起動という作業を、(よくわかっていないまま勘で適当に設定して動かなかったので)何度か繰り返しました。ゲートウェイってなんだっけとかいってたので、最後はInazumaのほうの設定を見る始末。
それでちゃんと設定したはずなのに、何故か上手くいきません。ネットの接続テストに「阿武隈 - 艦これWiki」に繫がるかどうかを使っていたのですが、network.serviceを再起動した瞬間だけ繫がって、しかしすぐにまた切れる……
なんだこれと言っていたのですが、隣でAkatsukiにロードバランサを立てるべく頑張っていたwass80君がみて、IPが競合していることを見抜きました。意思疎通をミスって他のマシンと同じIPに固定していたのでした。一瞬で見抜けるのすごい。
それで無事IPが固定されました(すぐできると思っていたのに意外と長かった)。

Pietサーバーを立てる

全体の構成は次の通り。
まずAkatukiがfrontになって外からの要求を受け、nginxが良い感じにこれらを分散させてbackの三台(Abukuma、Inazuma、Hibiki)に立ったPietサーバーに転送します。
Akatukiのほうの設定はwass80君が頑張ってくれていたので、私の任務はbackのほうにPietサーバーを立てることでした。
が、wassがdockerのファイルを作ってくれていたので、dockerをインストールして

$ docker run --rm -p 80:18080 -it wass80/piet-server ./server.sh

とすれば一瞬でサーバーが立ちました。
これを3つのサーバーでやって、はい、おしまい!
Akatsukiの設定も終わったようなのでこれでできた! 帰れる!


……というわけにはいきませんでした。

謎のサイトにとばされる

ちゃんと立ったはずのPietサーバー、しかし、Akatsukiの80番ポートに繫ぐと何故か謎の海外サイトに飛ばされる…… ローカルIPへの転送設定しかしていないはずなのに…!
wassが頑張って調べていましたし、遠隔で強い人たちがみてくれていたのですが、よくわからず……

私は微妙に手持ちぶさたになっていたので、Abukumaのほうに代わりにfrontを立ててみようとしました。
……nginxがWebサーバーだということすら今日まで知らなかったのですがね。
www.saintsouth.net
この辺りの文書を適当に読んで適当に設定しました。
そしてlocalhostに繫いでみたら、なんかうまくサーバーが立っているようでした。

それで、AkatsukiではなくAbukumaのほうをfrontにするように方針転換し、遠隔で部内DNSの向きを変えてもらいました。

世界に公開したい

が、Akatsuki以外の部室のPCから、一回繫がったはずなのに、なぜかまた繫がらなくなります(前のキャッシュが残っていた説が有力)。
ここでファイアウォールがあることを思い出したので、

# firewall-cmd --permanent --zone=public --add-service=http
# firewall-cmd --reload

してみると、部室内からは http://april-2016.kmc.gr.jp/ に繫ぐと正しく画像が返ってくるようになりました。

しかしまだ、部室外からは502エラーしかみられませんでした。ただ、ふつうの502エラーではなくカスタマイズした502エラーページが表示されていたので、どうも部室までは辿れているらしい、とわかります。が、なぜそうなるのかが分からず。

しばし悩みましたが、遠隔でみてくださった先輩から情報が。
外から http://april-2016.kmc.gr.jp/ にアクセスしたときに先につながる、部室の別のサーバーのnginxの設定が、もとのAkatsukiに飛ばすようになったままだったのです。
部室内からアクセスするときは内部のDNSでAbukumaに飛ぶようになっていたので繫がっていました。
別サーバーのnginxから呼び出していることを完全に失念していた為のミスでした……

これで、めでたくPietサーバーは世界に再公開されることになりました。





この最後のツイートが、そのときのものです。約6時間、長い戦いでした。

結果として、Pietサーバーにアクセスすると、5秒以内くらいには画像が返ってくるようになりました。速い! 最高!!!
たかがWebサーバーに物理サーバー4台も要求するなんてPietはクソ。

まとめ


この一言に尽きる気がしました。

まあnginxは結構簡単にWebサーバーを立てられることが分かったので良かったです。好きでやっている分にはデスマも楽しい。あと林檎ジュースおいしかった。

世の中ではいろんな会社のひとが、もっと大変なことをやっていたんだろうなぁ……と思いつつ。