以前に構築したWindows Server上のRedmineですが「IISと一緒に80番ポートでアクセスできる様にしたいなぁ。」と思ったのでリバースプロキシとしてApplication Request Routing(以降ARR)を導入してみました。
ARRを使ったRedmineの設定についてはググるといろいろなサイトでその手順が紹介されているのですが、割と古めの情報が多かったので、本エントリでは最新のARR 3.0を使いできるだけGUIに頼らない手順を紹介しようと思います。
参考サイト
ARRとは何ぞやといった話や、基本的な設定手順についてはMVPの田中さんの以下の記事が詳しく参考になります。
本エントリも基本的にはこの記事の内容に従っており、記事中では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
補足として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だと以下の設定と等価になります。
URL書き換え規則の設定 - その1
ここからURL書き換え規則を追加していきます。
書き換え規則はDefault Web Site
に対して行うものとし、
/
→http://localhost:3000/
に書き換えるルールを設定してみます。
ざっくり図にするとこんな感じです。
書き換え設定はGUI、CUIのどちらから行おうとも最終的にはWeb.config
の設定に行きつきます。
なのでPowerShellで設定する場合でもAdd-WebConfigurationProperty
やSet-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だと以下の設定と等価になります。
URL書き換え規則の設定 - その2
先ほどの設定で基本的な内容は理解できたかと思いますが、これではあまり使い勝手がよくありません。
そこで追加例として、
/redmine
→http://localhost:3000/redmine
に書き換えるルールを設定してみます。
このルールであれば/redmine/*
の場合だけRedmineを、その他URLの場合はIISを利用することができます。
(/redmine
→ http://localhost:3000/
としていないのは、このルールだとRedmine側でCSS等のパスが合わなくなるためです)
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だとこう書き換えています。
結果
最終的に/redmine
でアクセスした場合はRedmineに、
それ以外のURLでアクセスした場合はIIS(ここではデフォルトサイト)にアクセス可能になり
RedmineとIISのサイトを併用可能にすることができました。
*1:GUIで設定した場合につく名前と同じ