S.F. Page

Programming,Music,etc...

Webサーバー(ServersMan VPS)をHTTP/2に対応させるためにCentOS5をCentOS7にアップグレード(クリーンインストール)し、ubuntuに移行した顛末

ホームページ管理用および勉強用に使っていて、若干放置気味のLinuxサーバーのOS(CentOS5)をアップグレードすることにした。

動機はサーバーをHTTP/2に対応させてみたかったから。私はnginxを使っているので、最新のものであればHTTP/2に対応している。ただ、HTTP/2はSSL通信必須である。つまり証明書が必要だ。私のような貧乏サラリーマンでも年間の証明書費用(RapidSSLだと1500円)を捻出できないことはないけど、できれば節約したい。

オレオレ証明書で試せばいいじゃないかと思うかもしれないが、一応永続的に使おうと思っているから、ブラウザで危険なサイト風に表示されるオレオレ証明書は避けておきたいのだ。HTTPよりは安全だと思うのだがね。。 しかしまあ、証明書を買う前にオレオレ証明書で動作確認してからでもよいではないかと思って、セットアップ方法をググっていたらLet's Encryptという無償の証明書を発見した。おお、これを使えば無償でHTTP/2が動かせるではないか。

Let's Encryptはセットアップツールも用意されているので簡単にできるのだが、CentOS5には対応していない。そのことを知らなくて試したら、確かにインストール途中でコケた。原因はCentOS5にデフォルトで入ってるpythonは2.4Xバージョンで、pythonで作られているLet's Encryptのletsencrypt-autoコマンドが動作しないのである。動かすには2.6以上のバージョンが必要だ。なので2.7あたりのバージョンをインストールしたのだが、そうすると今度はyumが動作しなくなってしまったのである。yumはpythonでできており、2.4バージョンでないと動作しないのであった。yumのソースの先頭をpythonの古いバージョンを指すように修正したら動作するようになったが、letsencrypt-autoコマンドは相変わらず動作しない。で、この不具合を調べてたら、CentOS6以上でないとサポートしないということを知ったのであった。このことはLet's Encrypt 総合ポータルを見ればすぐわかることなのだが、古いブログ記事を参考にしてしまい、さらにはその記事にはCentOS6以上でないとサポートしていないとは書いてなかったのだ。しかもツールもcertbotというものに変わっていた。CentOS5でも頑張り続ければ何とかなるんじゃないかとも思ったんだけど、後々を考えると意味のない作業かなと思ってあきらめることにした。しかしこのpythonのバージョン間の互換性のなさは何なのだろうか。言語的なポリシーなのだろうか。

で、CentOS5でのセットアップはあきらめ、OSをアップグレードすることにした。OSのアップグレードはインプレースでする方法とクリーンセットアップする方法がある。この際だからクリーンインストールしようと思った。私が使っているVPSはServers Man VPSで、クリーンインストールは比較的簡単にできる。といってもクラウドで用意されているインストールイメージ以外は使えないが。OSとしてはCentOS5/6/7・debian・ubuntuの中から選ぶことができる。迷わずCentOS7を選んだが、これがまたトラブルを引き起こすのである。

CentOS7への移行は簡単で、DTIが用意している管理画面で簡単に望むOSに初期化できる。そしてお決まりのセットアップを行う。お決まりのセットアップとは以下の作業である。

  1. rootのパスワード変更
  2. rootのリモートログインの禁止
  3. sudo可能ユーザーの作成
  4. sshのポート変更
  5. sshのパスワード認証の禁止
  6. sshを公開鍵認証に変更
  7. iptablesを設定し、不要なアクセスを禁止する。
  8. denyhostsのインストール
  9. yumによるパッチ適用

上記はセキュリティを担保するために必要な作業なので、必ず行うことにしている。踏み台にされたりするのはとても怖いからね。。 で、9.に差し掛かったところで、トラブルが発生。パッチ適用でコケてしまうのである。理由はSeversMan VPSではinitscriptsをアップデートすると、リモート接続(SSH接続)できなくなる不具合があり、そのためにinitscriptsをアップデートしないようにyumの対象から除外されている。そのためinitscriptsとモジュールを共有している他のプログラムをアップデートすると、共有モジュールがconflictしてしまい、アップデートできなくなるのである。回避策としては「--skip-broken」オプションをつけてアッデートすればよいとのことだが、それを行うとサポート対象外となってしまうのである。まあでも、サポート対象外でもいいかなと思って「--skip-broken」オプションをつけてやってみたけど、それでも途中でコケてしまった。これもlinux使いであれば回避できるようなことなのかもしれないけれども、私のような10年くらいlinuxを使っていてもビギナーレベルのままの私にとってはちょっときつい。なのでCentOS7はあきらめることにした。

そして、ubuntuに移行することにしたのだ。ubuntuだと余計なもの(サーバーに不要なGUI系の何か)が入っているのではないかと懸念したが、そんなことはなかった。とりあえずこれでセットアップを続けていくことにした。今のところお決まりのセットアップはすんなり終わった。続いてnginx,Let's encryptのセットアップをしようと思っている。