1、什麼是 FastCGI php
FastCGI是一個可伸縮地、高速地在HTTP server和動態腳本語言間通訊的接口。多數流行的HTTP server都支持FastCGI,包括Apache、Nginx和lighttpd等,同時,FastCGI也被許多腳本語言所支持,其中就有PHP。圖1 Nginx+FastCGI運行原理 html
前面介紹過,FastCGI接口方式在腳本解析服務器上啓動一個或者多個守護進程對動態腳本進行解析,這些進程就是FastCGI進程管理器,或者稱之爲FastCGI引擎, spawn-fcgi與PHP-FPM就是支持PHP的兩個FastCGI進程管理器。
下面簡單介紹spawn-fcgi與PHP-FPM的異同。 前端
spawn-fcgi是HTTP服務器lighttpd的一部分,目前已經獨立成爲一個項目,通常與lighttpd配合使用來支持PHP,可是ligttpd的spwan-fcgi在高併發訪問的時候,會出現內存泄漏甚至自動重啓FastCGI的問題。 nginx
Nginx是個輕量級的HTTP server,必須藉助第三方的FastCGI處理器才能夠對PHP進行解析,所以Nginx+spawn-fcgi的組合也能夠實現對PHP的解析,這裏不過多講述。 c++
PHP-FPM也是一個第三方的FastCGI進程管理器,它是做爲PHP的一個補丁來開發的,在安裝的時候也須要和PHP源碼一塊兒編譯,也就是說PHP-FPM被編譯到PHP內核中,所以在處理性能方面更加優秀;同時它在處理高併發方面也比spawn-fcgi引擎好不少,所以,推薦Nginx+PHP/PHP-FPM這個組合對PHP進行解析。 web
FastCGI 的主要優勢是把動態語言和HTTP Server分離開來,因此Nginx與PHP/PHP-FPM常常被部署在不一樣的服務器上,以分擔前端Nginx服務器的壓力,使Nginx專注處理靜態請求和轉發動態請求,而PHP/PHP-FPM服務器專注解析PHP動態請求。 後端
gcc gcc-c++ libxml2 libxml2-devel autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel
因爲各個Linux系統版本的不肯定性,讀者也能夠在安裝PHP過程當中,根據錯誤提示信息,安裝對應的軟件庫。 瀏覽器
[root@localhost local]#tar zxvf php-5.2.13.tar.gz [root@localhost local]#gzip -cd php-5.2.13-fpm-0.5.13.diff.gz | patch -d php-5.2.13 -p1 [root@localhost local]#cd php-5.2.13 [root@localhost php-5.2.13]#./configure --prefix=/usr/local/php --enable-fastcgi --enable-fpm [root@localhost php-5.2.13]#make [root@localhost php-5.2.13]#make install [root@localhost php-5.2.13]cp php.ini-dist /usr/local/php/lib/php.ini
其中,第二步將PHP-FPM做爲補丁加入PHP源碼中。
在「./configure」編譯選項中,指定將PHP安裝到/usr/local下,「--enable-fastcgi」是啓用對PHP的FastCGI支持,「--enable-fpm」是激活對FastCGI模式的fpm支持。
在編譯PHP時能夠加入不少編譯選項,可是這裏爲了介紹PHP的FastCGI功能沒有加入更多的編譯選項。 緩存
根據上面指定的安裝路徑,PHP-FPM的默認配置文件爲/usr/local/php/etc/php-fpm.conf。
php-fpm.conf是一個XML格式的純文本文件,其內容很容易看明白。這裏重點介紹幾個重要的配置標籤:
安全
標籤listen_address是配置fastcgi進程監聽的IP地址以及端口,默認是127.0.0.1:9000。
<value name="listen_address">127.0.0.1:9000</value>
標籤display_errors用來設置是否顯示PHP錯誤信息,默認是0,不顯示錯誤信息,設置爲1能夠顯示PHP錯誤信息。
<value name="display_errors">0</value>
標籤user和group用於設置運行FastCGI進程的用戶和用戶組。須要注意的是,這裏指定的用戶和用戶組要和Nginx配置文件中指定的用戶和用戶組一致。
<value name="user">nobody</value>
<value name="group">nobody</value>
標籤max_children用於設置FastCGI的進程數。根據官方建議,小於2GB內存的服務器,能夠只開啓64個進程,4GB以上內存的服務器能夠開啓200個進程。
<value name="max_children">5</value>
標籤request_terminate_timeout用於設置FastCGI執行腳本的時間。默認是0s,也就是無限執行下去,能夠根據狀況對其進行修改。
<value name="request_terminate_timeout">0s</value>
標籤rlimit_files用於設置PHP-FPM對打開文件描述符的限制,默認值爲1024。這個標籤的值必須和Linux內核打開文件數關聯起來,例如要將此值設置爲65535,就必須在Linux命令行執行'ulimit -HSn 65536'。
<value name="rlimit_files">1024</value>
標籤max_requests指明瞭每一個children最多處理多少個請求後便會被關閉,默認的設置是500。
<value name="max_requests">500</value>
標籤allowed_clients用於設置容許訪問FastCGI進程解析器的IP地址。若是不在這裏指定IP地址,Nginx轉發過來的PHP解析請求將沒法被接受。
<value name="allowed_clients">127.0.0.1</value>
/usr/local/php/bin/php-cgi --fpm 或者 /usr/local/php/sbin/php-fpm start
建議採用第二種方式啓動FastCGI進程。
/usr/local/php/sbin/php-fpm還有其餘參數,具體爲start|stop|quit|restart|reload|logrotate。
每一個啓動參數的含義以下:
start,啓動PHP的FastCGI進程。 stop,強制終止PHP的FastCGI進程。 quit,平滑終止PHP的FastCGI進程。 restart, 重啓PHP的FastCGI進程。 reload, 從新加載PHP的php.ini。 logrotate, 從新啓用log文件。
reload是個很重要的參數,它能夠在PHP的FastCGI進程不中斷的狀況下從新加載改動過的php.ini,所以經過php-fpm能夠平滑變動FastCGI模式下的PHP設置。
在FastCGI進程啓動後,其監聽的IP地址和端口也隨即啓動,能夠經過ps和netstat查看相關信息。
[root@localhost php]# netstat -antl|grep 9000 tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN [root@localhost php]# ps -ef|grep php-cgi root 3567 1 0 17:06 ? 00:00:00 /usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/php-fpm.conf nobody 3568 3567 0 17:06 ? 00:00:00 /usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/php-fpm.conf nobody 3569 3567 0 17:06 ? 00:00:00 /usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/php-fpm.conf nobody 3570 3567 0 17:06 ? 00:00:00 /usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/php-fpm.conf nobody 3571 3567 0 17:06 ? 00:00:00 /usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/php-fpm.conf nobody 3572 3567 0 17:06 ? 00:00:00 /usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/php-fpm.conf root 3583 3524 0 17:09 pts/1 00:00:00 grep php-cgi
server { include port.conf; server_name www.ixdba.net ixdba.net; location / { index index.html index.php; root /web/www/www.ixdba.net; } location ~ \.php$ { root html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME html$fastcgi_script_name; include fastcgi_params; } }
經過location指令,將全部以php爲後綴的文件都交給127.0.0.1:9000來處理,而這裏的IP地址和端口就是FastCGI進程監聽的IP地址和端口。
fastcgi_param指令指定放置PHP動態程序的主目錄,也就是$fastcgi_script_name前面指定的路徑,這裏是/usr/local/nginx/html目錄,建議將這個目錄與Nginx虛擬主機指定的根目錄保持一致,固然也能夠不一致。
fastcgi_params文件是FastCGI進程的一個參數配置文件,在安裝Nginx後,會默認生成一個這樣的文件,這裏經過include指令將FastCGI參數配置文件包含了進來。
接下來,啓動nginx服務。
/usr/local/nginx/sbin/nginx
到此爲止,Nginx+PHP已經配置完成。
fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m; fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 128k; fastcgi_cache TEST; fastcgi_cache_valid 200 302 1h; fastcgi_cache_valid 301 1d; fastcgi_cache_valid any 1m;
下面是對上述代碼的含義進行介紹。
第一行代碼是爲FastCGI緩存指定一個文件路徑、目錄結構等級、關鍵字區域存儲時間和非活動刪除時間。
fastcgi_connect_timeout指定鏈接到後端FastCGI的超時時間。
fastcgi_send_timeout指定向FastCGI傳送請求的超時時間,這個值是已經完成兩次握手後向FastCGI傳送請求的超時時間。
fastcgi_read_timeout指定接收FastCGI應答的超時時間,這個值是已經完成兩次握手後接收FastCGI應答的超時時間。
fastcgi_buffer_size用於指定讀取FastCGI應答第一部分須要用多大的緩衝區,這個值表示將使用1個64KB的緩衝區讀取應答的第一部分(應答頭),能夠設置爲fastcgi_buffers選項指定的緩衝區大小。
fastcgi_buffers指定本地須要用多少和多大的緩衝區來緩衝FastCGI的應答請求。若是一個PHP腳本所產生的頁面大小爲256KB,那麼會爲其分配4個64KB的緩衝區來緩存;若是頁面大小大於256KB,那麼大於256KB的部分會緩存到fastcgi_temp指定的路徑中,可是這並非好方法,由於內存中的數據處理速度要快於硬盤。通常這個值應該爲站點中PHP腳本所產生的頁面大小的中間值,若是站點大部分腳本所產生的頁面大小爲256KB,那麼能夠把這個值設置爲「16 16k」、「4 64k」等。
fastcgi_busy_buffers_size的默認值是fastcgi_buffers的兩倍。
fastcgi_temp_file_write_size表示在寫入緩存文件時使用多大的數據塊,默認值是fastcgi_buffers的兩倍。
fastcgi_cache表示開啓FastCGI緩存併爲其指定一個名稱。開啓緩存很是有用,能夠有效下降CPU的負載,而且防止502錯誤的發生,可是開啓緩存也會引發不少問題,要視具體狀況而定。
fastcgi_cache_valid、fastcgi用來指定應答代碼的緩存時間,實例中的值表示將200和302應答緩存一個小時,將301應答緩存1天,其餘應答均緩存1分鐘。
nginx實踐筆記