PHP-FPM是一個PHP FastCGI管理器,php-fpm.conf配置文件用於控制PHP-FPM管理進程的相關參數,好比工做子進程的數量、運行權限、監聽端口、慢請求等等。
咱們在編譯安裝PHP的時,在./configure的時候帶 –enable-fpm參數便可開啓PHP-FPM。PHP-FPM配置文件爲 php-fpm.conf,其語法相似 php.ini 。通常咱們能夠在安裝目錄中找到: /usr/local/php/etc/php-fpm.conf,若是沒有的話,那就可能在 /usr/local/php/etc/php-fpm.d/.conf*。
全局配置
[global] pid = /usr/local/php/var/run/php-fpm.pid error_log = /usr/local/php/var/log/php-fpm.log log_level = notice
pid:設置PID文件的位置。php
error_log:錯誤日誌的位置nginx
log_level:錯誤級別。可用級別爲:alert(必須當即處理),error(錯誤狀況),warning(警告狀況),notice(通常重要信息),debug(調試信息)。默認:notice。laravel
進程池配置
在FPM中,可使用不一樣的設置來運行多個進程池。 這些設置能夠針對每一個進程池單獨設置,在默認的php-fpm進程池的配置文件中,開頭是[www]。
[www] listen = /tmp/php-cgi.sock listen.backlog = -1 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 = 51 pm.start_servers = 20 pm.min_spare_servers = 20 pm.max_spare_servers = 40 request_terminate_timeout = 100 request_slowlog_timeout = 0 slowlog = var/log/slow.log
listen:設置接受 FastCGI 請求的地址。可用格式爲:'ip:port','port','/path/to/unix/socket'。咱們這裏配置/tmp/php-cgi.sock,使用Unix域Socket由於不走網絡,能夠提升Nginx和php-fpm通訊的性能,但在高併發的狀況下可能不穩定,這時咱們須要設置下一個參數backlog。面試
固然你也能夠設置爲127.0.0.1:9000,但我不建議使用。據nginx.conf中的配置fastcgi_pass unix:/tmp/php-cgi.sock;設置PHP監聽,:讓Nginx支持PHP。sql
listen.backlog:設置 listen 的半鏈接隊列長度,-1表示無限制,由操做系統決定。shell
listen.allowed_clients:容許訪問FastCGI進程的IP白名單,設置any爲不限制IP,若是要設置其餘主機的nginx也能訪問這臺FPM進程,listen處要設置成本地可被訪問的IP。默認值是any。每一個地址是用逗號分隔. 若是沒有設置或者爲空,則容許任何服務器請求鏈接。我把它設置爲127.0.0.1,即只有當前設備能把請求轉發給php-fpm進程池。後端
listen.owner:運行所使用的用戶和組,咱們這裏設置爲www用戶組,權限爲 0666。服務器
listen.group:同上,設置爲www。網絡
listen.mode:同上,設置爲0666。架構
user:FPM 進程運行的系統用戶。必須設置,這裏咱們設置爲www,即非root用戶。
group:FPM 進程運行的系統用戶組。若是沒有設置,則默認用戶的組被使用。
pm:設置進程管理器如何管理子進程。可用值:static,ondemand,dynamic。dynamic表示php-fpm進程數是動態的,最開始是pm.start_servers指定的數量,若是請求較多,則會自動增長,保證空閒的進程數不小於pm.min_spare_servers,若是進程數較多,也會進行相應清理,保證多餘的進程數很少於pm.max_spare_servers。static表示php-fpm進程數是靜態的, 進程數自始至終都是pm.max_children指定的數量,再也不增長或減小。
pm.max_children:靜態方式下開啓的php-fpm進程數量,這個設置沒有絕對正確的值。通常應用的PHP進程須要消耗10~30MB內存,假設咱們使用的服務器設備爲這個PHP-FPM進程池分配1024M內存,那麼咱們能夠將這個值設置爲(1024MB內存)/(每一個進程使用20M)= 51個進程。
pm.start_servers:動態方式下的起始php-fpm進程數量,即當PHP-FPM啓動時,PHP-FPM進程池中當即可用的進程數,我通常設置這個值爲10。
pm.min_spare_servers:動態方式下的最小php-fpm進程數量,若是PHP空閒時,PHP-FPM進程池中科院存在進程數量的最小值。這個值通常與pm.start_servers設置的值同樣,因此我這裏也設置爲10。
pm.max_spare_servers:動態方式下的最大php-fpm進程數量,若是空閒進程大於此值,則進行清理。這個值設置的要比pm.start_servers大。
對於內存大的服務器(好比8G以上)來講,建議指定靜態的max_children值,由於這樣不須要進行額外的進程數目控制,會提升效率。由於頻繁開關php-fpm進程也會有時滯,因此內存夠大的狀況下開靜態效果會更好。數量也能夠根據 內存/30M 獲得,好比8GB內存能夠設置爲100,那麼php-fpm耗費的內存就能控制在 2G-3G的樣子。
若是內存稍微小點,好比1G,那麼指定靜態的進程數量更加有利於服務器的穩定。這樣能夠保證php-fpm只獲取夠用的內存,將很少的內存分配給其餘應用去使用,會使系統的運行更加暢通。
request_terminate_timeout:最大執行時間, 在php.ini中也能夠進行配置(max_execution_time),這個是用來處理由於PHP執行時間超長而報502錯誤的解決。
request_slowlog_timeout:當一個請求超過該設置的超時時間後,就會將對應的PHP調用堆棧信息完整寫入到慢日誌中。 設置爲 '0' 表示 'Off',正常生產環境中咱們把它設置爲0。
slowlog:慢請求的記錄日誌。
咱們有時候會常常飽受500,502問題困擾。當nginx收到如上錯誤碼時,能夠肯定後端php-fpm解析php出了某種問題,好比,執行錯誤,執行超時。這個時候,咱們是能夠開啓慢日誌功能的。好比設置request_slowlog_timeout:10s,當一個請求時長超過該設置的超時時間10秒後,就會將對應的PHP調用堆棧信息完整寫入到慢日誌中。 php-fpm慢日誌會記錄下進程號,腳本名稱,具體哪一個文件哪行代碼的哪一個函數執行時間過長等信息。
設置好後,執行如下命令重啓PHP-FPM主進程使配置生效。
/etc/init.d/php-fpm restart
以上內容但願幫助到你們, 不少PHPer在進階的時候總會遇到一些問題和瓶頸,業務代碼寫多了沒有方向感,不知道該從那裏入手去提高,對此我整理了一些資料,包括但不限於:分佈式架構、高可擴展、高性能、高併發、服務器性能調優、TP6,laravel,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點高級進階乾貨須要的能夠免費分享給你們 ,須要戳這裏 PHP進階架構師>>>實戰視頻、大廠面試文檔免費獲取