以iisreset.exe與appcmd.exe管理Windows IIS Container

以 iisreset.exe 與 appcmd.exe 管理 Windows IIS Container

當我們採用含 IIS 功能的 Windows Container 後(例如,Windows IISASP.NET等),有時需要查詢或操作 IIS,未經組態的 IIS 容器並無法直接使用如 IIS 管理員等 GUI 工具來連線管理。還是可以透過內建 iisreset.exe 與 appcmd.exe 來進行查詢與管理。

iisreset.exe

位於:%windir%\System32\

iisreset [computername]

    /RESTART            停止並重新啟動所有網際網路服務。
    /START              啟動所有網際網路服務。
    /STOP               停止所有網際網路服務。
    /REBOOT             將電腦重新開機。
    /REBOOTONERROR      啟動、停止或重新啟動網際網路服務時
                        如果發生錯誤,便將電腦重新開機。
    /NOFORCE            正常停止網際網路服務的嘗試失敗時,
                        不要強制終止網際網路服務。
    /TIMEOUT:val        指定等待成功停止網際網路服務
                        的逾時值 (以秒為單位)。
                        如果 /REBOOTONERROR 參數已指定,
                        便會在到期時將電腦重新開機。
                        重新啟動的預設值為 20 秒,停止的預設值為 60 秒,
                        重新開機的預設值為 0 秒。
    /STATUS             顯示所有網際網路服務的狀態。
    /ENABLE             啟用本機系統上的網際網路服務重新啟動。
    /DISABLE            停用本機系統上的網際網路服務重新啟動。
PS C:\> docker exec {containerId} iisreset /status

Status for Windows Process Activation Service ( WAS ) : Running
Status for World Wide Web Publishing Service ( W3SVC ) : Running

在容器內,請不要執行影響 IIS 這個服務生命週期的事,例如執行 /RESTART/STOP,這會讓 IIS 容器進入 Exited 狀態。

appcmd.exe

Appcmd.exe 讓我們能透過指令模式來管理 IIS 組態。

64 bit: %windir%\system32\inetsrv\ 32 bit: %windir%\syswow64\inetsrv\

appcmd /?

c:\> %windir%\system32\inetsrv\appcmd.exe /?
APPCMD (command) (object-type) <identifier> </parameter1:value1 ...>

支援的物件類型:

  SITE      Administration of virtual sites
  APP       Administration of applications
  VDIR      Administration of virtual directories
  APPPOOL   Administration of application pools
  CONFIG    Administration of general configuration sections
  MODULE    Administration of server modules
  TRACE     Working with failed request trace logs

Appcmd 的說明文件(/?)很好玩,它是先顯示 (object-type) 的資訊。然後再用 object 去查詢 command。

appcmd object /?

c:\> %windir%\system32\inetsrv\appcmd site /?
APPCMD (command) SITE <identifier> <-parameter1:value1 ...>

支援的命令:

  list      List virtual sites
  set       Configure virtual site
  add       Add new virtual site
  delete    Delete virtual site
C:\> docker exec {containerId} C:\Windows\System32\inetsrv\appcmd.exe list site
SITE "Default Web Site" (id:1,bindings:http/*:80:,state:Started)

c:\>  appcmd.exe apppool /?

支援的命令:

  list      List application pools
  set       Configure application pool
  add       Add new application pool
  delete    Delete application pool
  start     Start application pool
  stop      Stop application pool
  recycle   Recycle application pool
C:\> docker exec {containerId} C:\Windows\System32\inetsrv\appcmd.exe list apppool
APPPOOL "DefaultAppPool" (MgdVersion:v4.0,MgdMode:Integrated,state:Started)
APPPOOL ".NET v4.5 Classic" (MgdVersion:v4.0,MgdMode:Classic,state:Started)
APPPOOL ".NET v4.5" (MgdVersion:v4.0,MgdMode:Integrated,state:Started)

appcmd command object

%windir%\system32\inetsrv\appcmd list site
%windir%\system32\inetsrv\appcmd list apppool

列出網站與 AppPool 清單。

%windir%\system32\inetsrv\appcmd stop site "Default Web Site"
%windir%\system32\inetsrv\appcmd start site "Default Web Site"

停止與啟動網站。

%windir%\system32\inetsrv\appcmd recycle apppool "DefaultAppPool"

執行 AppPool 回收。

這裡有篇不錯的參考資料:Getting Started with AppCmd.exe

Appcmd.exe 指令大多不影響 IIS 這個服務本身,就是說,它不會讓 IIS 容器進入 Exited 狀態。例如,以下在 IIS 容器新增一個 AppPool:

C:\Windows\System32\inetsrv>appcmd add apppool /name:"TestPool"
APPPOOL object "TestPool" added

C:\Windows\System32\inetsrv>appcmd list apppool
APPPOOL "DefaultAppPool" (MgdVersion:v4.0,MgdMode:Integrated,state:Started)
APPPOOL ".NET v4.5 Classic" (MgdVersion:v4.0,MgdMode:Classic,state:Started)
APPPOOL ".NET v4.5" (MgdVersion:v4.0,MgdMode:Integrated,state:Started)
APPPOOL "TestPool" (MgdVersion:v4.0,MgdMode:Integrated,state:Started)

也可以利用 docker exec 來下指令:

C:\> docker exec -w "C:\Windows\System32\inetsrv" {containerId} appcmd recycle apppool TestPool
"TestPool" successfully recycled

在 Dockerfile 整合也是可以:

RUN & C:\Windows\System32\inetsrv\appcmd.exe `
    unlock config `
    /section:system.webServer/handlers

像上列,使用 appcmd 進行 IIS 的組態異動。另外,PowerShell 也提供一組 Web Administration cmdlets,讓我們比較容易對 IIS 進行管理的動作。

同場加映:讀取 IIS 容器日誌

預設 IIS 是將日誌寫入檔案,所以 IIS 容器使用 docker logs 是看不到日誌內容的。

IIS 日誌預設路徑:C:\inetpub\logs\LogFiles\W3SVC1

PS C:\> docker exec -w "C:\inetpub\logs\LogFiles\W3SVC1" {containerId} powershell dir


    Directory: C:\inetpub\logs\LogFiles\W3SVC1


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        7/20/2019   8:00 AM         131119 u_ex190719.log
-a----        7/21/2019   8:00 AM         208605 u_ex190720.log
-a----        7/22/2019   7:59 AM         208461 u_ex190721.log
-a----        7/23/2019   7:59 AM         208603 u_ex190722.log
-a----        7/23/2019   8:00 AM              0 u_ex190723.log

然後就能讀取 IIS 的日誌檔:

docker exec -w "C:\inetpub\logs\LogFiles\W3SVC1" udsp PowerShell Get-Content u_ex190722.log

IIS 預設會對日誌內容快取,預設每一小時才會寫一次至日誌檔,我們可以對 IIS 容器執行 netsh http flush logbuffer 來強制把快取日誌內容寫入檔案再進行讀取。

沒有留言:

張貼留言

感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。