リバースプロキシ先でWordpressを動かす
投稿日:
環境
Apache 2.2.34
サーバーA(www.sample.com)でメインサイトが動いていて、サーバーB(sub.sample.com)でWordpressが動いている時に
Apacheのリバースプロキシを使って以下のようにアクセスできるようにします。
メインサイト: https://www.sample.com/
Wordpress: https://www.sample.com/blog
なお、既に他のリバースプロキシも設定されており、極力そちらへの影響はないように設定します。
他ページ(サーバーC): https://www.sample.com/media
■サーバーAの設定
Apache設定
httpd.confなどに以下のようにリバースプロキシ設定をします。
他リバースプロキシに影響しないようにLocationで括ります。
<Location "/blog">
ProxyPass http://sub.sample.com/blog
ProxyPassReverse http://sub.sample.com/blog
ProxyPassReverseCookieDomain sub.sample.com www.sample.com
ProxyPassReverseCookiePath / /blog/
</Location>
これで/blog配下へのアクセスはサーバーB(sub.sample.com)に飛ばすようになります。
■サーバーBの設定
Apache設定
Apacheの設定はsub.sample.com
にアクセスがある想定で記載しておけば大丈夫です。
WordpressソースはDocumentRoot配下にblog
ディレクトリを作成して格納します。
SSL通信扱いにする
これでWordpressページ自体は表示されますが、必要なJS/CSS/画像などの外部ファイルのURLが非SSLとなってしまい
Chromeなどだとエラーとなってしまいます。
なので、.htaccess
に以下追記して強制的にSSL通信扱いになるようにします。
SetEnv HTTPS on
※補足
非SSLでhttp://sample.com/blog
にアクセスした場合はどうするのって話もありますが、
そもそも非SSLページは推奨されないので、今回は考えてません。
http://sample.com/blog
にアクセスが来たらhttps://sample.com/blog
にリダイレクトしましょう。
どうしても非SSLとSSLの両方で受けたければSSL接続時はリバースプロキシ時に「X-Forwarded-HTTPS: on」を設定するなど対策してください。
「外部→(HTTPS)→ELB→(HTTP)→サーバーA→(HTTP)→サーバーB」のような構成だと結構面倒です。
ホスト名を補正する
ここまでの対応だと$_SERVER['HTTP_HOST']
と$_SERVER['SERVER_NAME']
がsub.sample.com
のままになってしまいます。
ページ表示上は問題無さそうですが、管理画面でブラウザのconsoleに警告が出て気持ち悪いので修正しておきます。
wp-config.phpの先頭に以下の記載を付け加えておきます。
if (isset($_SERVER['HTTP_X_FORWARDED_HOST']) && $_SERVER['HTTP_X_FORWARDED_HOST'] === 'www.sample.com') {
$_SERVER['HTTP_HOST'] = 'www.sample.com';
$_SERVER['SERVER_NAME'] = 'www.sample.com';
}
これでwww.sample.comからリバースプロキシで飛ばされてきたアクセス時はホスト名が書き換わるようになりました。
(これはもっといい方法があるかもしれませんが、とりあえずこの方法でも対応できています。)