ぬまろぐ

←戻る

wordpressをWEB/AP/DBサーバの3層構造で構築

2016/02/13

wordpressをWEB/AP/DBサーバの3層を構築したときのメモ。(raspberryPIを3台で構築)

構成は図のような感じで、webサーバにnginx、APサーバにphp-fpm、DBサーバにmySQLを構築しました。

img

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
...