首先先理解一下 CGI 、FASTCGI 、PHP-FPM的概念php
CGI 是用來接收HTTP請求的一個程序,例如[127.0.0.1/index.php?c=article&id=11,這個請求經過apahce、nginx等等過來,而後http服務器發送給php-cgi(就是php用來接收http的程序),這個玩意兒每次新建一個進程的時候都要讀取和加載php.ini的一堆參數,而後才能開始接收請求,比較慢。nginx
FASTCGI的工做原理是首先啓動一個master,這個master加載了全部的配置信息等等,master會新建不少個worker,而後每次有請求的時候master負責把請求分配給相應的worker,這樣避免了重複加載和啓動,就是一個提交cgi程序效能的東西,fastcgi這個東西只是一個協議(你能夠理解爲是一個沒實現的想法),並非一個程序。apache
PHP-FPM就是實現這個想法的程序,CGI很蠢,不會管理進程,而PHP-FPM會根據實際狀況,建立worker或者關掉worker進程,保持必定量的worker,請求多了,worker就多了,請求少了,worker就會被關掉一部分,你能夠理解爲它是一個高效CGI的進程管理器。服務器
——————————————————————————————————————————————————————————————————————————————————————————————————php-fpm
修改 /usr/local/php/etc 目錄下的php-fpm.conf文件性能
手動啓動 php-fpm
[root@user]#/usr/local/php/sbin
[root@user]#./php-fpm優化
一、php-fpm優化參數介紹
他們分別是:pm、pm.max_children、pm.start_servers、pm.min_spare_servers、pm.max_spare_servers。網站
pm:表示使用那種方式,有兩個值能夠選擇,就是static(靜態)或者dynamic(動態)。
在更老一些的版本中,dynamic被稱做apache-like。這個要注意看配置文件的說明。spa
———————————————————————————————————.net
pm = dynamic
pm.max_children:靜態方式下開啓的php-fpm進程數量
pm.start_servers:動態方式下的起始php-fpm進程數量
pm.min_spare_servers:動態方式下的最小php-fpm進程數
pm.max_spare_servers:動態方式下的最大php-fpm進程數量
———————————————————————————————————
區別:
若是dm設置爲 static,那麼其實只有pm.max_children這個參數生效。系統會開啓設置數量的php-fpm進程。
若是dm設置爲 dynamic,那麼pm.max_children參數失效,後面3個參數生效。
系統會在php-fpm運行開始 的時候啓動pm.start_servers個php-fpm進程,
而後根據系統的需求動態在pm.min_spare_servers和pm.max_spare_servers之間調整php-fpm進程數
——————————————————————————————————————————————————————————————————————
php-fpm.conf有兩個相當重要的參數,一個是」max_children」,另外一個是」request_terminate_timeout」
像這種全php的網站,每一個鏈接都須要apache+php-fpm協同運做。即使php-fpm中的request_terminate_timeout時間設置很長,apache中的timeout時間設置略短,只要apache的timeout到了,php-fpm照樣在後面殺進程……
若是網站的訪問者比較多,php-fpm的child是被許多訪問者共用的,殺一個child,就有可能致使幾個用戶同時http 503 Service Unavailable。因此,個人建議是——php-fpm中的request_terminate_timeout最好不要設置,只給apache一個timeout就夠了。
——————————————————————————————————————————————————————————————————————
個人兩個設置的值一個是」40″,一個是」900″,可是這個值不是通用的,而是須要本身計算的。
計算的方式以下:
若是你的服務器性能足夠好,且寬帶資源足夠充足,PHP腳本沒 有系循環或BUG的話你能夠直接將」request_terminate_timeout」設置成0s。0s的含義是讓PHP-CGI一直執行下去而沒有 時間限制。而若是你作不到這一點,也就是說你的PHP-CGI可能出現某個BUG,或者你的寬帶不夠充足或者其餘的緣由致使你的PHP-CGI可以假死那 麼就建議你給」request_terminate_timeout」賦一個值,這個值能夠根據你服務器的性能進行設定。通常來講性能越好你能夠設置越 高,20分鐘-30分鐘均可以。因爲個人服務器PHP腳本須要長時間運行,有的可能會超過10分鐘所以我設置了900秒,這樣不會致使PHP-CGI死掉 而出現502 Bad gateway這個錯誤。
而」max_children」這個值又是怎麼計算出來的呢?這個值原則上是越大越好,php-cgi的進程多 了就會處理的很快,排隊的請求就會不多。設置」max_children」也須要根據服務器的性能進行設定,通常來講一臺服務器正常狀況下每個php- cgi所耗費的內存在20M左右,所以個人」max_children」我設置成40個,20M*40=800M也就是說在峯值的時候全部PHP-CGI 所耗內存在800M之內,低於個人有效內存1Gb。而若是個人」max_children」設置的較小,好比5-10個,那麼php-cgi就會「很 累」,處理速度也很慢,等待的時間也較長。若是長時間沒有獲得處理的請求就會出現504 Gateway Time-out這個錯誤,而正在處理的很累的那幾個php-cgi若是遇到了問題就會出現502 Bad gateway這個錯誤。
—————————————————————————————————————————————————————————————————————————————————————————————————————
php-fpm.conf 示例文件
[global]
pid = /usr/local/php/var/run/php-fpm.pid
error_log = /usr/local/php/var/log/php-fpm.log
log_level = notice
[www]
listen = /tmp/php-cgi.sock
listen.backlog = 2048
listen.allowed_clients = 127.0.0.1
listen.owner = www
listen.group = www
listen.mode = 0666
user = www
group = www
pm = dynamic
pm.max_children = 50
pm.start_servers = 25
pm.min_spare_servers = 5
pm.max_spare_servers = 50
request_terminate_timeout = 900
request_slowlog_timeout = 100
slowlog = var/log/slow.log
文章來源:微筆記_博客