在 Ubuntu 10.10 (Maverick) 架設 Nginx + PHP FastCGI

logo-Ubuntu
今天來筆記如何在 Ubuntu 底下完整安裝 Nginx + PHP FastCGI,以及了解 Nginx 基本設定。我想大家都知道 Apache 是一個很好的 Web Server 伺服器,也常常用在個人網站,或者一般小型專案,網路上也有一堆懶人包,如 Appserv, Xampp,對於新手入門來說 Apache 是一個很好的選擇,但是您會發現用了 Apache 後,系統記憶體常常飆高 XD,載入太多額外不必要的模組,所以非常肥大,那這次就來嘗試另外一套 Web 伺服器 Nginx 吧。

安裝套件

Ubuntu 可以透過 apt-get 方式安裝
$ apt-get update
$ apt-get upgrade
$ apt-get install nginx php5-cli php5-cgi spawn-fcgi psmisc
PHP CGI binary 能自行執行在 Fast CGI Interface 上面,並不需要額外安裝任何程式。只需要安裝 php-cgi 套件 aptitude install php5-cgi,接著執行 php-cgi -b 127.0.0.1:9000 就完成了。你會發現 local 端用 PHP 跑起一個 FastCGI interface 服務,透過 Nginx 的 fastcgi_pass 127.0.0.1:9000; 就可以跟 FastCGI 做溝通。

開機自動執行 PHP FastCGI

建立 PHP FastCGI 開機啟動 Script,首先打開 /etc/init.d/php-fcgi (如果無此檔案,請用 touch 方式產生),將底下 shell script 程式碼放入
#!/bin/bash
BIND=127.0.0.1:9000
USER=www-data
PHP_FCGI_CHILDREN=15
PHP_FCGI_MAX_REQUESTS=1000

PHP_CGI=/usr/bin/php5-cgi
PHP_CGI_NAME=`basename $PHP_CGI`
PHP_CGI_ARGS="- USER=$USER PATH=/usr/bin PHP_FCGI_CHILDREN=$PHP_FCGI_CHILDREN PHP_FCGI_MAX_REQUESTS=$PHP_FCGI_MAX_REQUESTS $PHP_CGI -b $BIND"
RETVAL=0

start() {
      echo -n "Starting PHP FastCGI: "
      start-stop-daemon --quiet --start --background --chuid "$USER" --exec /usr/bin/env -- $PHP_CGI_ARGS
      RETVAL=$?
      echo "$PHP_CGI_NAME."
}
stop() {
      echo -n "Stopping PHP FastCGI: "
      killall -q -w -u $USER $PHP_CGI
      RETVAL=$?
      echo "$PHP_CGI_NAME."
}

case "$1" in
    start)
      start
  ;;
    stop)
      stop
  ;;
    restart)
      stop
      start
  ;;
    *)
      echo "Usage: php-fcgi {start|stop|restart}"
      exit 1
  ;;
esac
exit $RETVAL
存檔後,請修改此檔案權限,讓其他使用者可以執行程式。
chmod +x /etc/init.d/php-fcgi
透過底下方式,可以隨時啟動或關閉 PHP FastCGI
# start the fast cgi
/etc/init.d/php-fcgi start
# stop the fast cgi
/etc/init.d/php-fcgi stop
# restart fast cgi
/etc/init.d/php-fcgi restart
加入開機自動執行
update-rc.d php-fcgi defaults

編輯 Nginx 設定檔

Nginx 設定檔目錄在 /etc/nginx/,我們打開設定檔 nginx.conf
user www-data;
worker_processes  1;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
    # multi_accept on;
}

http {
    include       /etc/nginx/mime.types;

    access_log	/var/log/nginx/access.log;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;
    tcp_nodelay        on;

    gzip  on;
    gzip_disable "MSIE [1-6]\.(?!.*SV1)";

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}
此檔案不需要更動,我們可以看到最後一行有 include /etc/nginx/sites-enabled/*,這就是 Nginx Virtual Host 設定檔位置,預設會有一個 default 設定,如果需要建立其它 domain,我們就可以複製此檔案即可。底下會帶大家如何設定 Nginx + PHP FastCGI,直接打開 default,加底下設定值寫到檔案即可
location ~ \.php {
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    include /etc/nginx/fastcgi_params;
    keepalive_timeout 0;
    fastcgi_param SCRIPT_FILENAME /var/www$fastcgi_script_name;
}
注意看到 fastcgi_pass 就是用 TCP 方式跟 PHP FastCGI 溝通,另外網頁目錄也是需要設定
location / {
    root   /var/www;
    index  index.php index.html index.htm;
}
設定完成後,重新啟動 Nginx
/etc/init.d/nginx restart
打開 /var/www/phpinfo.php 裡面寫入
看到 PHP 設定值畫面就代表架設成功。另外可以用 /etc/init.d/nginx configtest 檢查 Nginx 設定檔是否正確,如果要新開虛擬網站,請透過底下方式建立
# 建立目錄
mkdir /var/www/www.example.com
# 建立設定檔
cp /etc/nginx/sites-available/default /etc/nginx/sites-available/example.com
# 連結
ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com
# 重新啟動伺服器
/etc/init.d/php-fcgi start
/etc/init.d/nginx restart

出現 No input file specified.

請注意網站設定檔是否設定錯誤
fastcgi_param SCRIPT_FILENAME /var/www$fastcgi_script_name;
上面請務必設定正確,根據不同的根目錄,請自行修改 /var/www 這部份 其他參考網站: PHP FastCGI with nginx on Ubuntu 架設 Nginx + PHP FastCGI 於 Ubuntu Linux 10.04 Nginx and PHP-FastCGI on Ubuntu 10.10 (Maverick) 官方 Wiki: PHPFcgiExample (必看) 官方 Wiki: Configuration