Webサーバーのシステム入れ替え

  • 投稿日:
  • by
  • カテゴリ:
  • ハッシュタグ:

この一週間、blogのシステム(MovableType)が不調でした。
タグをクリックしたときなどにエラー表示が出たと思います。 ご迷惑をお掛けしました。
(※追記1 なんて書いてますが、まだタグをクリックすると別のエラーが出るようです)
(※追記2 パッチ当てたら直りました)

発端は例によって portsupgradeでアプリケーションを更新したときに、p5-DBD-mysqlの関係で MySQLが5.7から5.6にバージョンダウンされてしまったことだった。
MySQL 5.7に入れ直したのだが、どうしてもCGIからMTに接続できなくなってしまった(500 Internal Server Errorになる)。

いろいろやってみたがダメで、これを機会にシステムを構築し直すことにした。
これまでのシステムはi386アーキテクチャーだった。 これはWebサーバーのマザーボードが64bit非対応のDN2800MTだったことの名残だ。
2年前にN3150DC-ITXに交換して64bit対応になったものの、動いているシステムを弄るのは躊躇した。
FreeBSDを10.0R11.1Rにバージョンアップしたときも、再インストールせずにi386のままfreebsd-upgradeで行った。

これまでシステム更新をするときは、新しいSSDを用意して古いのは念のために温存したのだが、今回は今のSSDを消去してインストールする。

まずはバックアップ。
webminからMTのデータベース(mt_db)を開いて「データベースをバックアップ」を実行。 適当なファイル名は(mt_db_backup.sql)を付けて/var/db/mysqlに保管。

/boot
/etc
/var/db/mysql(MySQLのデータが入っている)
/usr/local/etc
/usr/local/www(Webサーバーのコンテンツが入っている)

をftpでWindows PCにダウンロードする。

FreeBSD-11.1-RELEASE-amd64-dvd1.isoをダウンロードしてDVDに焼き、WebサーバーのSSDにインストール。
続いてApache2.4をインストール。 コンフィグ画面で、デフォルトのMPMがなぜかPREFORKになっているので、EVENTを選択する。
同じくコンフィグでHTTP/2のオプションを有効にしたのだが、mod_h2は自動で入れてくれないようで、後から手動で入れた。

mysql5.7-serverを導入。 ここでコンフィグ画面を弄ったのが失敗だったようだ。
p5-DBD-mysqlなどMTに必要なもろもろを導入。
おおよそ環境が整ったところで、バックアップしたファイルを戻す。

パーミッションの関係で、Let'sEncryptのpemファイルがバックアップできていなかった。
もともと有効期限があと1ヶ月しかなかったので、そろそろ再取得の時期だし問題はない。

certbot certonly --standalone  -w /usr/local/www/data -d blog.still-laughin.com -m ichiro.hamasato@gmail.com
certbot certonly --standalone  -w /usr/local/www/data -d www.still-laughin.com -m ichiro.hamasato@gmail.com

だが設定ファイルは変えていないのにエラーでApache起動せず。 確認してみると、/usr/local/etc/letsencrypt/liveの下のディレクトリ名が blog.still-laughin.com-0001 になっていた。
デレクトリ名から「-0001」を削除してApacheは起動できた。

データベースをリストアするためにwebmin導入する。 
SSL有効化したらChromeからアクセスできず。 IE11からアクセスして「Webmin設定」の「SSL暗号化」で
プライベート鍵ファイルにLet'sEncryptで生成したprivkey.pemを指定。 証明書ファイルに「別のファイル」を選択してcert.pemを指定。 これでChromeからアクセスできるようになった。

WebminのApacheモジュールの設定で、パスをapache24に変更。
MySQLの設定ファイルのパスを/usr/local/etc/mysql/my.cnfに変更

ところがMySQLが起動せず。 どうやらportsからインストールするときに、コンフィグ画面で余計な設定をしてしまったようだ。
mysqlを make deinstall して my.cnfもmvで名前を変える。 make clean して make rmconfigしてからの再make installする。

MySQLが起動するようになったものの、今度はWebminからMySQLにログインできず。 rootのパスワードが分からない。

MySQL5.7 | FreeBSDのメモ帳

v5.6以前とv5.7ではパスワードの扱いが全く違ってくる。デフォルトでは半角の英大文字・英小文字・特殊文字を最低でも1つ以上使い8文字以上で設定する。また、v5.7では初めからパスワードが設定されているので、今までのようなパスワード無しでログインするような事は出来ません。初期のパスワードはMySQL起動後に『~/.mysql_secret』の中に記載されます。

このページにあるmysql_secure_installationで新しいrootパスワードを設定して、無事にwebminからアクセスできた。

InnoDBにはうんざりさせられているので、ストレージエンジンをMyISAMに変更する。
my.cnfに

[mysqld]
skip-character-set-client-handshake
default-storage-engine = MyISAM
default-tmp-storage-engine = MyISAM
 
[mysqldump]
max_allowed_packet              = 256M

などを設定。 「default-character-set = utf8」を設定すると mysql -Vでワーニングが出るのでやめた。

Webminから新規データベース「mt_db」を追加。 エンジンは MyISAM、キャラクターセットはUTF-8
webminでmt_dbを開いて「SQLを実行」をクリック。 「Run SQL from file」タブで「mt_db_backup.sql」を指定して実行する。

ようやくDBも復旧して、あとはMTを動かすのみ。
MTのCGIファイルに実行属性を与えるが、500エラーになる。 また振り出しに?
MT-6.3.5にアップデートしてみたが症状は変わらず(当然だが)。
/var/log/httpd-error.logを見ると、

[Sun Oct 15 10:22:14.580021 2017] [cgid:error] [pid 25473:tid 34397577216] (2)No such file or directory: AH01241: exec of '/usr/local/www/cgi-bin/MT6/mt.cgi' failed
[Sun Oct 15 10:22:14.580581 2017] [cgid:error] [pid 25387:tid 34397596416] [client 192.168.1.66:55371] End of script output before headers: mt.cgi

「End of script output before headers」をググると、CGIファイルの改行コードがWindows仕様(CRLF)になっているとかいうページが多数ヒットする。 確認したがLFのままなので関係ない。
試しにMTが入っているディレクトリにテスト用CGIファイルを置いて実行したらちゃんと動いた。 でもそのテスト用CGIファイルはシェルスクリプトだった(最初の行が#!/bin/sh)
MTのCGIはPerlで書かれているので、最初の行が「#!/usr/bin/perl -w」
「ん?」と思って

root@www:/usr/local/etc/mysql # whereis perl
perl: /usr/bin/perl /usr/local/lib/perl5/5.24/perl/man/man1/perl.1.gz

perlのパスが違う。

FreeBSD /usr/local/bin/perl /usr/bin/perl - PukiWiki

いまさらの話だが、FreeBSD 8.* のころは動いていたCGIスクリプトが、9.*以降で 500errorになるという話。

そういえば前にそんな話があったなぁ。

ln -s /usr/local/bin/perl /usr/bin/

これでようやくMTの管理画面を開くことができた。
今週末は土日天気が悪くてキャンプに行けなかったのだが、懸案事項が片付いてよかった。