本機開發環境常需同時運行 IIS 與 Apache,但兩者預設皆佔用 TCP 80 埠。本文提供三種成熟共存方案,依據 IP 資源與架構需求選擇最適合的作法。
DisableSocketPooling適用於擁有多張網卡或多 IP 的環境。假設 IIS 綁 192.168.0.1,Apache 綁 192.168.0.2。
C:\Inetpub\Adminscripts。cscript adsutil.vbs set w3svc/DisableSocketPooling trueDisableSocketPooling : (BOOLEAN) True 即成功。iisreset)。httpd.conf 設 Listen 192.168.0.2:80。注意:此參數在 IIS 6.0 中雖可設定但不生效,因 IIS 6.0 改由核心模式HTTP.sys處理,需改用Httpcfg.exe(見方案二)。
Httpcfg.exeIIS 6.0 採用 HTTP.sys 核心驅動,必須用 Httpcfg.exe 管理 IP 監聽清單。
support\tools\Support.cab 解壓 httpcfg.exe 至 %windir%\system32\。httpcfg set iplisten -i 192.168.0.1httpcfg query iplistenhttpcfg delete iplisten -i 192.168.0.1net stop Apache2
net stop iisadmin /y
net start Apache2
net start w3svc
httpd.conf 設 Listen 192.168.0.2:80。驗證:瀏覽器分別訪問 https://192.168.0.1(IIS)與 https://192.168.0.2(Apache),互不干擾。
僅有一個公網 IP 時,可讓 Apache 佔用 80 埠,IIS 改聽 81 埠,Apache 以 mod_proxy 轉發特定主機請求給 IIS。
httpd.conf 載入模組(取消註解):LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
<VirtualHost *:80>
ServerName iloves.vicp.net
ProxyPass / https://localhost:81/
ProxyPassReverse / https://localhost:81/
</VirtualHost>
缺點:增加一次 Proxy 轉發延遲、單點故障、需處理 Host Header 重寫、SSL 終結較複雜。生產環境強烈建議申請多 IP 或使用第 4 層負載平衡器(如 Nginx、HAProxy、AWS ALB)而非 Apache 反向代理。
利用方案二多 IP 架構,可在 IIS 安裝 PHP 4(php.ini 放 %windir%),Apache 安裝 PHP 5(php.ini 放 PHP 5 目錄並設 PHPIniDir),實現雙版本並行:
# Apache httpd.conf 片段
LoadModule php5_module "D:/PHPServer/PHP5/php5apache2.dll"
AddType application/x-httpd-php .php
DirectoryIndex index.html index.php
PHPIniDir "D:/PHPServer/PHP5"
關鍵在於 PHPIniDir 指定專屬 php.ini 路徑,且路徑使用正斜線(/)而非反斜線(\)。
| 場景 | 推薦方案 | 優點 | 缺點 |
|---|---|---|---|
| 擁有多公網 IP / 多網卡 | 方案二(IIS 6 + Httpcfg) | 原生隔離、零效能損耗、SSL 獨立管理 | 需額外 IP 成本 |
| 單公網 IP、生產環境 | Nginx/HAProxy 第 4 層負載平衡 | 高效能、健檢、SSL 卸載、可擴充 | 需額外部署一層 |
| 單公網 IP、開發/測試環境 | 方案三 | 零成本、快速驗證 | 效能損耗、維護複雜 |
根據實際網路拓撲與業務等級選擇方案,並做好服務啟動順序自動化(批次檔/排程任務/服務相依性),即可穩定實現 IIS 與 Apache 共用 80 埠。