Apache 通過 Listen 指令監聽多個端口,結合 NameVirtualHost 和 <VirtualHost> 容器,將不同端口映射到不同的 DocumentRoot,實現「一個端口 = 一個獨立站點/項目」。
# 原有默認端口 Listen 80 # 新增項目端口 (根據需要添加) Listen 8080 Listen 8001 Listen 8002 Listen 8003
<Directory />
Options FollowSymLinks
AllowOverride All
Require all granted # Apache 2.4+ 語法,替代 Order/Deny/Allow
</Directory>
# 啟用基於端口的虛擬主機 (Apache 2.4 可省略)
NameVirtualHost *:80
NameVirtualHost *:8080
NameVirtualHost *:8001
NameVirtualHost *:8002
NameVirtualHost *:8003
# 默認站點 (端口 80)
<VirtualHost *:80>
DocumentRoot "D:/wamp/www"
ServerName localhost
<Directory "D:/wamp/www">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
# 項目 A (端口 8001)
<VirtualHost *:8001>
DocumentRoot "D:/projects/project-a/public"
ServerName project-a.local
<Directory "D:/projects/project-a/public">
AllowOverride All
Require all granted
</Directory>
ErrorLog "logs/project-a-error.log"
CustomLog "logs/project-a-access.log" common
</VirtualHost>
# 項目 B (端口 8002)
<VirtualHost *:8002>
DocumentRoot "D:/projects/project-b"
ServerName project-b.local
<Directory "D:/projects/project-b">
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
# 項目 C (端口 8003) - 原文示例
<VirtualHost *:8003>
DocumentRoot "D:/wamp/www/RED4S_V3.0/svn/repos"
ServerName 127.0.0.1:8003
<Directory "D:/wamp/www/RED4S_V3.0/svn/repos">
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
httpd -k restart 或系統服務重啟https://localhost:8001/ → 項目 Ahttps://localhost:8002/ → 項目 Bhttps://localhost:8003/ → 項目 C編輯 C:\Windows\System32\drivers\etc\hosts (Windows) 或 /etc/hosts (Linux/Mac):
127.0.0.1 project-a.local 127.0.0.1 project-b.local 127.0.0.1 project-c.local
虛擬主機配置中 ServerName project-a.local 即可通過 https://project-a.local:8001/ 訪問,更接近生產環境體驗。
| 問題 | 解決 |
|---|---|
| 端口被佔用 | netstat -an | findstr :8001 檢查,更換端口或結束佔用進程 |
| 防火牆攔截 | Windows 防火牆/安全組/iptables 放行對應端口 |
| 403 Forbidden | 檢查 <Directory> 權限、路徑拼寫、Apache 運行用戶讀取權限 |
| 配置不生效 | 確認配置文件被主配置 Include、語法檢查 httpd -t |
| SSL/HTTPS 需求 | 每個端口需獨立 <VirtualHost *:443> + 證書,或統一 443 走 SNI |
| 方案 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| 端口映射 (本文) | 配置直觀、無需域名、隔離徹底 | 端口資源有限、記憶成本高、非標準訪問 | 本地多項目並行開發、臨時測試 |
| 基於域名的虛擬主機 (ServerName) | 標準 HTTP、共用 80/443、專業 | 需配置 hosts/DNS、同端口下路徑隔離靠路由 | 生產環境、團隊協作、長期項目 |
| Docker 容器化 | 環境一致、端口映射靈活、隔離級別高 | 學習成本、資源佔用略高 | 微服務、CI/CD、生產一致性要求高 |
| 內置 PHP Server / Valet / Homestead | 零配置、自動代理、適合 Laravel/Symfony | 功能受限、非生產級 | 單項目快速啟動、框架開發 |
建議:本地開發階段使用「域名 + 80 端口」虛擬主機 (配合
dnsmasq解析*.test),項目間完全隔離時再考慮端口映射或 Docker。