目次
はじめに
既存のRedmineサーバーをHTTPSとCORSに対応させる方法として、リバースプロキシを使う方法を紹介します。
背景
RedmineとTrelloを連携するRedSyncというPower-Up (TrelloのPlugin) をリリースしました。
RedSyncはRedmineにアクセスするために、RedmineのRest APIにアクセスします。このときRedmine側では、HTTPSとCORS (Cross-Origin Resource Sharing) をサポートしている必要があります。Redmineサーバーの設定を変更すれば対応できますが、設定変更が難しい環境もあります。そのような環境で使えるのが、このリバースプロキシを使う方法です。
この方法は、社外のSaaSでRedmineを利用している場合にも適用できます。(Rest APIが利用可能であることが前提です)
その前に! Redmineサーバーの設定を直接変更できる場合は
直接Redmineサーバーの設定を変更できる場合は、Redmineを稼働させているWebサーバーの設定で、対応することができます。Apacheの場合のHTTPS化とCORSサポートの方法については、下記の記事で紹介しました。

イントラのサーバーでもHTTPS化されているものは多いと思います。その場合はCORS対応のみで済みます。
リバースプロキシとは
(筆者の知識では大雑把にしか説明できないですが)
リバースというからには、リバースではないただのプロキシがある訳で …
クライアントPCから見て、サーバーへのアクセスを代行してくれるのがプロキシです。社内からインターネットへの出口として良く使われます。
これに対して、サーバーの代行としてクライアントPCからのリクエストを受けてくれるのが、リバースプロキシです。代行する立場が逆になるので、リバースとなる訳ですね。
リバースプロキシを置く目的 (メリット) は色々とありますが、ここではHTTPSやCORSに非対応のサーバーの代わりに、これらをサポートすることが目的です。

環境
- Apache 2.4
- Ubuntu 20.04 LTS
Apacheのインストール
Apacheをリバースプロキシとして使う場合も、まずはWebサーバーとしてセットアップします。
Apacheをインストールして、HTTPS化およびCORSサポートを設定するところまでは、以前の記事を参考にしてください。
UbuntuのRedmine 5.0をApacheで動かす (HTTPSとCORSに対応)
リバースプロキシの構成
リバースプロキシとして動作させるための構成を定義します。バックエンドで動いているRedmineを呼び出すので、そのための情報を構成ファイルに追加します。
まずSSLサイト向けの構成ファイルを変更します。
sudo vim /etc/apache2/sites-available/default-ssl.conf
<VirtualHost _default_:443>のセクションに、次の内容を追加します。
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
# 既存の定義
SSLProxyEngine on
ProxyPass "/" "<RedmineサーバーURL>"
ProxyPassReverse "/" "<RedmineサーバーURL>"
<Location />
<IfModule mod_headers.c>
Header always set Access-Control-Allow-Origin "*"
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT, PATCH"
Header always set Access-Control-Max-Age "7200"
Header always set Access-Control-Allow-Headers "Content-Type, x-redmine-api-key"
</IfModule>
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ $1 [R=200,L]
</IfModule>
</Location>
</VirtualHost>
</IfModule>
ProxyPass – 呼び出すRedmineサーバーのURLを指定します。RedmineサーバーがHTTPSをサポートしている場合はHTTPSで指定します。ただしRedmineサーバーのHTTPSに自己署名証明書が使われてる場合は、HTTPで指定してください。HTTPSで指定するとエラーが発生します。
ProxyPassReverse – ProxyPassと同じ内容を指定します。リダイレクトなど幾つかのケースで、レスポンス内のRedmineサーバーのURLを、リバースプロキシのURLに書き換えます。(筆者は今回のケースでこれが必要かどうか確認できていません。実際この定義をしなくても取り敢えず問題ありませんでした。対象が”/”の場合は必要ないとの記述も見かけましたがどうなんでしょうか …)
URLの最後は”/”で閉じるようにしてください。
次に通常サイト向けの構成ファイルを変更します。
sudo vim /etc/apache2/sites-available/000-default.conf
<VirtualHost *:80>のセクションに、次の内容を追加します。
<VirtualHost *:80>
# 既存の定義
Redirect "/" "<リバースプロキシサーバーの HTTPS URL>"
</VirtualHost>
Redirect – HTTPでのアクセスをHTTPSにリダイレクトします。このためリバースプロキシサーバーのURLはHTTPSを指定してください。またURLの最後は”/”で閉じるようにしてください。
モジュールを組み込んで、Apacheサーバーを再起動します。
sudo a2enmod proxy
sudo a2enmod proxy_http
sudo systemctl restart apache2
動作確認
Webブラウザから、https://<Reverse Proxy Serverのアドレス> を入力します。
Redmineの画面が表示されれば正しく構成されています。

自己署名証明書の注意点
リバースプロキシのサーバーに自己署名証明書を使った場合、Redmineの画面にアクセスすると、ブラウザのセキュリティチェックに引っかかります。Chromeの場合は次のような警告画面が表示されます。この場合は指示に従ってアクセスを許可してください。(自分の立てたサーバーなので素性は分かっているということで …)


実はRedSyncからRedmineと同期を実行したり、カードを表示したりした時に、同じチェックに引っかかっている場合があります。その場合は、見かけ上は通信エラーとして表示されます。Redmineの画面を表示して、セキュリティ警告が出ていないか確認してください。アカウントリンクの画面から、Redmineの個人設定の画面を開くのリンクをクリックしても、Redmineの画面を表示できます。

おわりに
Redmineを単純にインストールしただけではCORS対応とはなりません。一緒に使用するWebサーバーの設定変更が必要になりますが、IT部門などで管理されている場合、簡単には応じてもらえない可能性があります。また外部のSaaSでRedmineを利用している場合も同様です。その場合はリバースプロキシが解決策になります。
ただセキュリティ要件などで、例え社内向けでもサーバーを立てることが難しい場合もあるかと思います。その場合はリバースプロキシのサーバーも立てられない可能性があります。そうなると正直手詰まりです。管理部門などに粘り強く交渉して頂くしかないのかなと思います。
変更履歴
日時 | 内容 |
2024/04/24 | Apacheを使ったHTTPS/CORSサポート記事への参照リンクを更新 |
2022/06/13 | 初版リリース |