SSL+リバースプロキシの環境(Dockerで再現)でWordPressの管理画面にログインする

SSL+リバースプロキシの環境で、WordPressの管理画面にログインする方法です。

普通にログイン出来るのではと思いますが、ある事をしないと下記GIFアニメーション画像のようにログイン画面に戻され、特にエラー等も表示されずログインできません。

SSL+リバースプロキシの環境でWordPressを使用することはあまりないかと思います。

知っていれば簡単ですが、知らないとハマるかもしれないので参考になれば幸いです。

SSL+リバースプロキシの環境を再現

自PCのローカル環境で、Docker Composesteveltn/https-portalのイメージを使用してSSL+リバースプロキシの環境を再現してみます。

■Docker Composeとは
複数のコンテナを定義し実行するDockerアプリケーションのツールです。

■steveltn/https-portalとは
Nginx、Let’s Encrypt、Dockerを搭載した完全に自動化されたHTTPSサーバーです。
これを使用することで、HTTPSを介して既存のWebアプリケーションを実行できます。

Docker Compose用のファイル・ディレクトリ構成

Docker Compose用のファイル・ディレクトリ構成は下記で用意してみました。

画像だと見づらいかもしれないので、テキストで表すと下記の構成です。

各ファイルに関して、ファイルごとの内容を下記に記載します。

各ファイルの説明

■docker-compose.yml

Docker ComposeのYAMLファイルです。
取り敢えず環境再現ということで、シンプルな内容にしています。
なおdocker-composeについて詳しい説明は割愛します。

重要なのはhttps-portalがリバースプロキシとして動作している点です。

https-portalでポート80と443を使用し、localhostからhttp://web:80にリダイレクトしています。
web:80はサービス名がwebのコンテナですので、Apacheがポート80で待ち受けていますね。

https-portalのenvironmentのSTAGEには、local/staging/productionの3種類の値が指定できます。
それぞれ下記の証明書の利用になりますが、今回はローカル環境のためlocalの
自己署名証明書(オレオレ証明書)を使用します。

■services/apache/conf/httpd.conf

Apacheのconfファイルです。

重要なのはファイルの最下部にて、ファイル名が.phpで終わる場合(=PHPファイルの場合)、php:9000で起動しているFastCGI(=PHP-FPM)に処理を任せている点です。
つまりApacheでPHPが動作するようにしています。

php:9000のphpの部分は、docker-compose.ymlに記載のサービス名がphpのコンテナのことです。

■services/apache/conf/httpd-vhosts.conf

Apacheのバーチャル環境用のconfファイルです。
今回はlocalhostのみの為バーチャル環境である必要はありませんが、分かりやすいようにconfファイルを分けています。

SetEnv APP_ENV local は、今回特に深い理由はありません。

■services/php7.4/build/Dockerfile

PHPのコンテナ作成時に使用するDockerfileです。
PHPからMySQLに接続したり等、必要なエクステンションをインストールしています。

Docker Composeを起動

docker-compose.ymlファイルがあるディレクトリで、Dockerが起動している状態でターミナルより下記コマンドを実行します。

前述のDocker Composeのディレクトリ構成やファイル内容に問題がない場合は、正常に起動します。

ブラウザからアクセス

ブラウザからhttps://localhost/にアクセスすると、services/apache/data/の中身は空のため403エラーとなりますが、下記の画面が表示されていればSSL+リバースプロキシの環境が再現されています。

※steveltn/https-portalは、起動後の証明書作成に数分など時間がかかる場合があるため直ぐにブラウザアクセスしても表示されません。
その場合は数分ほど待ってからアクセスしてみてください。

WordPressの設置

データベース作成

前述のDocker Composeが起動していることが前提ですが、http://localhost:8888/にアクセスするとphpMyAdminにアクセスできます。
WordPressで使用するデータベースを作成しましょう。(phpMyAdminの使い方等は割愛します)

ユーザー名はroot、パスワードはdocker-compose.ymlに記載のpassword123でログインできます。

WordPressの設置

