サーバー移転。メモリ増強、ConoHaのKUSANAGI9イメージをAlmaLinux9に転換

■CentOS7のコミュニティサポート期限が切れる!

このブログをホストしているサーバーのOSはCentOS7でしたが、2024年6月30日でコミュニティサポート期限が終了することに6月に入って気付きました。基本新しいもの好きでPCやスマホのOSはリリース当日に即インストールすることが多いですが、サーバーOSやPHPなどのミドルウェアはなにかあった時の切り戻しが難しいしダウンタイムの発生は避けたいので保留しがち。しかしさすがにサポート切れのOSを使うワケにはいきません。以前ならCentOS7->8のアップグレードパスがあったようですが、CentOS8自体が終了してしまい多くのミラーサーバーからも消えてしまっている様子。実態として稼働しているのはWordPressのサイトが5つ程度といくつかのオリジナルPHPスクリプトによるサービスのみ。だったらひとつひとつ手作業で新サーバーに移設していく方が安全かなと思い、新規サーバーを建ててしまうことにしました。

■同じConoHaで1G->4Gプランに

今までメモリ1GBのVPSプランでしたがWordPress(KUSANAGI8)がモッサリで色々と高速化、最適化の工夫をしてみてもいまひとつでした。よくよく調べてみるとKUSANAGI for ConoHaは推奨メモリが4GBでした。契約当時からそうだっけ?というところではありますが、ともあれ「そりゃ遅いわけだ」と。下手をするとKUSANAGIの処理が上乗せされたことで、かえってバニラのWordPressより遅くなってた疑惑すら。一応いままで1GBで動いてはいたので、2GBにするか素直に推奨の4GBにするか悩みました。選定当時、梅雨トクキャンペーンというセールをやっていて、36ヶ月分一括払いした時の料金とスペックはこんな感じでした。

選定時点のセール価格(36ヶ月前払い時)

2GBと4GBで倍ほど違うのでさすがに迷います。ただまぁモッサリはイヤだなというのと、幸いサーバー利用者からカンパの申し出もあったので贅沢に(?)4GBプランとすることにしました。

ちなみにこの価格は新規サーバー構築時のみです。実は3年分払ってやっぱうまく移行できなかったわってなったら大変なので最初1ヶ月契約して後ほど延長しようと思ったんですが(以前のきっぷシステムならできたはず)、今の「まとめトク」システムのせいかこのキャンペーンがなのか不明ですがNGと後になって発覚。仕方ないのでセッティングが全て終わった一ヶ月契約サーバーのイメージ保存を行い、別途新規に3年契約サーバーをつくってイメージから復元する、という手順をとることに。IPアドレスが二回かわることになってしまいやや手間でした。まぁ実際になんかあったらもっと大変だったので、これで済むとわかってれば次回もそうするかも?やはりいきなり3年契約は勇気いりますよね。この辺、システム的になんとかしてほしいものです。

■AlmaLinux9 + KUSANAGI9で行こうとするもConoHaにイメージがない!?

CentOSはStreamへ移行

で、OSの選定です。RedHat Enterprise Linux(RHEL)の無料版クローンであるCentOSは終了というか、CentOS Streamというラインに移行されました。今までのCetOSはRHELと同じ構成、パッチリリースで安価で安定した業務グレードのディストリビューションでしたが、Streamは逆にRHELに取り込む前のカナリアリリース的な位置づけに変更。FedoraとRHELの中間みたいな感じっぽいです。まぁWordPress動かすくらいなら実害はないんじゃないかとも思いましたが、最新のCentOS Stream 9のサポート期限が2027年5月まで。あと3年です。心持ち短いなという印象。

CentOS代替OSとしてAlmaLinux

そこで模索したのがCentOS互換を謳うディストリビューション。こういうとこはオープンソースのありがたみ。いくつか候補があります。その中でもAlmaLinuxの最新9系がなんと2032年!たっぷり8年もあります。開発母体の継続性についても現時点で多くの企業スポンサーがついているようで今ある候補の中では安心感もあります。むしろ8年とかいったらこのブログが続いているか、WordPressで構築するという時代なのかといった辺りの方が懸念されるレベル。

