nginx と wordpress と http と https

ややこしい設定と魔改造

nginx を フロントエンド、バックエンドの2つに分け(理由はある)、さらに、その後ろに php-fpm が構えているという構成の WordPress サイトをいくつか持っているが、折角なので、https も offer したい。ただ、設定を http と https のために複数書くのはあほらしいので、できるだけ統一したかった。以下のような工夫で、設定ファイルをできるだけコンパクトにしたま、複数サイトの提供ができる。

DNS ラウンドロビンのように、あるいは、フロント、バックエンド構成のようにして、負荷分散をすることがある。WordPress ではファイルのアップロードが特定のある1つのホストに行くようにしないと、同期が結構面倒である。公開用の画像データが更新されていくが、それは、アップロードされたある1つのホストにしかないファイルになるからだ。解決策として、S3 保存系のプラグインを使う方法がある。設定は面倒荘であるが、これは設定さえすれば、どのサイトからアクセスしても良い。それ以外に、rsync でファイルを共有する方法もあるが、これは「マスターとなるデータ」の固定が必須で、そのときは「一般用」と「管理用」のバックエンドを分けて、管理用だけで情報公開等を行う必要がある。

map $scheme $sites_admin_backend {
 default sites_admin_backend;
 http sites_admin_backend;
 https sites_admin_backend_https;
}
map $scheme $sites_backend {
 default sites_backend;
 http sites_backend;
 https sites_backend_https;
}

upstream sites_backend {
 server localhost:6580;
 server remotehost:6580;
}
upstream sites_backend_https {
 server localhost:6581;
 server remotehost:6581;
}
upstream sites_admin_backend {
 server adminhost:6580;
}
upstream sites_admin_backend_https {
 server adminhost:6581;
}

して、さらに

proxy_pass $scheme://$sites_local_backend;
proxy_pass $scheme://$sites_admin_backend;

として、バックエンドに投げればよい。バックエンドは

listen 6580 default_server;
listen 6581 default_server ssl http2;

として待っていれば、整合性は取れる。

misc

Posted by tako