以 iisreset.exe 與 appcmd.exe 管理 Windows IIS Container
當我們採用含 IIS 功能的 Windows Container 後(例如,Windows IIS、ASP.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 進行管理的動作。
- 裡這有篇 Examples of IIS Powershell cmdlets 提供大量組態使用的範例,非常不錯的參考資料。
同場加映:讀取 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
來強制把快取日誌內容寫入檔案再進行讀取。
沒有留言:
張貼留言
感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。