更にWordPressの高速化ミドルウェアでもあるKUSANAGIも9でAlmaLinux9をベースOSとして採用しています。現行サーバーでもKUSANAGIを使用していて、そこまで恩恵を感じず、むしろ設定ファイルなどの構成が通常のCentOSと違って苦労の方が多かったイメージですが、推奨メモリ環境を満たせていなかったことも判明したので、今一度KUSANAGIを信じてみようと思っていたので、こりゃもうAlmaLinux9 + KUSANAGI9の99コンボでいいんじゃないかと。

だがConoHaにイメージがない!?

しかし着手時点でなんとConoHaのKUSANAGI9イメージはCentOS Stream9ベースのものしかないと判明。他のレンタルVPSサービスにはあるので、脱ConoHaするかCentOS Stream9で妥協するか逡巡しました。しかしAlmaLinuxがCentOSからAlmaLinux移行スクリプトを提供しているのを発見。

ざっくり言うと

  • dnf update(旧CentOSでいうyum updateにあたる)で最新パッケージ更新
  • curlで移行スクリプトをダウンロード
  • スクリプトを実行
  • ひたすら待つ
  • 再起動

だけ。OSとバージョンを調べるために

しても、きちんとCentOS Stream9からAlmaLinux9になっています。スゲー。なんかあったらクリーンインストールすりゃいいやってことでVPS構築直後に実行しましたが、今のところ特に問題はなさそうです。
正式な「AlmaLinux9 + KUSANAGI9」イメージから構築したのと同等の扱いではなく、あくまで「CentOS Stream9 + KUSANAGI9のOS部分を勝手にAlmaLinux9書き換えたもの」なのでサポートなどは受けられなくなる可能性はあるので自己責任で。まぁVPSのサポート範囲なんてそもそもハードウェア部分だと思っているので個人的にはいっかと思って敢行しました。

■その他設定メモ

KUSAANGI 7/8から9になって勝手がかわったのがドキュメントルートや設定ファイルのパスです。

WordPressをデプロイした時の実体ファイルは相変わらず/home/kusanagi/[プロファイル名]ですが、設定は/etc/httpd/ではなく、/etc/opt/kusanagi/httpdになりますし、Webサーバーのドキュメントルートは/var/opt/kusanagi/www/html/、ログは/var/opt/kusanagi/log/httpd/です。まぁ慣れた場所にシンボリックリンク張ればいいんですが。

あとハマったのは複数のWordPressサイトを所謂マルチサイト扱いにせず、かつサブドメインをわけないディレクトリ別の独立インストールするところでしょうか。KUSANAGI9では基本的にサブドメインを使ったサイト構成が行われます。

  • aaa.hoge.com
  • bbb.hoge.com
  • ccc.hoge.com

という感じ。しかし自分は従来の構成を踏襲するため、

  • hoge.com/aaa/
  • hoge.com/bbb/
  • hoge.com/ccc/

という形にしたかった。これは前回のKUSANAGI設定時にもハマったポイントで、基本的に

  • プロビジョン時にサブドメインによるLet’s Encrypt証明書発行をしない(–noemailオプション)
  • /etc/opt/kusanagi/httpd/conf.d/aaa.confなどを無効化する
  • /home/kusanagi/aaa/DocumentRoot/から/var/opt/kusanagi/www/html/aaaにシンボリックリンク

という形でできます。

プロビジョン(WordPressサイトの作成)の段階ではサブドメインを指定するしかなさそうなので、

のようにしました。これにより、Apache用のバーチャルドメイン設定がaaa.confに作成されてしまうので、それを取り消すために設定ファイル自体を無効化します。削除でもいいですが、.confというファイル名が読み込まれる要件なので、自分はその場でaaa.conf.disabledのようにリネームして置いてあります。