公式サイトからWordPressをダウンロードして、services/apache/data/に設置します。

設置後は、https://localhost/にアクセスしてWordPressの初期セットアップを完了させましょう。

WordPress側のリバースプロキシの対応

ここが本ブログの目的ですが、SSL+リバースプロキシの環境でWordPressの管理画面にログインできるようにするには、wp-config.phpの27〜31行目付近などに下記を追記します。

上記で追記したものは、WordPress公式のドキュメントでも説明されているものです。

管理画面での SSL 通信 | リバースプロキシの使用 | WordPress.org 日本語
https://ja.wordpress.org/support/article/administration-over-ssl/#%e3%83%aa%e3%83%90%e3%83%bc%e3%82%b9%e3%83%97%e3%83%ad%e3%82%ad%e3%82%b7%e3%81%ae%e4%bd%bf%e7%94%a8

SSL を提供するリバースプロキシにより WordPress がホストされ、自身は SSL なしでホストされる場合、このオプションを設定すると当初すべてのリクエストが無限リダイレクトループに陥ります。これを避けるには HTTP_X_FORWARDED_PROTO ヘッダーを認識するように WordPress を構成してください。ここでリバースプロキシは適切に構成されており、ヘッダーを設定するものとします。

ブラウザでWordPressのログイン画面を開いている場合は、上記追記後に画面をリロードしてログインを試みると、正常にログインできるはずです。

ブラウザでlocalhostにアクセスできない場合

Google Chromeでは、localhostにアクセスすると警告が表示されてアクセス出来ません。

アクセスできるようにするには、Chromeブラウザのアドレスバーに
chrome://flags/#allow-insecure-localhost
を入力及びアクセスして「Allow invalid certificates for resources loaded from localhost」Enableにするとlocalhostにアクセスできるようになります。

但し、2021年1月19〜20日にGoogle Chrome 88がリリースされましたが、バージョン87までは上記で回避できましたがバージョン88では回避できないようになっています。

どうやら不具合のようで、下記にチケットが切られています。

1159077 – Flag expired : allow-insecure-localhost – chromium
https://bugs.chromium.org/p/chromium/issues/detail?id=1159077

不具合が解消されるまではバージョン88は避けるか、またはFirefoxなど別のブラウザでlocalhostにアクセスしましょう。
(Firefox 84 for Macではlocalhostにアクセスできること確認できています)

2021年2月3日追記

2021年2月2日リリースのGoogle Chromeブラウザのバージョン88.0.4324.146で、「Allow invalid certificates for resources loaded from localhost」が表示されない不具合が解消されました。

不具合があったバージョンは88.0.4324.96でした。

chrome://flags/#allow-insecure-localhost
にアクセスすると「Allow invalid certificates for resources loaded from localhost」が表示されるようになっています。

不具合が解消されたバージョン88.0.4324.146にて、localhostでアクセスできることも確認できました。

最後に

知っていれば簡単なことですが、知らなかったとしてもSSL+リバースプロキシ環境で、WordPressログイン画面で冒頭のGIFアニメーションの動作が確認出来ればピンと来る方も多いと思います。

今回はApacheでの再現でしたが、Nginxの場合でも行うことは全く同じです。

(Dockerでの環境再現は蛇足部分ではありましたが、Dockerの記事を書いたことなかったので少し書きたくなり書きました)

 


【動確環境】

Mac:macOS Big Sur 11.1
Docker:20.10.2, build 2291f61
Docker Compose:1.27.4, build 40524192
WordPress:5.6(日本語版)
その他:docker-compose.yml参照

コメントを残す

メールアドレスが公開されることはありません。

ABOUTこの記事をかいた人

高原 徹也

大手通信キャリアを経て、大ヒットスマートフォンアプリ開発を手がける企業で多数の開発プロジェクトに携わった後、起業。 起業後も様々な開発プロジェクトに携わり、開発を通じて会社を大きく成長させ、今ではASP会社、メディア運用会社を子会社で持ち、シンガポール法人でWEBメディア会社を経営、M&Aを手がける起業家として活動中。