マストドン+WordPress+静的ページにしないと
マストドン建ったけど、将来的にレンタルサーバーからVPSに統合するのであればWordPressも同居出来るようにしたい。基本はnginxをリバースプロキシとして使ってApacheで動かすWordPressに繋げばいいのだろうが以外と引っかかる。
httpdのインストール
WordPressをnginxで動かすことも考えたが結構、面倒そうなのでhttpd(所謂Apache)で動かすことに。
dnf module install httpd
既にnginxが動いているので/etc/httpd/conf/httpd.confのポート80と/etc/httpd/conf.d/ssl.confのポート443を適当な値に変更しないと起動できない。
それから<Directory / var / www / html>のAllowOverrideをNoneからAllへ変更。これをやらないとパーマリンク設定で基本以外にしたときに404が発生する。AllowOverrideの記述は何カ所かにあるが最下層となる/ var / www / htmlに対して設定が優先される。
phpのインストール
phpは7.4をインストールする。
dnf module install php:remi-7.4
これだけでは足りないので
dnf install php-devel php-mysqlnd php-pdo php-gd
MariaDBのインストールする
dnf module install mariadb
perlも一部使うみたい。サイトでもどうせ使うだろうからperlもインストールしておく。
dnf module install perl
DBの作成
mysql -u root -p
create database データベース名 collate utf8mb4_general_ci;
exit
WordPressのインストール
cd /var/www/html
wget https://ja.wordpress.org/latest-ja.tar.gz
tar xvzf latest-ja.tar.gz
rm latest-ja.tar.gz
chown -vR Apacheユーザー:作業用ユーザー wordpress
vはなくてもいいけど先日、痛い目を見たからw
nginxのプロキシ設定
/etc/nginx/conf.d/適当な名前.conf
を作成。最近は元のconfを弄るのではなくconfファイルを追加していくのが主流な感じ。中身は
server {
server_name WordPress用のドメイン;
location / {
proxy_pass http://localhost:8080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Host $http_host;
}
}
保存したらsystemctl restart nginx
http://WordPress用のドメイン
でセットアップ開始。
後述のようなリダイレクト問題もなく動作した。ただし以下の問題がある。
- SSL非対応。これは設定していないから。nginx+ApacheでSSL化する場合の設定をもう少し調べる。同一サーバー内だからSSL化が必要なのはnginx側だけかな?
- URLがWordPressドメイン/ディレクトリになる。WordPressの設定で変更ディレクトリを取ると見つけられなくなる。とは言えサーバーのドメインではなくWordPress用のドメインで始まるからいいか。
- タイトルに日本語を使用すると見つからなくなる。これはURLが日本語になるためでサーバーの設定が日本語対応していないからか?
- WordPressのヘルスチェックで「一つ以上の推奨モジュールが存在しません」と言われimagickとzipがないと。以下のコマンドで対応。
dnf install php-pecl-imagick
dnf install php-pecl-zip
あと、httpd側のログ、そのままだとアクセス元のIPアドレスが127.0.0.1になってしまうので/etc/httpd/conf/httpd.confのログフォーマットで%hを%{X-Real-IP}iに変更。
WordPressのSSL化
まずは証明書の取得。
dnf install certbot python3-certbot-apache
certbot --apache -d WordPressのドメイン
とやったらエラーになった。ポート80で受け付けていないとダメらしい。Apacheでポート80は受け付けていないし。が、よく考えるとSSL化が必要なのはnginxとクライアント側なのでnginx用の証明書を作成すればいいのか?
ということで
certbot --nginx -d WordPressのドメイン
をやったら正常に終了し/etc/nginx/conf.d/proxy.confを自動で書き換えてくれた。いや、そこは自動でやられると後でわからなくなるのですが…
アクセスしてみるとApacheの初期画面!しかし証明書は通っているしApacheまで到達している。逆にhttpだと表示が崩れる。表示が崩れるのはcss等が読めていないからか?
WordPressのSSL化完了?
urlのディレクトリが入るがトップ画面はドメインのみでいけるからまあいいだろう。以下、設定内容。←これ、トップ画面もドメインのみではいけなかった。いけたように見えたのはブラウザキャッシュのせい。設定の一般でWordPressアドレスとサイトアドレスをhttpsに変更。管理画面がリダイレクトループするので
wp-config.php:$_SERVER['HTTPS'] = 'on';
を記載。これにより出力されるurlがhttpsになる。最近のブラウザはhttpsサイトにhttpが混ざるとブロックしてしまうのでこの指定が必要。以前であればhttpで作成させてnginxでリダイレクトという手が使えたかもしれないが今は無理そう。ドメインのみでアクセスさせる場合はurlからディレクトリを取り除きバーチャルホストのDocumentRootでディレクトリを指定する。
nginxのプロキシ用conf:80ポートはhttpsにリダイレクト。
server {
return 301 https:$host$request_uri;
server_name wordpress.bmw-and-more.info;
listen 80;
}
server {
server_name ワードプレス用ドメイン;
ssl on;
location / {
proxy_pass http://localhost:8080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwardded-Proto https;
proxy_redirect off;
}
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
Apacheのバーチャルホスト用conf
<VirtualHost *:8080>
ServerName wordpress.bmw-and-more.info
DocumentRoot /var/www/html/ワードプレスディレクトリ
</VirtualHost>
Apacheのssl.conf:使わないはずだけど一応<VirtualHost _default_:60443>に
なお設定途中でどうにもならなくなった場合は一度http接続に戻す。設定画面が開けずWordPressアドレスを変更出来ない場合は以下を参照。
WordPressが表示されなくなった場合の対処法 ~アドレス変更編~ | MaryCore
php-fpmの設定
ワードプレスは動くようになったがレスポンスがあまりよくない。どうもphp-fpmが重くなる感じ。と言う事でphp-fpmの設定。
/etc/php-fpm.d/www.confで
pm = static
pm.max_children = 2
pm.max_requests = 100
正直、合っているかは不明。もっともパフォーマンスチューニングなんて状況を見ながらだから。
あ、あとnginxのプロキシ用confでgzipは設定した。
以下、作業前に書いていた事
WordPressのリダイレクト問題
プロキシを経由するためApacheから見るとIPアドレスがプロキシのアドレス(すなわち自分のサーバーのアドレス)になってしまいどこからのアクセスかわからなくなる。まあ、わかったところでどうなるものでもないのだが。これに関してはnginx側でproxy_set_header X-Forwarded-Host を設定すれば元のアドレスをApacheに伝えられるらしい。ここで問題なのは設定値として$hostと説明しているサイトと$http_hostと説明しているサイトがある。実際に試してみると$http_hostならWordPressは動作するが$hostだとリダイレクトループをしてしまう。では$http_hostを使えばいいではないかという事になるが$http_hostはヘッダ・インジェクションという攻撃を受けるという脆弱性があるらしい。これに対しての公式の回答は$hostを使えということのようである。ちなみにWordPress以外のページであれば$hostでも問題なさそう。リダイレクトの制御の問題らしい。いっそのことnginxでWordPressを動かすか?
答えは公式サイトにあった
解決策を探したところ結局答えは公式サイトにあった。
FAQ/インストール | WordPress.org 日本語
wp-config.phpで$_SERVER['HTTP_HOST']を上書きしろということ。ただ$_SERVER['HTTP_X_FORWARDED_HOST']って結局、プロキシのアドレスだし自分のサーバーないならIPがわかっているから直打ちでもいいでは?更に、$_SERVER['HTTP_HOST']にIP:ポートで適当なIPでも動いてしまう。ポート番号を削ると動かなくなる。まあ、そもそもHTTP_X_FORWARDED_HOSTになにをセットするのが正しいのかと。大抵は$http_hostをセットしているのだが。VMじゃなくてVPSで確認しないとわからないかな。
PHPのバージョン問題
また、今回VMにWordPressを入れてヘルスチェックで指摘されたのがPHPのバージョンが古いということ。確かに確認してみると7.2で最新の7.4ではない。CentOSでは企業利用を想定しているのか枯れたバージョンのものが入るようである。
dnf moduleとは
そこでPHP7.4を入れようと思ったのだが検索すると大抵、dnf module install php:remi-7.4と記載されている。module?マストドンを入れる際にちらっと見かけたが無視していた。moduleって単体のインストール?と思ったが逆で普通にdnf installだとそこで指定された「パッケージ」だけ(+依存性のあるもの)がインストールされる。dnf module installだとある程度のパッケージのセットがインストールされる。また、その後の管理もmodule単位となる模様。なのでまずはmoduleでインストールを試みてmoduleがなければ個別にパッケージ指定でインストールするというのが今後の流れか?moduleに関しては以下のサイトが参考になった。
RHEL 8/Fedora 28で導入されたModularity - 赤帽エンジニアブログ
dnf コマンドでパッケージとモジュールを混在させてみて、両者の挙動について迫った。 - Qiita