こんにちは、インフラチームテックリードの櫻井です。
今回は1台のサーバーで複数のステージング環境を同時に使用できるように設定を変更したので、その方法について紹介したいと思います。
背景
PR TIMESでは現在開発チームとは別にQAチームが存在し、開発チームの実装したコードが正しいことをステージング環境で検証しています。
しかし今まではステージング環境のサーバーが1台しかなく、誰かがステージング環境を使用している間、他の人は別のブランチをデプロイすることができないという問題がありました。
この状況ではQAチームの人員を増やしたところで検証作業のスピードを上げることができず、QAが開発フローの中でボトルネックになることは避けられない状況でした。
この状況を打破するため、複数のステージング環境を同時に使うことができるようにする必要がありました。
Apache設定の変更
今回サーバー1台で複数のステージング環境を実現するにあたり、ApacheのVirtualDocumentRootを利用しました。
VirtualDocumentRoot は通常の DocumentRoot と異なり、パス内にリクエストされたドメイン名を使用することができます。
例えば
VirtualDocumentRoot "/var/www/%0/public"
と設定してexample.jp
でアクセスした場合、ドキュメントルートは/var/www/example.jp/public
になります。
これに加えてステージング環境用にあるワイルドカードのAレコードを作成し、全て同じサーバーのIPアドレスを返すようにDNS設定を変更することで、サブドメインにアクセスしたとき同じサーバーの異なるディレクトリにアクセスすることができるようになります。
VirtualDocumentRootの使い方に関してはこちらを参考にさせていただきました。

https://httpd.apache.org/docs/2.4/mod/mod_vhost_alias.html#virtualdocumentroot
デプロイスクリプトの変更
VirtualDocumentRootを使って複数のステージング環境を実現する準備はできたので、あとはデプロイ時にサブドメインとして使用する文字列を指定して、デプロイ先のディレクトリを切り替えられるようにします。
例えば
deploy -d hoge
とした場合には/var/www/hoge.example.jp/public
にデプロイされ
deploy -d fuga
とした場合には/var/www/fuga.example.jp/public
にデプロイされるような感じです。
また今回はデプロイ後すぐに必要なデータが揃っている状態にしたかったため、データベースは分けずに共通のデータベースを使用しました。
またデータベース内にプレスリリースの画像ファイル名が含まれているので、デプロイ時に画像ディレクトリにシンボリックリンクを作成して共通の画像ファイルを参照するようにしました。
デプロイ先の切り替えができれば、先程のApacheの設定の変更と合わせて1台のサーバーで複数のステージング環境が使えるようになります。
発生した問題
今回の対応で気づいた問題点もあります。
OAuthログイン時のリダイレクトURL
まず1つ目はOAuthログイン時のリダイレクトURLです。
OAuthログインではOAuthプロバイダー(例えばFacebookログインの場合はwww.facebook.com)でログインを行った後、指定されたURLにリダイレクトされます。
このとき指定するURLには基本的にワイルドカードを使用することができません。
そのため今回の複数ステージングでOAuthログインを行う場合は、各自がデプロイ時に指定したサブドメインのリダイレクトURLをOAuthプロバイダーに登録する手間がかかりますが、今回はそういう仕様にしました。
同一ドメイン内のリンク
2つ目は同一ドメイン内のリンクの書き方です。
例えば/a
へのリンクを記述する場合、大きく分けて
<a href=”/a”>
<a href=”https://ドメイン名/a”>
の2パターンがあります。
前者の場合は問題ありませんが、後者の場合ドメイン名の部分を固定していると意図せずサブドメインつきのURL(例: hoge.example.jp)からサブドメインなしのURL(例: example.jp)に遷移してしまうことがあります。
対策としては前者のようにパス指定に変更するかドメイン名をリクエストのHostヘッダーから取得するという方法があります。
ただしHostヘッダーはユーザーから改ざんすることが可能なので、本番環境で使用すると予期せぬ問題に繋がるリスクがあります。
最後に
今回はVirtualDocumentRootを使用して1台のサーバーで複数のステージング環境を同時に使用する方法について紹介しました。
これによって今までボトルネックになっていたステージング環境の待ち時間は解消され、複数人が同時にステージング環境を使用できるようになったことで、QAのスピードも向上しました。
今回のようなステージング環境の改善などに興味のある方は、ぜひ応募フォームよりご応募よろしくお願いします!