しばたテックブログ

PowerShellを中心に気分で書いている技術ブログです。

Application Request Routing(ARR)を使ったRedmineの設定について

blog.shibata.tech

以前に構築したWindows Server上のRedmineですが「IISと一緒に80番ポートでアクセスできる様にしたいなぁ。」と思ったのでリバースプロキシとしてApplication Request Routing(以降ARR)を導入してみました。

ARRを使ったRedmineの設定についてはググるといろいろなサイトでその手順が紹介されているのですが、割と古めの情報が多かったので、本エントリでは最新のARR 3.0を使いできるだけGUIに頼らない手順を紹介しようと思います。

参考サイト

ARRとは何ぞやといった話や、基本的な設定手順についてはMVPの田中さんの以下の記事が詳しく参考になります。

www.buildinsider.net

本エントリも基本的にはこの記事の内容に従っており、記事中ではC#で書かれている個所をPowerShellで書き直している感じになります。

0. はじめに

本エントリの前提として、Windows Serverに最小構成でRedmineをインストールするでRedmineをインストールした直後の状態からはじめます。

この環境にIISとARRをインストールし、RedmineにアクセスするためのURLの書き換えを行っていきます。

1. IISとARRのインストール

はじめにIISとARRをインストールします。
IISはWindowsの機能の追加、またはInstall-WindowsFeatureコマンドレットからインストール可能ですが、ARRと一緒にインストールするのであればWebPIからインストールするのが手っ取り早く確実です。

以下の手順でWebPIをサイレントインストールします。

# Web PI
# ダウンロード
Invoke-WebRequest -Uri "https://download.microsoft.com/download/C/F/F/CFF3A0B8-99D4-41A2-AE1A-496C08BEB904/WebPlatformInstaller_amd64_en-US.msi" -OutFile "$(Get-Location -PSProvider Filesystem)\WebPlatformInstaller_amd64_en-US.msi"
# インストール
Start-Process -FilePath "msiexec.exe" -ArgumentList @('/i', "$(Get-Location -PSProvider Filesystem)\WebPlatformInstaller_amd64_en-US.msi", '/passive') -Wait -PassThru
# PATH追加
$env:PATH = "C:\Program Files\Microsoft\Web Platform Installer;" + $env:PATH

WebPIをインストールしたらWebpiCmdコマンドが使える様になりますので、以下の様にWebpiCmd /InstallコマンドでIISとARRをインストールします。

# IIS + ARR 3.0のインストール
#   IIS-WebServer        IIS-WebServer
#   ARRv3_0              Application Request Routing 3.0
#   ManagementService    IIS: Management Service
WebpiCmd.exe /Install /Products:"IIS-WebServer,ARRv3_0,ManagementService" /AcceptEULA

f:id:stknohg:20171105210848p:plain

f:id:stknohg:20171105210903p:plain

補足としてWebpiCmdでインストール可能なプロダクトは以下のコマンドで確認することができます。
環境に応じてインストールするプロダクトを変えてやれば良いでしょう。

WebpiCmd.exe /List /ListOption:All

2. ARRの構成

ここからARRの構成を行います。
はじめにWebAdministrationをインポートしておきます。

Import-Module WebAdministration

リバースプロキシの有効化

Set-WebConfigurationPropertyコマンドでリバースプロキシを有効にします。

# リバースプロキシ有効化
Set-WebConfigurationProperty -Filter system.webServer/proxy -Name Enabled -Value $true

GUIだと以下の設定と等価になります。

f:id:stknohg:20171105211131p:plain


f:id:stknohg:20171105211148p:plain


f:id:stknohg:20171105211204p:plain

URL書き換え規則の設定 - その1

ここからURL書き換え規則を追加していきます。
書き換え規則はDefault Web Siteに対して行うものとし、

  • /http://localhost:3000/

に書き換えるルールを設定してみます。

ざっくり図にするとこんな感じです。

f:id:stknohg:20171105212112p:plain:w400

書き換え設定はGUI、CUIのどちらから行おうとも最終的にはWeb.configの設定に行きつきます。

なのでPowerShellで設定する場合でもAdd-WebConfigurationPropertySet-WebConfigurationProperty等を使ってひたすら該当する設定をしてやるしかありません。

以下の例ではReverseProxyInboundRule1という規則*1を作っています。

