獲得目標は以下の通りです。
- 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が読み込まれないという状況も打破できます。
できてよかった!