、站點(diǎn)配置與避坑排查)
簡(jiǎn)介這份資源是面向在 Windows XP 環(huán)境下搭建 Web 服務(wù)器的個(gè)人開(kāi)發(fā)者、小型企業(yè)運(yùn)維人員及 Web 學(xué)習(xí)者的 IIS 6.0 完整安裝包重點(diǎn)解決 XP 系統(tǒng)默認(rèn)不含 IIS 組件、手動(dòng)安裝時(shí)缺少 DLL 等文件的問(wèn)題。壓縮包共 273 個(gè)文件約 11.69MB以 dl_、in_、vb_、ex_ 等安裝源文件為主配合 dll 動(dòng)態(tài)庫(kù)、exe 可執(zhí)行程序、htm 幫助頁(yè)面、chm 文檔及 inf 安裝信息文件構(gòu)成可離線部署的組件集合并附帶 IIS_XPSP3 相關(guān)更新內(nèi)容。已有 283 人學(xué)習(xí)關(guān)注。資源涵蓋進(jìn)程模型分離、Metabase 配置管理、SSL/TLS 加密、WebDAV、Windows 集成身份驗(yàn)證、FTP 服務(wù)及 ASP/ASP.NET 腳本支持等特性所需組件便于讀者在 XP SP3 上完成安裝后實(shí)踐網(wǎng)站部署、權(quán)限配置與性能監(jiān)控是學(xué)習(xí) Web 服務(wù)器管理與開(kāi)發(fā)的實(shí)用起點(diǎn)。1. 老 XP 機(jī)器上跑 IIS 6.0這份安裝包到底能救什么急手里還有一臺(tái)跑 Windows XP 的工控機(jī)或者老測(cè)試機(jī)想在上面掛個(gè) ASP 頁(yè)面、跑個(gè)本地 Web 服務(wù)做聯(lián)調(diào)結(jié)果翻遍系統(tǒng)盤(pán)發(fā)現(xiàn) IIS 根本沒(méi)裝控制面板里也找不到添加組件的入口——這種場(chǎng)景下一份能直接落地的 IIS 6.0 完整安裝包就是救命稻草。IIS 6.0 是 Windows Server 2003 時(shí)代的 Web 服務(wù)器組件XP 上對(duì)應(yīng)的是 IIS 5.1但很多老項(xiàng)目、老教程、老部署腳本都按 IIS 6.0 的目錄結(jié)構(gòu)和配置習(xí)慣來(lái)寫(xiě)所以實(shí)際運(yùn)維里經(jīng)常需要在 XP 環(huán)境里把 IIS 6.0 的組件補(bǔ)齊。這份安裝包解決的就是“系統(tǒng)缺組件、在線安裝源失效、手動(dòng)一個(gè)個(gè)找文件對(duì)不上版本”的問(wèn)題適合還在維護(hù)老舊 ASP/ASP.NET 1.1 項(xiàng)目、需要本地復(fù)現(xiàn)歷史環(huán)境的從業(yè)者。下面按“先搞清楚它是什么、再動(dòng)手裝、最后避開(kāi)幾個(gè)血淚坑”的順序拆開(kāi)講。2. 先弄明白 IIS 6.0 在 XP 上的真實(shí)身份組件構(gòu)成與安裝前提2.1 IIS 6.0 與 XP 自帶 IIS 5.1 的關(guān)系很多人一上來(lái)就懵XP 系統(tǒng)里明明有“Internet 信息服務(wù)”這個(gè)選項(xiàng)為什么還要單獨(dú)找 IIS 6.0 安裝包這里得先把版本關(guān)系理清楚。Windows XP 專業(yè)版自帶的是 IIS 5.1而 IIS 6.0 是隨 Windows Server 2003 發(fā)布的版本兩者在內(nèi)核架構(gòu)上差別不小——IIS 6.0 引入了工作進(jìn)程隔離模式Worker Process Isolation Mode把每個(gè)應(yīng)用池跑在獨(dú)立的 w3wp.exe 進(jìn)程里而 IIS 5.1 還是把請(qǐng)求交給 inetinfo.exe 里的線程池處理。所以嚴(yán)格來(lái)說(shuō)XP 上裝不了“原生”的 IIS 6.0市面上流傳的所謂“XP 用 IIS 6.0 安裝包”本質(zhì)是把 Server 2003 的 IIS 6.0 組件文件做了適配打包讓它在 XP 的組件安裝框架下能注冊(cè)進(jìn)去實(shí)際運(yùn)行時(shí)部分底層還是走 XP 的 5.1 內(nèi)核。這個(gè)區(qū)別直接決定了你裝完之后看到的管理界面如果裝的是純 5.1 組件打開(kāi)的是老式的“Internet 信息服務(wù)”MMC 管理單元沒(méi)有“應(yīng)用程序池”節(jié)點(diǎn)如果裝的是適配版 6.0 包管理樹(shù)里會(huì)出現(xiàn)“應(yīng)用程序池”但部分高級(jí)功能比如完整的健康監(jiān)測(cè)、失敗請(qǐng)求跟蹤在 XP 上跑不起來(lái)。所以選包之前先想清楚你是只需要一個(gè)能響應(yīng) HTTP 請(qǐng)求的本地服務(wù)還是必須復(fù)現(xiàn) 6.0 的應(yīng)用池隔離行為。前者用系統(tǒng)自帶組件就夠后者才需要這份完整包。2.2 安裝前必須確認(rèn)的三個(gè)系統(tǒng)條件動(dòng)手之前有三件事必須先核對(duì)否則裝到一半報(bào)錯(cuò)會(huì)非常難受。第一是系統(tǒng)盤(pán)符和 Windows 目錄名安裝包里的 inf 文件默認(rèn)按C:\Windows寫(xiě)路徑如果你的 XP 裝在 D 盤(pán)或者目錄名不是 Windows注冊(cè)組件時(shí)會(huì)找不到源文件。第二是系統(tǒng)是否打過(guò) SP2 或 SP3IIS 6.0 適配包對(duì) SP 版本有要求SP1 環(huán)境下部分 DLL 會(huì)注冊(cè)失敗。第三是確認(rèn)沒(méi)有裝過(guò)其他版本的 IIS 殘留注冊(cè)表里HKLM\SOFTWARE\Microsoft\InetStp下的版本號(hào)如果已經(jīng)是 5.1 且組件完整再疊加安裝容易沖突。核對(duì)系統(tǒng)信息的命令很簡(jiǎn)單開(kāi)個(gè) cmd 跑一下# 查看系統(tǒng)版本和 SP 補(bǔ)丁級(jí)別 systeminfo | findstr /C:OS Name /C:OS Version /C:Service Pack # 查看當(dāng)前 IIS 版本注冊(cè)信息 reg query HKLM\SOFTWARE\Microsoft\InetStp /v MajorVersion reg query HKLM\SOFTWARE\Microsoft\InetStp /v MinorVersionMajorVersion返回 5、MinorVersion返回 1 說(shuō)明當(dāng)前是 IIS 5.1如果返回 6 和 0說(shuō)明系統(tǒng)里已經(jīng)有 6.0 的注冊(cè)痕跡這時(shí)候要先決定是修復(fù)還是覆蓋。systeminfo那行用來(lái)確認(rèn) SP 級(jí)別輸出里Service Pack 3是最穩(wěn)妥的。這三條信息對(duì)不上就先別急著裝后面避坑章節(jié)會(huì)講版本錯(cuò)配導(dǎo)致的典型翻車。2.3 安裝包內(nèi)部結(jié)構(gòu)哪些文件真正在起作用一份完整的 IIS 6.0 安裝包解開(kāi)后目錄結(jié)構(gòu)大致是這樣的根目錄下有一個(gè)iis6.inf安裝信息文件負(fù)責(zé)告訴系統(tǒng)哪些組件要注冊(cè)、注冊(cè)到哪個(gè)路徑system32\inetsrv目錄放的是核心可執(zhí)行文件包括w3wp.exe工作進(jìn)程、inetinfo.exe老式主進(jìn)程、iisadmin.dll管理接口system32\inetsrv\config下是metabase.xml和schema.xml這兩個(gè)是 IIS 的配置黑匣子所有站點(diǎn)、應(yīng)用池、虛擬目錄的定義都在這另外還有iisadmpwd、iishelp等輔助目錄。真正決定能不能跑起來(lái)的是三樣?xùn)|西inetsrv下的 DLL 是否和系統(tǒng)位數(shù)匹配XP 基本都是 32 位別拿 64 位文件湊、metabase.xml的 schema 版本是否和注冊(cè)的 IIS 版本一致、以及iis6.inf里[Components]段列出的組件是否齊全。很多人下載的包缺iisadmpwd或者iishelp裝完發(fā)現(xiàn)管理界面能開(kāi)但改密碼功能報(bào)錯(cuò)就是組件不全。所以拿到包先別雙擊用解壓工具展開(kāi)看一眼目錄樹(shù)對(duì)照上面三樣確認(rèn)齊全再動(dòng)手。3. 動(dòng)手裝從解包到站點(diǎn)跑通的完整步驟3.1 用組件安裝方式注冊(cè) IIS 6.0最穩(wěn)的安裝路徑不是雙擊某個(gè) exe而是走系統(tǒng)自帶的“添加或刪除 Windows 組件”框架讓它去讀安裝包里的 inf。具體做法是先把安裝包解壓到一個(gè)固定目錄比如D:\iis6_pkg然后打開(kāi)控制面板的“添加或刪除程序”→“添加/刪除 Windows 組件”勾選“Internet 信息服務(wù)(IIS)”點(diǎn)“下一步”時(shí)它會(huì)彈窗要源文件把路徑指到D:\iis6_pkg即可。如果彈窗沒(méi)出現(xiàn)或者直接報(bào)錯(cuò)說(shuō)明系統(tǒng)緩存里還記著舊的安裝源需要先清一下。命令行方式更可控適合批量或者遠(yuǎn)程操作# 先清掉系統(tǒng)記錄的舊安裝源路徑避免指向不存在的目錄 reg delete HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup /v SourcePath /f # 用 sysocmgr 走組件安裝指定 inf 和靜默參數(shù) sysocmgr /i:%windir%\inf\sysoc.inf /u:D:\iis6_pkg\iis6_unattend.txt /q這里sysocmgr是 XP 上負(fù)責(zé)組件安裝的老工具/i指定系統(tǒng)組件清單/u指向一個(gè)無(wú)人值守應(yīng)答文件/q表示靜默不彈界面。應(yīng)答文件iis6_unattend.txt里要寫(xiě)清楚[Components]段勾選哪些子組件比如iis_wwwon、iis_ftpon、iis_aspon。參數(shù)含義上/q只是不顯示進(jìn)度條出錯(cuò)還是會(huì)寫(xiě)日志日志位置在%windir%\iis6.log裝完第一時(shí)間去翻這個(gè)文件比看界面報(bào)錯(cuò)靠譜得多。3.2 驗(yàn)證組件注冊(cè)與 metabase 初始化裝完不代表能用得確認(rèn) metabase 有沒(méi)有正確初始化。IIS 的所有配置都存在metabase.xml里如果這個(gè)文件沒(méi)生成或者 schema 對(duì)不上管理界面打開(kāi)就是一片空白。驗(yàn)證方法是先看文件在不在再用自帶腳本讀一下配置樹(shù)# 確認(rèn) metabase 文件存在且非空 dir %windir%\system32\inetsrv\metabase.xml # 用 adsutil 腳本枚舉當(dāng)前站點(diǎn)配置能列出來(lái)說(shuō)明 metabase 可讀 cscript %windir%\system32\inetsrv\adsutil.vbs enum /LM/W3SVCadsutil.vbs是 IIS 自帶的 ADSI 配置腳本enum /LM/W3SVC會(huì)列出所有 Web 站點(diǎn)的編號(hào)和綁定信息。正常輸出里至少有一個(gè)1默認(rèn)站點(diǎn)如果報(bào)“找不到路徑”或者“拒絕訪問(wèn)”說(shuō)明 metabase 沒(méi)初始化好或者權(quán)限不對(duì)。這時(shí)候別急著重裝先檢查inetinfo.exe進(jìn)程有沒(méi)有起來(lái)以及IIS Admin Service這個(gè)服務(wù)是不是處于運(yùn)行狀態(tài)——metabase 的讀寫(xiě)依賴這個(gè)服務(wù)服務(wù)沒(méi)起腳本讀到的就是空。3.3 建第一個(gè)站點(diǎn)并跑通 ASP 頁(yè)面組件就緒后建站點(diǎn)有兩種方式圖形界面在inetmgr里右鍵“網(wǎng)站”→“新建”或者直接用adsutil.vbs寫(xiě)配置。圖形界面直觀但步驟多命令行適合復(fù)現(xiàn)。下面用腳本建一個(gè)監(jiān)聽(tīng) 8080 端口的測(cè)試站點(diǎn)根目錄指向D:\wwwroot# 創(chuàng)建站點(diǎn)根目錄并放一個(gè)測(cè)試 ASP 文件 mkdir D:\wwwroot echo ^%% Response.Write iis6 ok %%^ D:\wwwroot\test.asp # 用 adsutil 創(chuàng)建站點(diǎn)指定端口和根目錄 cscript %windir%\system32\inetsrv\adsutil.vbs create w3svc/2 cscript %windir%\system32\inetsrv\adsutil.vbs set w3svc/2/ServerBindings :8080: cscript %windir%\system32\inetsrv\adsutil.vbs set w3svc/2/Root/Path D:\wwwrootcreate w3svc/2表示新建編號(hào)為 2 的站點(diǎn)編號(hào) 1 是默認(rèn)站點(diǎn)別覆蓋ServerBindings的格式是:端口:主機(jī)頭這里只寫(xiě)端口表示監(jiān)聽(tīng)所有網(wǎng)卡的 8080Root/Path指定物理路徑。建完還要啟動(dòng)站點(diǎn)用adsutil.vbs set w3svc/2/ServerAutoStart true讓它隨服務(wù)自啟然后瀏覽器訪問(wèn)http://localhost:8080/test.asp看到iis6 ok就說(shuō)明整條鏈路通了。如果返回 404先查Root/Path有沒(méi)有寫(xiě)錯(cuò)返回 500 多半是 ASP 功能沒(méi)在組件里勾選回去補(bǔ)iis_aspon。4. 避坑與排查五個(gè)裝 IIS 6.0 時(shí)最容易翻車的地方4.1 現(xiàn)象組件安裝到一半報(bào)“找不到 iis6.inf 中的某個(gè)節(jié)”原因通常是安裝包不完整或者解壓時(shí)把目錄層級(jí)壓平了導(dǎo)致 inf 里引用的相對(duì)路徑失效。IIS 的 inf 文件里大量使用.\system32\inetsrv\xxx.dll這種相對(duì)路徑一旦目錄結(jié)構(gòu)被破壞注冊(cè)到一半就斷。解決辦法是重新解壓保持原始目錄樹(shù)確認(rèn)iis6.inf和system32目錄在同一級(jí)然后再走一遍組件安裝。裝之前可以用文本編輯器打開(kāi) inf搜[SourceDisksFiles]段看列出的文件在解壓目錄里是否都能找到缺哪個(gè)補(bǔ)哪個(gè)。4.2 現(xiàn)象裝完打開(kāi) inetmgr 提示“MMC 無(wú)法創(chuàng)建管理單元”這是典型的組件注冊(cè)不全常見(jiàn)于只勾了iis_www沒(méi)勾管理工具。IIS 的管理界面依賴iisadmin.dll和w3svc.dll兩個(gè)管理擴(kuò)展缺一個(gè) MMC 就起不來(lái)。排查方法是去%windir%\system32\inetsrv下看這兩個(gè) DLL 在不在不在就回安裝包補(bǔ)注冊(cè)在的話用regsvr32手動(dòng)注冊(cè)一遍regsvr32 %windir%\system32\inetsrv\iisadmin.dll regsvr32 %windir%\system32\inetsrv\w3svc.dll注冊(cè)完重啟IIS Admin Service再開(kāi)inetmgr。如果還報(bào)錯(cuò)看事件查看器的應(yīng)用程序日志里面會(huì)寫(xiě)明是哪個(gè) CLSID 注冊(cè)失敗按 CLSID 去注冊(cè)表查對(duì)應(yīng) DLL 再補(bǔ)。4.3 現(xiàn)象站點(diǎn)能建但訪問(wèn)一律 401.1401.1 是認(rèn)證失敗IIS 6.0 默認(rèn)對(duì)匿名訪問(wèn)的賬戶是IUSR_機(jī)器名如果這個(gè)賬戶在系統(tǒng)里不存在或者被禁用所有匿名請(qǐng)求都會(huì)被拒。XP 上裝適配包時(shí)安裝程序有時(shí)不會(huì)自動(dòng)創(chuàng)建這個(gè)賬戶。解決方法是手動(dòng)建一個(gè)本地用戶IUSR_你的機(jī)器名設(shè)置密碼永不過(guò)期然后在站點(diǎn)屬性的“目錄安全性”→“匿名訪問(wèn)”里把賬戶指過(guò)去。另一種情況是 NTFS 權(quán)限沒(méi)給站點(diǎn)根目錄的安全選項(xiàng)卡里要確保IUSR_機(jī)器名有讀取和執(zhí)行權(quán)限光有 IIS 配置不夠。4.4 現(xiàn)象ASP 頁(yè)面返回 500 但日志里沒(méi)有詳細(xì)信息IIS 6.0 默認(rèn)把 ASP 錯(cuò)誤發(fā)到瀏覽器但“發(fā)送詳細(xì)錯(cuò)誤到客戶端”這個(gè)選項(xiàng)在適配包里經(jīng)常是關(guān)的導(dǎo)致 500 只給一句“內(nèi)部服務(wù)器錯(cuò)誤”。排查時(shí)先把詳細(xì)錯(cuò)誤打開(kāi)在inetmgr里右鍵站點(diǎn)→屬性→“主目錄”→配置→“調(diào)試”選項(xiàng)卡勾選“發(fā)送詳細(xì) ASP 錯(cuò)誤到客戶端”。如果界面里找不到這個(gè)選項(xiàng)直接改 metabasecscript %windir%\system32\inetsrv\adsutil.vbs set w3svc/2/AspErrorsToNTLog true cscript %windir%\system32\inetsrv\adsutil.vbs set w3svc/2/AspScriptErrorSentToBrowser true改完重啟站點(diǎn)再訪問(wèn)就能看到具體是哪一行 ASP 報(bào)錯(cuò)。這兩個(gè)參數(shù)是排查 ASP 問(wèn)題的后悔藥建議建完站點(diǎn)就順手打開(kāi)省得后面抓瞎。4.5 現(xiàn)象裝完系統(tǒng)變慢任務(wù)管理器里多出一堆 w3wp.exe這是 IIS 6.0 工作進(jìn)程隔離模式的正常表現(xiàn)但如果進(jìn)程數(shù)異常多且 CPU 占用高多半是應(yīng)用池配置有問(wèn)題。XP 適配包默認(rèn)可能給每個(gè)站點(diǎn)建獨(dú)立應(yīng)用池站點(diǎn)一多進(jìn)程就多。排查時(shí)用adsutil.vbs enum /LM/W3SVC/AppPools列出所有應(yīng)用池看有沒(méi)有閑置的沒(méi)回收。解決方法是把不用的站點(diǎn)停掉或者把多個(gè)小站點(diǎn)合并到同一個(gè)應(yīng)用池減少進(jìn)程數(shù)。另外檢查metabase.xml里PeriodicRestartTime的值設(shè)成 0 表示不自動(dòng)回收老機(jī)器上建議設(shè)個(gè) 174029 小時(shí)讓它定期重啟避免內(nèi)存泄漏累積。5. 進(jìn)階用腳本批量校驗(yàn)安裝完整性別靠肉眼對(duì)文件裝完一遍能跑通不代表包是完整的尤其是從不同渠道拿到的安裝包文件缺失往往要等到某個(gè)功能被觸發(fā)才暴露。我一般會(huì)在裝完后跑一個(gè)校驗(yàn)?zāi)_本把關(guān)鍵文件和注冊(cè)表項(xiàng)列出來(lái)逐項(xiàng)比對(duì)比肉眼翻目錄靠譜得多。下面這段 bash 在 XP 的 cmd 里也能跑用for循環(huán)替代核心思路是維護(hù)一份“必須存在”的清單缺一項(xiàng)就報(bào)警echo off setlocal enabledelayedexpansion set MISSING0 for %%f in ( %windir%\system32\inetsrv\inetinfo.exe %windir%\system32\inetsrv\w3wp.exe %windir%\system32\inetsrv\iisadmin.dll %windir%\system32\inetsrv\metabase.xml %windir%\system32\inetsrv\adsutil.vbs ) do ( if not exist %%f ( echo [MISSING] %%f set /a MISSING1 ) ) if !MISSING! equ 0 (echo all core files present) else (echo !MISSING! files missing)這段腳本的for %%f in (...)把五個(gè)核心文件路徑當(dāng)成列表遍歷if not exist判斷存在性set /a MISSING1累加缺失數(shù)。跑完看輸出all core files present說(shuō)明核心組件齊了有[MISSING]行就按路徑回安裝包補(bǔ)。注意enabledelayedexpansion那行不能省否則循環(huán)里的變量累加不生效這是 cmd 腳本的老毛病。除了文件注冊(cè)表項(xiàng)也要校驗(yàn)。IIS 6.0 正常注冊(cè)后HKLM\SYSTEM\CurrentControlSet\Services\W3SVC下應(yīng)該有ImagePath指向inetinfo.exeHKLM\SOFTWARE\Microsoft\InetStp下MajorVersion應(yīng)該是 6。用reg query逐條查和預(yù)期值對(duì)不上就說(shuō)明注冊(cè)環(huán)節(jié)出了問(wèn)題。這套校驗(yàn)我一般做成一個(gè)check_iis6.bat放在安裝包同級(jí)目錄每次裝完先跑它通過(guò)了再建站點(diǎn)能省掉大量“裝完才發(fā)現(xiàn)缺東西”的返工。還有一個(gè)容易被忽略的點(diǎn)是 metabase 的備份。IIS 6.0 支持用adsutil.vbs導(dǎo)出整個(gè)配置樹(shù)裝好并調(diào)通站點(diǎn)后立刻導(dǎo)一份存著cscript %windir%\system32\inetsrv\adsutil.vbs enum /LM/W3SVC D:\iis6_backup\sites.txt copy %windir%\system32\inetsrv\metabase.xml D:\iis6_backup\metabase_bak.xmlsites.txt是配置的可讀快照metabase_bak.xml是原始配置兩個(gè)都留著。以后站點(diǎn)配置被改亂或者誤刪直接把備份的 metabase 覆蓋回去再重啟服務(wù)比一條條重建快得多。這個(gè)習(xí)慣是從一次誤操作里換來(lái)的——當(dāng)時(shí)手滑把一個(gè)跑了十幾個(gè)虛擬目錄的站點(diǎn)刪了沒(méi)有備份只能從頭配花了大半天。從那以后我每次裝完 IIS 6.0、調(diào)通第一個(gè)站點(diǎn)都強(qiáng)制先導(dǎo)一份 metabase 備份再往下做希望這個(gè)習(xí)慣也能幫到你。本文還有配套的精品資源點(diǎn)擊獲取