# Rewrite Ruleの設定
$REWRITE_SITE_PATH = "IIS:\Sites\Default Web Site"
$REWRITE_RULE_NAME = "ReverseProxyInboundRule1" # GUIで設定した時と同じ名前にしておく
$REVERSE_PROXY_HOST = "localhost:3000"
$rule = @{
    Name = $REWRITE_RULE_NAME; 
    PatternSyntax = 'ECMAScript';
    stopProcessing = 'True'
}
Add-WebConfigurationProperty -PSPath $REWRITE_SITE_PATH -Filter "system.webServer/rewrite/rules" -Name "." -Value $rule
Set-WebConfigurationProperty -PSPath $REWRITE_SITE_PATH -Filter "system.webServer/rewrite/rules/rule[@name='$($REWRITE_RULE_NAME)']/action" -Name "url" -Value "http://$REVERSE_PROXY_HOST/{R:1}"
Set-WebConfigurationProperty -PSPath $REWRITE_SITE_PATH -Filter "system.webServer/rewrite/rules/rule[@name='$($REWRITE_RULE_NAME)']/action" -Name "type" -Value "Rewrite"
Set-WebConfigurationProperty -PSPath $REWRITE_SITE_PATH -Filter "system.webServer/rewrite/rules/rule[@name='$($REWRITE_RULE_NAME)']/match" -Name "url" -Value "(.*)"

GUIだと以下の設定と等価になります。

f:id:stknohg:20171105211319p:plain

f:id:stknohg:20171105211333p:plain

f:id:stknohg:20171105211348p:plain

f:id:stknohg:20171105211404p:plain

URL書き換え規則の設定 - その2

先ほどの設定で基本的な内容は理解できたかと思いますが、これではあまり使い勝手がよくありません。

そこで追加例として、

  • /redminehttp://localhost:3000/redmine

に書き換えるルールを設定してみます。

このルールであれば/redmine/*の場合だけRedmineを、その他URLの場合はIISを利用することができます。
(/redminehttp://localhost:3000/としていないのは、このルールだとRedmine側でCSS等のパスが合わなくなるためです)

f:id:stknohg:20171105212217p:plain:w400

Redmineの設定変更

このルールに合わせるため、URL書き換えの前にRedmine側でURLにプリフィックス(/redmine)を付ける設定変更をしておきます。
Redmineでプリフィックスを付けるにはいくつか方法がある様ですが、今回は/config/environment.rbを書き換える方法を採ります。

以下の手順で/config/environment.rb

Redmine::Utils::relative_url_root = "/redmine"

の1行を追加します。

# CSS等のパスを変えるために ./config/environment.rb にPrefix設定を追加。
# http://www.redmine.org/projects/redmine/wiki/HowTo_Install_Redmine_in_a_sub-URI
$REDMINE_VER = '3.4.2'
$REDMINE_INSTALL_ROOT = 'C:\'
$REDMINE_INSTALL_PATH = Join-Path $REDMINE_INSTALL_ROOT "redmine-$REDMINE_VER"
@"
#
Redmine::Utils::relative_url_root = "/redmine"
"@ -replace "`n","`r`n" | Add-Content (Join-Path $REDMINE_INSTALL_PATH "config\environment.rb") -Encoding Default

/config/environment.rbの設定を変更した後は、Thinの起動引数に--prefixを付ける変更をしてRedmineを起動しなおします。

# サービス設定を変更
$REDMINE_SERVICE_NAME = "Redmine"
$REDMINE_INSTALL_PORT = 3000
$REDMINE_URL_PREFIX = "/redmine"
Stop-Service $REDMINE_SERVICE_NAME
thin_service remove -N $REDMINE_SERVICE_NAME
thin_service install -N $REDMINE_SERVICE_NAME -c "$REDMINE_INSTALL_PATH" -p $REDMINE_INSTALL_PORT -e production --prefix $REDMINE_URL_PREFIX
Start-Service $REDMINE_SERVICE_NAME

これでプリフィックスを付けてRedmineを起動することができ、

でアクセス可能になります。

URL書き換えルールの設定

最後にURL書き換えルールを設定します。
その1で追加したルールを以下のコマンドで書き換えます。

Set-WebConfigurationProperty -PSPath $REWRITE_SITE_PATH -Filter "system.webServer/rewrite/rules/rule[@name='$($REWRITE_RULE_NAME)']/action" -Name "url" -Value "http://$REVERSE_PROXY_HOST/{R:0}"
Set-WebConfigurationProperty -PSPath $REWRITE_SITE_PATH -Filter "system.webServer/rewrite/rules/rule[@name='$($REWRITE_RULE_NAME)']/match" -Name "url" -Value "redmine(.*)"

GUIだとこう書き換えています。

f:id:stknohg:20171105211509p:plain


f:id:stknohg:20171105211530p:plain

結果

最終的に/redmineでアクセスした場合はRedmineに、

f:id:stknohg:20171105212958p:plain

それ以外のURLでアクセスした場合はIIS(ここではデフォルトサイト)にアクセス可能になり

f:id:stknohg:20171105213110p:plain

RedmineとIISのサイトを併用可能にすることができました。

*1:GUIで設定した場合につく名前と同じ