IIS・Webサイト・CGI構築の自動化

iis-auto-setupのアイキャッチ画像 Windows

WindowsのPowershellを使ってIISを自動設定する手順です。
マイクロサービスモデル向けの設定になります。
山括弧<…>で囲まれている箇所は、ご自身の環境に合わせて書き換える必要があります。

IISの各種インストール・有効化

IIS管理コンソール

IIS管理コンソールを有効化します。これにより、GUIでIISを管理することができます。

Dism /online /enable-feature /FeatureName:IIS-ManagementConsole /All

Webサーバー機能

Webサーバーの基本機能を有効化します。

Dism /online /enable-feature /FeatureName:IIS-WebServer
Dism /online /enable-feature /FeatureName:IIS-ApplicationDevelopment

CGI機能

IIS経由でCGIを実行できるようにします。

Dism /online /enable-feature /FeatureName:IIS-CGI

サーバーサイドインクルード(Server Side Include; SSI)

サーバーサイドインクルードとは、HTMLファイル内に別ファイルやコマンドの実行結果を合成できる機能です。

Dism /online /enable-feature /FeatureName:IIS-ServerSideIncludes

URL Rewrite

URL Rewrite機能はIISのプラグインです。事前にこちらから「rewrite*.msi」をダウンロードして下さい。

# rewrite*.msiのサイレントインストール
& msiexec /qn /i <rewrite*.msiのフルパス>

URL Rewriteのインストールに失敗する場合、こちらを参考にして下さい。

WebSocket

WebSocket機能を有効化します。

Dism /online /enable-feature /FeatureName:IIS-WebSockets

Webサイト・CGIの構築

前提

・ドキュメントルート「C:\hoge\contents」
・CGIルート「C:\hoge\cgi-bin」
にします。ドキュメントルート、CGIルートについてはこちらをご覧下さい。

また、ここでは、CGIモジュールはPHPを使い、「C:\hoge\cgi\php」に配置するものとします。
(同フォルダ以下にphp-cgi.exeなどが存在する)

IIS操作モジュールの読み込み

以下を実行しないと、その後のコマンドでエラーになることがあります。

Import-Module WebAdministration

Webサイト作成

所望のサイト名、ポート番号を指定し、Webサイトを作成します。

New-Item IIS:\Sites\$script:<Webサイト名> -bindings @{protocol=http;bindingInformation=<ポート番号(e.g. 80)>} -force

CGIモジュールの実行を許可

当該サイトで、CGIの実行を許可します。

Set-WebConfiguration /system.Webserver/Security/isapiCgiRestriction/@notListedCgisAllowed -Value True -PSPath "MACHINE/WEBROOT/APPHOST"

アプリケーションプールの追加・設定

アプリケーションプールとは、当該サイトのCGIの実行環境です。例えば、使用できるメモリの上限、実行できるCGIプロセス数の上限などを設定できます。

Set-Variable WEBSITE_APPPOOL "IIS:\AppPools\<Webサイト名>"

New-Item $script:WEBSITE_APPPOOL -Force
$AppPool = Get-Item $script:WEBSITE_APPPOOL
$AppPool.processModel.identityType = 'LocalSystem'
$AppPool | Set-Item

Webサイトの設定

当該Webサイトのドキュメントルート、アプリケーションプールとの紐づけなどを行います。

Set-Variable DOCUMENT_ROOT "<ドキュメントルートへの絶対パス(e.g. C:\hoge\contents)>"
Set-Variable WEBSITE_DEFAULT_PATH "IIS:\Sites\<Webサイト名>"
Set-Variable WEBSITE_DEFAULT "<Webサイト名>"
Set-Variable APPPOOL_NAME "<アプリケーションプール名(e.g. Webサイト名と同じでよい)>"

Set-ItemProperty -Path $script:WEBSITE_DEFAULT_PATH -Name PhysicalPath -Value $script:DOCUMENT_ROOT
Set-ItemProperty -Path $script:WEBSITE_DEFAULT_PATH -Name ApplicationPool -Value $script:APPPOOL_NAME
& $Env:WinDir\system32\inetsrv\appcmd.exe unlock config $script:WEBSITE_DEFAULT -section:handlers /commitpath:apphost  # ロック解除が必要
& $Env:WinDir\system32\inetsrv\appcmd.exe set config $script:WEBSITE_DEFAULT -section:system.webServer/security/authentication/anonymousAuthentication /enabled:"True" /userName: /commit:apphost
& $Env:WinDir\system32\inetsrv\appcmd.exe set config $script:WEBSITE_DEFAULT -section:system.webServer/handlers /accessPolicy:"Read,Script"
& $Env:WinDir\system32\inetsrv\appcmd.exe set config $script:WEBSITE_DEFAULT -section:staticContent /+"[fileExtension='.dmg',mimeType='application/x-apple-diskimage']"
& $Env:WinDir\system32\inetsrv\appcmd.exe set config $script:WEBSITE_DEFAULT -section:staticContent /+"[fileExtension='.jdf',mimeType='text/xml']"
& $Env:WinDir\system32\inetsrv\appcmd.exe set config $script:WEBSITE_DEFAULT -section:requestfiltering /requestlimits.maxallowedcontentlength:4294967295
Set-WebConfigurationProperty -PSPath $script:WEBSITE_DEFAULT_PATH -Filter "/system.webServer/httpErrors" -Name "errorMode" -Value "Detailed"

CGIの設定

