首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

Windows Server 2019/2022 安裝 PHP 8.3 + Nginx 完整部署指南

     編輯:PHP 綜合知識

前言

原教學針對 Windows 2000 + PHP 4.04,技術棧已嚴重過時。本文提供現代 Windows Server 環境下,使用 Nginx + PHP-FPM 部署 PHP 8.3 的生產級指南。

架構選擇:Nginx + PHP-FPM (推薦)

方案優點缺點
Nginx + PHP-FPM高併發、低記憶體、靜態檔案處理快、熱門標準Windows 下 PHP-FMP 穩定性略遜 Linux
Apache + mod_php設定簡單、.htaccess 支援記憶體佔用高、併發能力弱
IIS + FastCGIWindows 原生整合、GUI 管理授權成本、社群資源較少

步驟 1:安裝 PHP 8.3

下載與解壓

# 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 (若解壓出子目錄)

設定 php.ini

# 複製生產環境範本
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

加入系統 PATH

[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

步驟 2:安裝 Nginx

$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

設定 nginx.conf

# 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;
        }
    }
}

步驟 3:啟動 PHP-FPM 與 Nginx

建立 PHP-FMP 服務 (使用 NSSM - Non-Sucking Service Manager)

# 下載 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

建立 Nginx 服務

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

步驟 4:驗證與測試

# 建立測試頁面
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 資訊頁面

生產環境強化清單

  • ☐ 設定 Windows 防火牆:僅開放 80/443 埠
  • ☐ 申請 SSL 憑證 (Let's Encrypt / Certbot / win-acme) 啟用 HTTPS
  • ☐ 設定 Nginx 快取、壓縮、安全標頭 (HSTS, CSP, X-Frame-Options)
  • ☐ PHP open_basedir 限制腳本存取路徑
  • ☐ 關閉不需要的 PHP 擴充套件
  • ☐ 設定日誌輪轉 (logrotate / NSSM 內建)
  • ☐ 建立監控:CPU、記憶體、磁碟、PHP-FPM 程序數、Nginx 連線數
  • ☐ 定期更新:Windows Update、PHP 安全性更新、Nginx 更新

常見問題排查

現象可能原因解決方向
502 Bad GatewayPHP-FPM 未啟動/埠衝突/防火牆檢查 `netstat -ano | findstr 9000`、服務狀態、防火牆規則
404 Not Found (.php)root 路徑錯誤 / SCRIPT_FILENAME 錯誤確認 `fastcgi_param SCRIPT_FILENAME` 指向正確實體路徑
Permission deniedNginx/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,獲得更穩定的執行環境與生態支援。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved