ウェブコンテンツについては私の癖みたいなものがあって、
各FQDNに対し
- /etc/apache2/sites-enabled/<FQDN>.conf : httpの設定ファイル
- /etc/apache2/sites-enabled/<FQDN>-ssl.conf : httpsの設定ファイル
- /var/www/<FQDN>/ : ウェブコンテンツのルートディレクトリ
のような格好にしています。
旧VPSの設定ファイルについては古いものをベースにしているので
新VPSのデフォルト設定ファイルに差分編集する形とし、
コンテンツについてはそのまんま持ってくれば動くだろうと
考えていたのですが…甘かったorz
まずPHPのスクリプトが上手く動かないところがある。
これPHP新しくなりすぎて、
以前使っていたsplit()が使えなくなっていました。
これはexplode()に変えることで事なきを得ました。
が、ここからが大変。
ウェブコンテンツをMySQLのユーザ管理テーブルを基に
httpsのユーザ認証をコンテンツ側の".htaccess"でかけていたのですが、
これが全く動かない。
調べていると最近は以前とは違う方法をとる必要があるっぽい。
しょうがないので、まずは以下のコマンドで認証システムを入れます。
# apt install libaprutil1-dbd-mysql
# a2enmod dbd
# a2enmod authn_dbd
# systemctl restart apache2
そして"/etc/apache2/apache2.conf"の最後に
DBDPersist On
DBDMin 1
DBDMax 10
DBDriver mysql
DBDInitSQL "SET NAMES utf8"
DBDParams "host=localhost port=3306 dbname=<データベース名> user=<データベースにアクセスできるユーザ名> pass=<そのユーザ名のパスワード>"
を追加します。
これつまり1つのウェブサーバで複数のバーチャルホストを運用する場合も
認証に使えるデータベース名は共通にする必要があるということです。
それから"/var/www/<FQDN>/html/.htaccess"を廃止して、
それの中身を確認しつつ、
"/etc/apache2/sites-enabled/<FQDN>-ssl.conf"の最後の
</VirtualHost>
</IfModule>
の直前に
<Directory /var/www/<FQDN>/html>
AuthType Basic
AuthName "<コンテンツ名>"
AuthUserFile /dev/null
AuthBasicProvider dbd
AuthDBDUserPWQuery "SELECT password FROM users WHERE name = %s"
Require valid-user
</Directory>
を追加します。
これは先のデータベースに[users]テーブルを作成し、
その中に[name]フィールドと[password]フィールドを作って、
ユーザ名とパスワードの組のレコードを入れておけばいいです。
テーブル名やフィールド名は必要に応じて変更すればいいでしょう。
ただし[password]の値には注意が必要です。
# htpasswd -bns <ユーザ名> <パスワード>
を実行すると
<ユーザ名>:{SHA}<パスワードのハッシュ値のBase64エンコード文字列>
が表示するので、MySQLの該当データベースにログインして
mysql> update users set password='{SHA}<パスワードのハッシュ値のBase64エンコード文字列>' where name='<ユーザ名>';
などと実行してパスワードを設定しておく必要があります。
パスワードをウェブアプリ側で変更できるようにしているのなら、
頑張ってそのへんも変更しましょう。