CGIモジュールのパス、CGIモジュールが実行するCGIファイルのパスの設定などを行います。

Set-Variable CGI_NAME "<任意のCGI名(e.g. cgi-bin)>"  # ※①
Set-Variable CGI_ROOT "<任意のCGI名が指すフルパス(e.g. C:\hoge\cgi-bin)>"  # この場所をCGIルートとする ※②
Set-Variable CGI_TYPE "<CGIファイルの拡張子(e.g. *.php)>"
Set-Variable CGI_FULL_PATH "<CGIモジュールのフルパス(e.g. C:\hoge\php\php-cgi.exe)>"
Set-Variable WEBSITE_DEFAULT_CGI "<Webサイト名>/$script:CGI_NAME"  # 当該Webサイト用のCGIを指す
Set-Variable WEBSITE_DEFAULT_CGI_PATH "IIS:\Sites\$script:Site\$script:CGI_NAME"

New-WebApplication -Name $script:CGI_NAME -Site $script:WEBSITE_DEFAULT -PhysicalPath $CGI_ROOT -ApplicationPool $script:APPPOOL_NAME
& $Env:WinDir\system32\inetsrv\appcmd.exe unlock config $script:WEBSITE_DEFAULT_CGI -section:handlers /commitpath:apphost  # ロック解除が必要
& $Env:WinDir\system32\inetsrv\appcmd.exe set config $script:WEBSITE_DEFAULT_CGI -section:system.webServer/security/authentication/anonymousAuthentication /enabled:"True" /userName: /commit:apphost
& $Env:WinDir\system32\inetsrv\appcmd.exe set config $script:WEBSITE_DEFAULT_CGI -section:system.webServer/handlers /accessPolicy:"Script,Execute"
& $Env:WinDir\system32\inetsrv\appcmd.exe set config $script:WEBSITE_DEFAULT_CGI -section:system.webServer/cgi /createProcessAsUser:"False" /commit:apphost
& $Env:WinDir\system32\inetsrv\appcmd.exe set config $script:WEBSITE_DEFAULT_CGI -section:system.webServer/cgi /timeout:"00:15:00" /commit:apphost
New-WebHandler -PSPath $script:WEBSITE_DEFAULT_CGI_PATH -Name $script:CGI_NAME -Path $script:CGI_TYPE -Verb 'HEAD,GET,POST,PUT,PATCH,DELETE' -Modules "CgiModule" -ScriptProcessor $script:CGI_FULL_PATH

URL Rewriteの設定(任意)

URL Rewrite(URLの書き換え)の設定を行います。

Set-Variable WEBSITE_NAME "<Webサイト名(e.g. hoge)>"
Set-Variable URL_REWRITE_FROM "<変換前のURLリソース(e.g. ^api/(.*))>" # http://ip:port/api/hogeのようにアクセスされるケース
Set-Variable URL_REWRITE_TO "<変換後のアクセス先(e.g. cgi-bin/index.php)>" # 上記※①②より、C:\hoge\cgi-bin\index.phpにアクセスする

Add-WebConfiguration -PSPath $script:WEBSITE_DEFAULT_PATH -Filter "/system.Webserver/rewrite/rules" -Value @{name=$script:WEBSITE_NAME; patternSyntax='Regular Expressions'; stopProcessing='False'}
Set-WebConfigurationProperty -PSPath $script:WEBSITE_DEFAULT_PATH -Filter "/system.Webserver/rewrite/rules/rule[@name='$script:WEBSITE_NAME']/match" -Name "url" -Value $script:URL_REWRITE_FROM
Set-WebConfigurationProperty -PSPath $script:WEBSITE_DEFAULT_PATH -Filter "/system.Webserver/rewrite/rules/rule[@name='$script:WEBSITE_NAME']/action" -Name "type" -Value "Rewrite"
Set-WebConfigurationProperty -PSPath $script:WEBSITE_DEFAULT_PATH -Filter "/system.Webserver/rewrite/rules/rule[@name='$script:WEBSITE_NAME']/action" -Name "url" -Value $script:URL_REWRITE_TO


インターネット インフォメーション サービス (IIS) マネージャーで、WebサイトおよびCGIが追加されていることを確認します。

Webサイト・CGIの削除

URL Rewriteの削除

URL Rewrite(URLの書き換え)の設定を削除します。

if(Get-Website -Name $script:WEBSITE_NAME){
    if(Get-WebConfiguration -PSPath $script:WEBSITE_DEFAULT_PATH -Filter "/system.Webserver/rewrite/rules/rule[@name='$script:WEBSITE_NAME']"){        
        Clear-WebConfiguration -PSPath $script:WEBSITE_DEFAULT_PATH -Filter "/system.Webserver/rewrite/rules/rule[@name='$script:WEBSITE_NAME']"
    }

}

Webサイトの削除

Webサイトを削除します。

if(Get-Website -Name $script:WEBSITE_NAME){
    Remove-WebSite -Name $script:WEBSITE_NAME
}

アプリケーションプールの削除

Webサイトに紐づいていたアプリケーションプールを削除します。

if(Test-Path $script:WEBSITE_APPPOOL){
    Remove-Item $script:WEBSITE_APPPOOL -recurse -force
}

TIPS

  • CGIとしてPHPを使用する場合はこちらをご覧下さい。
  • CGIとしてPythonを使用する場合はこちらをご覧下さい。
  • クロスオリジン(CORS)対応についてはこちらをご覧下さい。

コメント

タイトルとURLをコピーしました