在 Windows 環境下,Nginx 預設只能將請求發送給單一連接埠(例如 127.0.0.1:9000)的 php-cgi.exe。因為 Windows 的 php-cgi.exe沒有像 Linux PHP-FPM 那樣內建自動管理多個子程序(Process)的機制,一旦網站流量稍微變大,單一的 php-cgi 就會卡死,導致嚴重的伺服器回應延遲。
利用 Nginx 的 upstream 功能,我們可以在 Windows 內啟動多個不同連接埠的 php-cgi.exe(例如 9001、9002、9003),並讓 Nginx 以輪詢(Round Robin)的方式將請求平均分配給它們,達成多執行緒(Load Balancing)的效果。
以下是完整的設定步驟:
第一步:修改 nginx.conf 啟用 Upstream
請打開您的 nginx.conf,在 http 區塊內(與 server 區塊平級的位置),加入 upstream 定義。隨後修改您原本 HTTPS 伺服器中的 fastcgi_pass。
nginx.conf 內容如下:
http {
# ... 您原本的其他 http 設定 ...
# ==========================================
# 1. 定義 PHP-CGI 負載平衡群組 (名稱自訂,這裡叫 php_cluster)
# ==========================================
upstream php_cluster {
# 這裡啟動 4 個連接埠,代表允許 4 個執行緒同時平行運算
server 127.0.0.1:9001 weight=1 max_fails=3 fail_timeout=10s;
server 127.0.0.1:9002 weight=1 max_fails=3 fail_timeout=10s;
server 127.0.0.1:9003 weight=1 max_fails=3 fail_timeout=10s;
server 127.0.0.1:9004 weight=1 max_fails=3 fail_timeout=10s;
# 保持與後端 php-cgi 的長連線,減少頻繁建立 TCP 連線的消耗
keepalive 32;
}
# 您原本的 HTTP server 80 (轉址) ...
# HTTPS server: https://polinwei.com
server {
listen 443 ssl;
server_name your_server_name;
# ... 您原本的 SSL 與快取排除邏輯設定 ...
# ==========================================
# 2. 修改原本的 location ~ \.php$ 區塊
# ==========================================
location ~ \.php$ {
include fastcgi.conf;
include fastcgi_params;
# 【關鍵修改】將原本的 127.0.0.1:9000 改為剛剛定義的 upstream 名稱
fastcgi_pass php_cluster;
# 支援長連線
fastcgi_keep_alive on;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# 您原本的快取設定
fastcgi_cache WORDPRESS;
fastcgi_cache_bypass $custom_skip_cache;
fastcgi_no_cache $custom_skip_cache;
fastcgi_cache_valid 200 301 302 1d;
fastcgi_cache_valid 404 1m;
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
add_header X-FastCGI-Cache $upstream_cache_status;
fastcgi_read_timeout 60s;
fastcgi_connect_timeout 60s;
}
}
}第二步:在 Windows 中同時啟動多個 php-cgi.exe
既然 Nginx 已經準備好將流量丟給 9001~9004 連接埠,我們必須在 Windows 系統中真正把這 4 個連接埠的 PHP 程序跑起來。
因為手動點開 4 個 CMD 視窗很不實際,最推薦的做法是編寫一個自動化的 Windows 批次檔 (.bat)。
請在您的電腦中(例如 Nginx 或 PHP 的目錄下)建立一個名為 start_php_cluster.bat 的檔案,點擊右鍵編輯,貼入以下內容:
@echo off
echo Starting PHP-CGI Cluster...
:: 設定您 Windows 系統中 php-cgi.exe 的實際路徑(請根據您的環境修改)
set PHP_PATH=C:\php\php-cgi.exe
:: 設定環境變數:防止 PHP 因為記憶體洩漏自動崩潰,達到 2000 次請求後才會重啟
set PHP_FCGI_MAX_REQUESTS=2000
:: 使用 start /b 隱藏視窗,在背景各別啟動 9001 到 9004 埠
start /b "" "%PHP_PATH%" -b 127.0.0.1:9001
start /b "" "%PHP_PATH%" -b 127.0.0.1:9002
start /b "" "%PHP_PATH%" -b 127.0.0.1:9003
start /b "" "%PHP_PATH%" -b 127.0.0.1:9004
echo PHP-CGI Cluster started successfully on ports 9001-9004.
pause未來每當伺服器開機,您只要以系統管理員身分執行這個 .bat 檔,它就會瞬間在 Windows 背景產生 4 個獨立的 PHP 處理執行緒。
第三步:如何優雅地關閉這些背景 PHP?
由於使用 start /b 啟動的 PHP 沒辦法直接關閉視窗,當您未來要更新 php.ini 或重啟服務時,可以建立另一個 stop_php.bat 來一鍵清除它們:
@echo off
echo Killing all php-cgi processes...
taskkill /f /im php-cgi.exe
echo Done.
pause檢查是否成功
- 執行
start_php_cluster.bat啟動多個 PHP。 - 重啟您的 Nginx 伺聯網(指令:
nginx -s reload)。 - 打開 Windows 的 工作管理員(Ctrl + Shift + Esc),切換到「詳細資料」標籤頁,您應該會看到畫面上同時存在 4 個
php-cgi.exe正在運作。 - 網頁讀取時,Nginx 就會自動把流量分流,搭配我們前面做好的 FastCGI Cache,網頁的回應速度(TTFB)將會達到 Windows 環境下的極限。
請試著調整 nginx.conf 並建立批次檔啟動。
替代方案 xxfpmW
因為在windows系統中的php-cgi.exe (即工作管理員中的 CGI / FastCGI)很容易掛掉,為了在Windows系統 中防止php-cgi 崩潰,有網友就自行撰寫了這個套件,它可以後臺運行,並將運行和錯誤日誌保存在txt檔中。去掉linux相關代碼,解決關機時會彈出錯誤視窗提示的問題。
因為windows裡沒有fpm (FastCGI Process Manager ),也可以使用 xxfpmW 來解決





