本節包含在 Unix 系統上安裝 PHP 搭配 Lighttpd 1.4 的注意事項和提示。
在繼續之前,請使用 » Lighttpd 追蹤系統 學習如何正確安裝 Lighttpd。
FastCGI 是連接 PHP 和 Lighttpd 的首選 SAPI。FastCGI 在 php-cgi 中會自動啟用。
要設定 Lighttpd 連接到 PHP 並產生 FastCGI 行程,請編輯 lighttpd.conf。建議使用 Socket 來連接到本機系統上的 FastCGI 行程。
範例 #1 lighttpd.conf 部分內容
server.modules += ( "mod_fastcgi" )
fastcgi.server = ( ".php" =>
((
"socket" => "/tmp/php.socket",
"bin-path" => "/usr/local/bin/php-cgi",
"bin-environment" => (
"PHP_FCGI_CHILDREN" => "16",
"PHP_FCGI_MAX_REQUESTS" => "10000"
),
"min-procs" => 1,
"max-procs" => 1,
"idle-timeout" => 20
))
)
`<var class="filename">bin-path</var>` 指令允許 lighttpd 動態產生 FastCGI 程序。PHP 將根據 `<var class="envar">PHP_FCGI_CHILDREN</var>` 環境變數產生子程序。`<code class="literal">bin-environment</code>` 指令設定產生程序的環境。當處理的請求數量達到 `<var class="envar">PHP_FCGI_MAX_REQUESTS</var>` 指定的值時,PHP 將會終止子程序。對於 PHP 而言,通常應避免使用 `<code class="literal">min-procs</code>` 和 `<code class="literal">max-procs</code>` 指令。PHP 會自行管理其子程序,而且像 APC 這樣的 opcode 快取機制只會在 PHP 管理的子程序之間共享。如果將 `<code class="literal">min-procs</code>` 設定為大於 `<code class="literal">1</code>` 的值,則 php 回應程序的總數將會乘以 `<var class="envar">PHP_FCGI_CHILDREN</var>` 的值(例如 2 個 min-procs * 16 個子程序將會產生 32 個回應程序)。
Lighttpd 提供了一個名為 spawn-fcgi 的程式,可以簡化產生 FastCGI 程序的過程。
雖然需要一些額外的工作,但也可以在不使用 spawn-fcgi 的情況下產生程序。設定 `<var class="envar">PHP_FCGI_CHILDREN</var>` 環境變數可以控制 PHP 將產生多少子程序來處理傳入的請求。設定 `<var class="envar">PHP_FCGI_MAX_REQUESTS</var>` 將決定每個子程序的存活時間(以請求數量計算)。以下是一個簡單的 bash 腳本來協助產生 php 回應程序。
範例 #2 產生 FastCGI 回應程序
#!/bin/sh
# Location of the php-cgi binary
PHP=/usr/local/bin/php-cgi
# PID File location
PHP_PID=/tmp/php.pid
# Binding to an address
#FCGI_BIND_ADDRESS=10.0.1.1:10000
# Binding to a domain socket
FCGI_BIND_ADDRESS=/tmp/php.sock
PHP_FCGI_CHILDREN=16
PHP_FCGI_MAX_REQUESTS=10000
env -i PHP_FCGI_CHILDREN=$PHP_FCGI_CHILDREN \
PHP_FCGI_MAX_REQUESTS=$PHP_FCGI_MAX_REQUESTS \
$PHP -b $FCGI_BIND_ADDRESS &
echo $! > "$PHP_PID"
FastCGI 執行個體可以產生在多台遠端機器上,以便擴展應用程式。
範例 #3 連線到遠端 php-fastcgi 執行個體
fastcgi.server = ( ".php" =>
(( "host" => "10.0.0.2", "port" => 1030 ),
( "host" => "10.0.0.3", "port" => 1030 ))
)