Windows 上部署 Apache + PHP 最穩定的組合是 **Apache Lounge VS16 編譯版 + PHP Thread Safe (TS) 版**,透過 `mod_php` (php8apache2_4.dll) 整合。本文涵蓋從下載、安裝、VirtualHost、SSL 憑證、URL 重寫、PHP 配置到效能調優的完整流程。
| 元件 | 版本要求 | 下載來源 |
|---|---|---|
| Apache | 2.4.x VS16 (Visual Studio 2019) | Apache Lounge |
| PHP | 8.x TS (Thread Safe) VS16 x64 | windows.php.net |
| VC++ Redist | Visual C++ 2015-2022 x64 | Microsoft |
版本不匹配會導致「Cannot load php8apache2_4.dll」或 Apache 崩潰。
# 1. 載入 PHP 模組 (確認 dll 存在)
LoadModule php_module "C:/php/8.3.12-ts/php8apache2_4.dll"
# 2. 指定 php.ini 目錄
PHPIniDir "C:/php/8.3.12-ts"
# 3. 關聯 .php 副檔名
SetHandler application/x-httpd-php
# 4. 預設首頁
DirectoryIndex index.php index.html index.htm
# 5. 允許 .htaccess (需配合 AllowOverride)
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
cd C:\Apache24\bin
.\httpd.exe -k install -n "Apache2.4_PHP8.3"
.\httpd.exe -k start
# httpd.conf 取消註解
Include conf/extra/httpd-vhosts.conf
ServerName site1.local
DocumentRoot "C:/www/site1/public"
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
ErrorLog "logs/site1-error.log"
CustomLog "logs/site1-access.log" common
ServerName site2.local
DocumentRoot "C:/www/site2/public"
AllowOverride All
Require all granted
# C:\Windows\System32\drivers\etc\hosts (管理員編輯)
127.0.0.1 site1.local
127.0.0.1 site2.local
# 安裝 mkcert (Chocolatey/Scoop/手動)
choco install mkcert
mkcert -install
mkcert site1.local localhost 127.0.0.1 ::1
# 產生 site1.local+2.pem (憑證) 和 site1.local+2-key.pem (私鑰)
# 複製至 C:\Apache24\conf\ssl\
# httpd.conf 取消註解
LoadModule ssl_module modules/mod_ssl.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
Include conf/extra/httpd-ssl.conf
ServerName site1.local
DocumentRoot "C:/www/site1/public"
SSLEngine on
SSLCertificateFile "C:/Apache24/conf/ssl/site1.local+2.pem"
SSLCertificateKeyFile "C:/Apache24/conf/ssl/site1.local+2-key.pem"
# 現代 SSL 設定
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite HIGH:!aNULL:!MD5:!3DES
SSLHonorCipherOrder on
AllowOverride All
Require all granted
瀏覽 `https://site1.local` 應顯示綠鎖 (mkcert 已安裝根憑證至系統信任存儲)。
# httpd.conf 確認載入
LoadModule rewrite_module modules/mod_rewrite.so
# 專案根目錄 .htaccess (Laravel/Symfony/ThinkPHP 通用)
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [L]
ThreadsPerChild 1920 # 依 CPU 核心調整,預設 1920 較高
MaxConnectionsPerChild 10000
AcceptFilter http none # Windows 建議關閉
AcceptFilter https none
EnableSendfile Off # Windows 網路磁碟問題
EnableMMAP Off
# 靜態資源快取
ExpiresActive On
ExpiresByType image/* "access plus 1 month"
ExpiresByType text/css "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
# Gzip 壓縮
AddOutputFilterByType DEFLATE text/html text/css application/javascript application/json
DeflateCompressionLevel 6
; OpCache (生產必開)
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=20000
opcache.revalidate_freq=60
opcache.jit=tracing
opcache.jit_buffer_size=128M
; 實際路徑快取
realpath_cache_size=4096K
realpath_cache_ttl=7200
; 上傳/執行限制
max_execution_time=60
memory_limit=256M
post_max_size=50M
upload_max_filesize=50M
| 現象 | 排查步驟 |
|---|---|
| Apache 啟動閃退 | 1. `httpd.exe -t` 檢查語法 2. 事件檢視器 → Windows Logs → Application 找 Error 3. 檢查 php8apache2_4.dll 是否存在、版本匹配 |
| PHP 錯誤不顯示 | php.ini: display_errors=On, error_reporting=E_ALL; httpd.conf: php_flag display_errors On (若用 php_flag) |
| .htaccess 不生效 | AllowOverride All 且目錄正確;檢查 RewriteEngine On |
| SSL 憑證不信任 | mkcert -install 並重啟瀏覽器;或手動匯入根憑證至「受信任的根憑證授權單位」 |
| 上傳大檔失敗 | php.ini post_max_size/upload_max_filesize;Apache LimitRequestBody |
| 中文路徑 404 | Apache 2.4.58+ 支援 UTF-8 路徑;舊版需啟用 `AcceptPathInfo On` 或升級 |
Windows Apache + PHP 部署核心在於 VC++ 編譯版本一致 (VS16)、TS 版 PHP + mod_php、正確載入順序與路徑。配合 mkcert 產生受信任本地憑證、VirtualHost 多站點隔離、OpCache + 實際路徑快取,可構建極接近生產環境的本地開發體驗。長期專案建議遷移至 **Docker (php:apache / php:fpm + nginx)** 或 **WSL2**,消除平台差異,實現開發/測試/部署一致性。