この無効化したファイル内には.htaccessの許可設定なども含まれるため、そこだけ自分で設定ファイルを書きます。これはWordPressのパーマリンク形式をカスタムにする時以外は不要かも知れません。今時は80番ポート(http://)は運用せず443番(https://〜)だけでいいかと思ったので、ssl.confに書くことにしました。真っ先に読み込んでデフォルトホストにしたかったので名前を_ssl.confに変更し、

のようにします。後半のRewrite関連部分はWordPressがDocumentRoot/.htaccessに書き出してくれますが、.htaccessによる設定上書きをするとセキュリティ的にもパフォーマンス的にもよろしくないので、あえて「AllowOverride」をNoneにして.htaccessの読み込みを無効にした上で、WordPressが書き出す.htaccessの内容を<ifModule mod_rewrite.c>ディレクティブに転記して使っています。気にしない人は「AllowOverride FileInfo」にしてWordPressが書く.htaccessまかせにしてもいいかも知れません。でないと将来的にWordPress側でパーマリンク形式を変更した時に手動で書き換えが発生する場合があります。

同様にこのブログのように、ユーザ名を使ったパス~furuta/にWordPressを設定する場合は、同じcon.d/下にあるuserdir.confを書き換えます。デフォルトでコメントアウトされていた

の部分を有効化し、Directoryディレクティブのパスは

とします。これでまたドキュメントルートフォルダからホームディレクトリのpublic_htmlにシンボリックを張ります。

まぁ今時ユーザディレクトリ(~hoge)にWordPress置く人もいないでしょうけどw。いないだけにどこにも情報がないと思うので、今後少ない誰かや自分の参考になればと書いておきます。

certbotによるLet’s Encrypt SSL証明書取得

通常KUSANAGIはサブドメイン毎にLet’s EncryptからSSL証明書を取得/設置してくれます。しかし今回のようなサブディレクトリ型インストールの場合、ホスト名は共通になるので、個別に取得しにいく意味がありません。またKUSANAGIが認知しているサブドメインは実在しないのでたぶん失敗します。ので、KUSANAGIの処理は無効化(先の–noemailオプション)しつつ、自分でcertbotコマンドによる取得を行い、_ssl.confにパスを書き、cronで定期更新処理を設定しました。

実際の手順はワイルドカード証明書を取得するかどうかやお使いのDNSプロバイダにもよると思います。今回はClaudFlareのDNSサービスでワイルドカード証明書を作成する想定で、超簡単にまとめると以下の感じでした。

最後のcron設定はcrontab -eするとviエディタが開いて編集状態になります。viの操作方法は別途調べてください。0 4 0 0 0は毎朝4時に実行するという意味です。Let’s Encryptは90日毎の失効し30日前から更新可能なので、二ヶ月おきとかでも良さそうですが、更新が必要かどうかはcertbot自身が判断してくれるので毎日実行しておけば万一更新サーバーが落ちていたりした時でもリトライしてくれるので安心とのことです(不要なタイミングならなにもせずに終了するだけ)。

■まとめ

空き時間を使って数日でなんとか新VPS/OSに移行することができました。1G/2コアから4G/4コアにアップグレードしたことで全体的なレスポンスも上がって快適になった気がします。

願わくはAlmaLinuxが無事2032年まで運営を継続してくれればと思います。それまでに自分が廃業したり、WordPressや個人ドメインでブログをホストするという時代ではなくなるかもですが、、


MonitでWebサーバー死活監視をする

数日前、CentOSサーバーをyum updateした辺りからWebサーバー(Apache)が日に数回に無反応になる現象がでました。プロセスは存在しているもの、ブラウザからアクセスしてもページが表示されず。telnet localhost 80はできるけど、リクエストに応答が返ってこない感じ。systemctl restart httpdすれば治るがまた数時間経つと再発する、という感じ。ログをみてもこれといった情報はつかめず。

そもそもこのサーバーはConoHaのKUSANAGIイメージから構築していて、Apacheの裏にphp7-fpmがいたりしてちょっと構成や設定ファイルの関係が理解しきれていないところがあり、数日粘ったもののお手上げ。

とりあえずsite24x7.comの無料プランで10分おきの死活チェックをしていてサイトが死んでいたらメールやアプリ通知でわかるようにしておき、気づきしだいsshしてhttpd再起動ということをしてましたが、さすがに面倒だし寝ている間に発生すると数時間落ちたままになり、同居している他サイトにも迷惑になるので、とりあえず自動再起動の仕組みを用意することにしました。

■Monitが最初から入ってた

ググったところMonitというオープンソースの死活監視ツールが手軽そうだと思い、インストールしようとしたらKUSANAGIイメージには最初から入っているようでした。/etc/monit.d/下にはKUSANAGIで作成したWordPressの数だけ設定ファイルがありました。しかし現時点で役に立っていないので一旦全部削除(正確には退避)。新規で設定しなおしてみました。

/etc/monitrc

メインの共通設定ファイル。これはとくにいじっていません。監視周期(デフォルト30秒)やログをどこに吐くかなどが指定できます。

/etc/monit.d/alert

メールの設定。/etc/monitrc上で/etc/monit.d/下のファイルをすべて読み込む指定になっているので、別にファイル名はこれでなくても構わないと思います。KUSANAGIイメージではこうなっていましたというだけ。

今回のホストではメールサーバーは運用していないのでgmailを使います。一番上が送信したいアドレス(gmailアドレスでなくてOK)。usernameとpasswordで自分のgmailアカウントを使って認証します。二段階認証を設定している場合、パスワードはアプリパスワードを作成して使います。というかこんなところにGoogleアカウントの本パスワードを書くのも不用心なので必ずそうしましょう。

fromのところはメールの差出人名。これはgmailの場合gmailアドレスに上書きされてしまうようです(ここで指定するアドレスを本人アドレスとしてgmail側に登録すればいけるかも?)

subjectが題名、message以下が本文で$がついたキーワードにその時の状況に応じた情報が入ります。2バイト文字を入れるとちゃんとUTF-8とかで文字化けせずに届くかは試してません。

/etc/monit.d/logging

これもKUSANAGIイメージに最初から入ってました。

とだけ書かれており、ログの保存先を指定しているだけ。

/etc/monit.d/httpd.conf

こちらをゼロから作りました。

 start programとstop programは文字通り、起動、終了に必要なコマンドです。

ポイントは

です。今回のウチの状況だとhttpdプロセスはいきていてtelnetまではできます。なので単にポートを監視するだけでは生きているように見えてしまうので、実際にURLを指定して応答があるところまでチェックしています。ホストは自身なので省略可能。ポートもたぶんなくてもいいかも。指定するページはどこでもいいんでしょうが、PHPスクリプトがあまり含まれていない軽いページが良いでしょう。Apache側でアクセスログが30秒に1回発生してしまうので、通常のコンテンツとしては閲覧されない隠しURLみたいなところだと除外指定がしやすいかも知れません。まぁ自分の場合は次節のようにUser-Agentで除外したので、とりあえずトップページ(/index.html)にしてあります。

その下は10回試してダメなら諦める(unmonitor)ということのようです。なにかもっと致命的な原因で落ちている時に無闇に無限試行しないためだと思われます。現状不都合がないので初期状態で。

monitコマンドの操作

CentOS7の場合、httpd同様、systemctlコマンドで起動や終了ができます。またmonit -tで設定ファイルの文法チェックができ、monit reloadで設定ファイルの再読み込みができます。

メール例

実際に再起動が行われた際にこんなメールが来ていました。

monitからのメール例

1通目で検知して復旧を知らせるまでに30秒ちょっとかかってますね。これは単に30秒間隔設定だからかな?実際には1通目の直後に復帰はしているのかも知れません。

Apacheのログからmonitを除外する

さて、上にも書きましたがリクエストを投げて死活監視をするとApacheのログがとんでもないことになってしまいます。

なので、/etc/httpd/httpd.confのログ設定に除外指定を追加します。log_config_moduleのIfModuleディレクティブの中の、SetEnvIFで画像ファイルを除外している辺りに追加しました。User-Agent(ブラウザ名)もSetEnvIFで指定できますが、それ専用にBrowserMatchというのがあったので使ってみました。実際のUAは「Monit/5.26.0」ですが、将来的にバージョンがかわる可能性もあるので正規表現で「Monit」だけマッチさせるのが望ましいですが、BrowserMatchは最初から部分一致で判定してくれるので第一引数に「Monit」と書くだけで済みます。

識別子にmonitとno_logをつけておきます。no_logがついていればメインのaccess.logからは除外されます。monitは専用ファイルでログを残す時などに使いますが現状はつけただけです。

■まとめ

Apacheが無反応になる根本原因を掴めていないまま泥縄式に対策をしてお恥ずかしい限りですが、とりあえず最低限Webサーバーの稼働は継続できるようになったようです。

送られてくるログをみると、もともとsite24x7(10分毎チェック)が知らせてくるのより頻繁に再起動が行われていることがわかります。つまり放置すれば自動復帰しているような小規模なロックがもっとたくさん起きてたっことでしょうか。やはりきちんと原因究明が必要なようですね…

ConohaVPSを新プランに移行しディスクを拡張する

ConohaでレンタルしているVPSが昨年新プランを追加しました。メモリ1Gのプランのディスク容量が50GBから100GBにアップし、料金はほぼ据え置きというか少し安い上、VPS割引き切符というプリペイドシステムで長期契約時の割引きが受けられるようになりました。とりあえずディスクが倍増するだけでも移行しない手はないのですが、今のVPSをイメージ保存して新プランのVPSに引き継いだ場合、ディスク(パーティション)拡張は自分でやる必要があること、IPアドレスが変わるなどがあり保留にしていました。が、ここにきてディスク残量が心許なくなってきたので、追加ディスクを契約するくらいならばと、新プラン移行を断行しました。

■移行自体は簡単

さすがVPSです。一定時間サーバーが停止していいなら超簡単。サーバーを停止し、イメージ保存。新サーバーを作成する時にそのイメージを読み込むだけです。CentOSベースのKUSANAGIイメージですが、IPアドレスやゲートウェイ、DNSなども新しいものに変更されていました。あとはドメインレコードを新IPアドレスに書き換えるだけです。

よりドメインレコード情報の反映を早めたいならば、数日前からTTLを1分とか短い値にしておくと良いでしょう。そのレコードの有効期間が短くなるので、世界中の端末やルーターに古いアドレスのレコードが残りにくくなります。その後で、新IPに変更し問題なければTTLを長いものに戻しておく、という流れです。

当たり前といえば当たり前なんですが、これだけの作業で新プランへの移行自体は完了。

せっかく新プランにするので VPS割引き切符を最大活用すべく3年分購入。しかし9/30までのキャンペーンで25%割引きと出ているのに、なぜかログインして買おうとすると10%にしかならないのが謎。そこで行ったり来たりしてるので一番時間食いましたw。結局諦めて10%で妥協。
旧サーバーシャットダウン後のイメージ作成がちゃんと測ってないけど10-15分くらいかかったかな?その後で切符を決済して新サーバーをイメージから生成するのはもう少し速かったような。クーポンのことを考えなければ30分くらいで移行できた気がします。

■ディスクを拡張する

さて、これでもらえるディスクは50GBから100GBに倍増しましたが、OSが認識しているパーティションは元のままなので、手動で追加しなければなりません。これは最初のサーバー作成時に選んだOSイメージによってパーティション構成が大きくことなるので、自分とドンピシャの構成の先行例が見つけられませんでした。そもそも追加ディスクを契約した場合はOSから別ドライブとして見えるはずなんですが、今回のパターンだとドライブ数は同じで空き領域が増えている、という感じなんでちょっと違います。2017年頃にCentOS7ベースのKUSANAGIイメージをから作成した(と記憶している)ウチのサーバーはLVM構成でした。fdiskで/dev/vdaをpした様子はこんな感じ。

これは新プラン移行後なので、赤字部分で容量が100GBになっていることがわかります。一方、LVM領域である/dev/vda2はBlocksをみると50GBのままです。つまり、104857600以降に追加された50GB分の空き領域ができているということです。LVMなので、この/dev/vda2上に作られる仮想ブロックPV(の一部)を使って、仮想パーティション/dev/mapper/centos_h16_rootが作られているわけです。dfするとこう見えています。

気持ち的には、/dev/vda2を拡張した上でPVを増やして/dev/mapper/centos_h16_rootに組み込んでやれるとスッキリですが、既存パーティションを迂闊にいじるのは恐いので、/dev/vda3を追加作成して、そこのPVを作ることにします。これならばサーバーを稼働したままでも大丈夫(なはず)。

物理パーティションを作成

再び、fdisk /dev/vdaして、n(=new)コマンドで作成します。ブロックはデフォルトの開始と終了値をリターンで選んでいけば最大容量になるはず。次にt(=type)コマンドで8eのLinux LVMをセット。もういちどp(preview?print?)でこんな感じになってればOK。

w(write)コマンドで書き込んで、rebootで反映されます。

追加したパーティション上にPVを作成

追加50GB領域に作成したパーティション/dev/vda3にPVを作成します。

pvcreateコマンドの前後でpvsをしてPVが増えていることが確認できました。

既存のVolumeGroup(VG)にPVを追加する

vgdisplayコマンドでVG名が「centos_h16」であることと、Free PE/Sizeがほぼ残っていないことを確認後、 「vgextend centos_h16 /dev/vda3」で先ほど作った/dev/vda3上のPVをVG「centos_h16」に追加します。

これでFree PE/Sizeが増えました。空きPEが12810個、容量で50.04GiB分が未アサイン状態ということです。

vgdisplayコマンドで現状を確認します。

物理ストレージとLVM仮想ストレージが多段化されていてとてもややこしいですが、

  • centos_h16という100GBのVolume Groupがあり、50GB(12799ブロック)のFree PEが残っている
  • centos_h16の中に、/dev/centos_h16/swapと/dev/cetnos_h16/rootという2つの論理ボリューム(LV)が存在する。今回拡張したいのは後者。
  • それはそうと/dev/vda2と/dev/vda3という2つの物理ボリューム(PV)がある。

ということがわかります。追加50GBで作ったのが/dev/vda3ですがすでにVG「centos_h16」に追加済みなので、物理レイヤーのことはもう忘れてOKです。残るは、VG内のフリーの50GBをLV「/dev/centos_h16/root」に割り当ててやり、同パーティションを領域一杯に広げてやるという2ステップです。

特定のLVに空きPEを割り当てる

Free PEをありったけ指定のLVにアサインするのはこんな感じ。

念のためもう一度vgdisplayしてみると、Free PEが0/0になっています。

パーティションを拡張する

いよいよ大詰め。/dev/centos_h16/rootのファイルシステムを確認します。XFSとext3/4では拡張に使うコマンドが違うからです。

XFSでした(ここの/dev/mapper/centos_h16-rootは/dev/centos_h16/rootと同じと考えてOKです)。なので、拡張にはxfs_growfsコマンドを使えばよさそう(ext3/4ならresizefsかな?)。-Dオプションでサイズを指定しない場合は可能な最大サイズを使い切ってくれます。

何分かかかるかと思いきや一瞬で終わりました。dfコマンドでみると使用率が79%だったのが38%に激減しています。特に指示は出てないですが気分的に再起動しておきました。

■まとめ

何年かぶりにLVMをいじってドキドキしましたが、まぁ最悪イメージが残っているので失敗したらVPSをもうひとつ作り直せばいいやってことで思い切ることができました。VPSはこういう時ほんと楽ですね。

とりあえず追加料金不要でストレージが倍になりました。それどころかプリペイドシステムの 「VPS割引き切符 」で安くなったくらいです。一挙に3年分前払いしてしまったので、このままあと3年はトラブルなく稼働してほしいものです。