wordpressをWEB/AP/DBサーバの3層を構築したときのメモ。(raspberryPIを3台で構築)
構成は図のような感じで、webサーバにnginx、APサーバにphp-fpm、DBサーバにmySQLを構築しました。
nginxの設定で、phpへのアクセスのみAPサーバに振り分けてphp-fpmで処理をさせ、それ以外の画像やjsなどはWEBサーバから返すようにしました。
ただ1点問題があり、wordpressで画像をアップロードしたりするとPHPでの処理となるためAPサーバ側にコンテンツが追加されます。そのため、アップロードしたはずの画像が見れなくなります。
対処としては、WEBサーバにwordpressのコンテンツをのせずに全部のリクエストをAPサーバに流す方法がありますが、横流しのオーバーヘッドがもったいないため、APサーバにlsyncdを入れてAPサーバ側の更新をWEBサーバに同意するようにしました。
これで今のところ正常に動いています。
正直wordpressはWEB層とAP層を分離する様には設計されていないということを実感しました。
nginxの設定例
phpだけAPサーバに振り分けるよう設定します
server { ... location ~ /wordpress/\.php$ { fastcgi_pass AP_SERVER_IP:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } ... }
lsyncdの設定例
APサーバ側のlsyncdの設定例。SSHでrsyncする場合、lsyncdの2.0.7ではSSHのポートを変更するオプションが使えなかったのでWEBサーバ側にrsyncdを立てて同期しました。
例ではuploadsフォルダのみ対象としていますが、wordpress以下を対象にすれば全て同期できます。
settings = { statusFile = "/tmp/lsyncd.stat", statusInterval = 1, logfile = "/var/log/lsyncd.log", insist = 1 } sync{ default.rsync, source="/var/www/html/wordpress/wp-content/uploads/", target="WEB_SERVER_IP::wordpress/wp-content/uploads/", rsync = { archive = true, }, }
rsyncdの設定例
webサーバ側のrsyncdの設定例。SSHを使う場合はrsyncdは不要。
... [wordpress] path = /var/www/html/wordpress/ use chroot = false read only = false ...