原教學針對 Windows 2000 + PHP 4.04,技術棧已嚴重過時。本文提供現代 Windows Server 環境下,使用 Nginx + PHP-FPM 部署 PHP 8.3 的生產級指南。
| 方案 | 優點 | 缺點 |
|---|---|---|
| Nginx + PHP-FPM | 高併發、低記憶體、靜態檔案處理快、熱門標準 | Windows 下 PHP-FMP 穩定性略遜 Linux |
| Apache + mod_php | 設定簡單、.htaccess 支援 | 記憶體佔用高、併發能力弱 |
| IIS + FastCGI | Windows 原生整合、GUI 管理 | 授權成本、社群資源較少 |
# PowerShell (以系統管理員執行)
$phpVersion = "8.3.10"
$url = "https://windows.php.net/downloads/releases/php-${phpVersion}-nts-Win32-vs16-x64.zip"
$dest = "C:\php"
Invoke-WebRequest -Uri $url -OutFile "php.zip"
Expand-Archive -Path "php.zip" -DestinationPath $dest -Force
# 重命名資料夾為 C:\php (若解壓出子目錄)
# 複製生產環境範本
Copy-Item "C:\php\php.ini-production" "C:\php\php.ini"
# 關鍵設定 (使用 PowerShell 修改)
$ini = Get-Content "C:\php\php.ini"
$ini = $ini -replace '^;extension_dir = "ext"', 'extension_dir = "ext"'
$ini = $ini -replace '^;extension=curl', 'extension=curl'
$ini = $ini -replace '^;extension=gd', 'extension=gd'
$ini = $ini -replace '^;extension=mbstring', 'extension=mbstring'
$ini = $ini -replace '^;extension=mysqli', 'extension=mysqli'
$ini = $ini -replace '^;extension=pdo_mysql', 'extension=pdo_mysql'
$ini = $ini -replace '^;extension=openssl', 'extension=openssl'
$ini = $ini -replace '^;extension=zip', 'extension=zip'
$ini = $ini -replace '^;extension=intl', 'extension=intl'
$ini = $ini -replace '^;date.timezone =', 'date.timezone = "Asia/Taipei"'
$ini = $ini -replace '^memory_limit = 128M', 'memory_limit = 256M'
$ini = $ini -replace '^post_max_size = 8M', 'post_max_size = 20M'
$ini = $ini -replace '^upload_max_filesize = 2M', 'upload_max_filesize = 20M'
$ini = $ini -replace '^;cgi.fix_pathinfo=1', 'cgi.fix_pathinfo=0' # 安全關鍵
$ini = $ini -replace '^expose_php = On', 'expose_php = Off' # 隱藏版本
Set-Content -Path "C:\php\php.ini" -Value $ini -Encoding UTF8
[Environment]::SetEnvironmentVariable('Path',
[Environment]::GetEnvironmentVariable('Path', 'Machine') + ';C:\php', 'Machine')
# 重新開啟 PowerShell 視窗生效
php -v
# PHP 8.3.10 (cli) (built: ...)
# Copyright (c) The PHP Group
# Zend Engine v4.3.10
$nginxVersion = "1.25.3"
$url = "https://nginx.org/download/nginx-${nginxVersion}.zip"
Invoke-WebRequest -Uri $url -OutFile "nginx.zip"
Expand-Archive -Path "nginx.zip" -DestinationPath "C:\nginx" -Force
# 重命名為 C:\nginx
# C:\nginx\conf\nginx.conf
worker_processes auto;
error_log logs/error.log warn;
pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
tcp_nopush on;
keepalive_timeout 65;
# Gzip 壓縮
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
# PHP 站點設定
server {
listen 80;
server_name localhost;
root C:/www; # 網站根目錄
index index.php index.html;
access_log logs/access.log main;
error_log logs/error.log;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# PHP 處理
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000; # PHP-FPM 預設埠
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
# 安全:限制腳本執行目錄
fastcgi_param PHP_VALUE "open_basedir=C:/www/:/tmp/:/C:/php/";
}
# 禁止存取隱藏檔案、備份檔
location ~ /\. {
deny all;
}
location ~ \.(bak|sql|log|ini)$ {
deny all;
}
}
}
# 下載 NSSM
Invoke-WebRequest -Uri "https://nssm.cc/release/nssm-2.24.zip" -OutFile "nssm.zip"
Expand-Archive "nssm.zip" -DestinationPath "C:\nssm" -Force
# 安裝 PHP-FPM 服務
C:\nssm\win64\nssm.exe install PHP-FPM "C:\php\php-cgi.exe" "-b 127.0.0.1:9000"
C:\nssm\win64\nssm.exe set PHP-FPM AppDirectory "C:\php"
C:\nssm\win64\nssm.exe set PHP-FPM AppStdout "C:\php\logs\php-fpm.stdout.log"
C:\nssm\win64\nssm.exe set PHP-FPM AppStderr "C:\php\logs\php-fpm.stderr.log"
C:\nssm\win64\nssm.exe start PHP-FPM
C:\nssm\win64\nssm.exe install Nginx "C:\nginx\nginx.exe"
C:\nssm\win64\nssm.exe set Nginx AppDirectory "C:\nginx"
C:\nssm\win64\nssm.exe start Nginx
# 建立測試頁面
New-Item -ItemType Directory -Force -Path "C:\www"
@"
<?php
phpinfo();
?>
"@ | Set-Content -Path "C:\www\info.php" -Encoding UTF8
# 瀏覽器訪問 https://localhost/info.php
# 應顯示 PHP 8.3 資訊頁面
open_basedir 限制腳本存取路徑| 現象 | 可能原因 | 解決方向 |
|---|---|---|
| 502 Bad Gateway | PHP-FPM 未啟動/埠衝突/防火牆 | 檢查 `netstat -ano | findstr 9000`、服務狀態、防火牆規則 |
| 404 Not Found (.php) | root 路徑錯誤 / SCRIPT_FILENAME 錯誤 | 確認 `fastcgi_param SCRIPT_FILENAME` 指向正確實體路徑 |
| Permission denied | Nginx/PHP-FPM 執行身分無權限 | 確認網站目錄權限、PHP open_basedir 設定 |
| 上傳失敗 | post_max_size / upload_max_filesize / client_max_body_size | 同時調整 PHP.ini、Nginx `client_max_body_size 20M;` |
Windows Server 上部署 PHP 現代棧,關鍵在於:Nginx + PHP-FPM 架構、php.ini 安全設定 (cgi.fix_pathinfo=0)、服務化管理 (NSSM)、權限最小化原則。建議生產環境優先考慮 Linux 容器 (Docker) 或雲端 PaaS,獲得更穩定的執行環境與生態支援。