獲得目標は以下の通りです。
- SSLの設定をしたNginxでリバースプロキシをさせて、バックエンドのApacheに渡す。
- WordPressも動くようにする。
ではさっそく。
Nginx(エンジンエックスと読むそうですね!):
http {
upstream MidgenasiaServers {
# バックエンドサーバーの設定をします。
server 10.0.0.80:8080; # 8080番ポートでhttp通信をListenしているIP 10.0.0.80上のApache
server 10.0.0.81:8080; # 8080番ポートでhttp通信をListenしているIP 10.0.0.81上のApache
}
upstream OtherServers {
# こちらもバックエンドサーバーの設定です。上と同じサーバーに格納されている想定です。
server 10.0.0.80:8081;
server 10.0.0.81:8081;
}
server {
# http通信はすべてhttpsに301リダイレクトします。
listen 80;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name www.midgen.asia;
charset utf-8;
# SSL
ssl_certificate path/to/server.crt;
ssl_certificate_key path/to/server.key;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
ssl_prefer_server_ciphers on;
# server.keyにパスフレーズを指定してある場合はたぶん必要。パスフレーズだけ書いておけばOK。
ssl_password_file path/to/server-password;
location / {
# upstreamの場所で指定した名称をここに書きます。
proxy_pass http://MidgenasiaServers;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
# 2つ目のドメインの設定も続けて書きます。
server {
server_name www.another.domain.com;
charset utf-8;
ssl_certificate path/to/another.domain.com.crt;
ssl_certificate_key path/to/another.domain.com.key;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
ssl_prefer_server_ciphers on;
ssl_password_file path/to/another.domain.com-password;
location / {
# 上記と同様に、upstreamの場所で指定した名称をここに書きます。
proxy_pass http://OtherServers;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
※要旨に関係がないコメントや設定は削除してあります。
Apache:
Listen 8080
Listen 8081
<VirtualHost 10.0.0.80:8080>
ServerName www.midgen.asia
DocumentRoot "/path/to/midgen.asia.htdocs"
</VirtualHost>
<VirtualHost 10.0.0.80:8081>
ServerName www.gowest-comewest.net
DocumentRoot "/path/to/another.domain.com.htdocs"
</VirtualHost>
ここまででNginx+SSLとラウンドロビンなApacheは完成。
あとは…Wordpress。リバースプロキシ+SSLという環境下では、特殊な記述をwp-config.phpに加える必要があるようです。
WordPress(wp-config.phpの上のほうに書きます):
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO'])
&& $_SERVER['HTTP_X_FORWARDED_PROTO'] === "https") {
$_SERVER['HTTPS'] = 'on';
}
define('FORCE_SSL_LOGIN', true);
define('FORCE_SSL_ADMIN', true);
参考: WordPressをhttps化してnginx reverse proxy配下で使うには
これでWordpressのCSSやJavaScriptが読み込まれないという状況も打破できます。
できてよかった!