什麼是php-fpm?以下這篇帶大家了解一下php-fpm,介紹一下優化 php-fpm 時我們到底要優化什麼,希望對大家有幫助!
什麼是php-fpm?如何進行優化來提升效能?是無所不在的,可以說是網路 Web 應用上使用最廣泛的語言。
然而,它的高效能並不為人所知,尤其是在涉及高並發系統時。這就是為什麼對於這樣特殊的用例,正在被 Node (是的,我知道,它不是一種語言)、Go 和 Elixir 等語言接管。
也就是說,您可以做很多事情來改進伺服器上的 什麼是php-fpm?如何進行優化來提升效能? 效能。本文主要關注 php-fpm
方面的內容,如果您使用Nginx,這是在伺服器上的預設配置。
如果你知道 php-fpm
是什麼,請直接跳到最佳化部分。
許多開發人員對DevOps 方面的知識不太感興趣,即使是那些對此感興趣的開發人員,也極少有人知道它的底層原理。有趣的是,當瀏覽器發送一個請求到運行 什麼是php-fpm?如何進行優化來提升效能? 的伺服器上時,什麼是php-fpm?如何進行優化來提升效能? 也不是最先進行處理請求的服務;而是,HTTP 伺服器,Apache 和 Nginx 是其中最主要的兩個。 「web 伺服器」決定如何與 什麼是php-fpm?如何進行優化來提升效能? 進行通信,然後傳遞請求的類型,資料和頭部資訊到 什麼是php-fpm?如何進行優化來提升效能? 進程。
上圖是什麼是php-fpm?如何進行優化來提升效能? 專案的請求-回應生命週期(圖片來源: ProinerTech)
在現代什麼是php-fpm?如何進行優化來提升效能? 應用中,「find file」部分即為index.php
文件,它是在伺服器設定檔中配置的用於處理所有請求的代理。
如今,Web 伺服器究竟如何連接 什麼是php-fpm?如何進行優化來提升效能? 正在進化,如果我們要深入研究所有細節,這篇文章的長度將會激增。但粗略來說, 在 Apache 作為 Web 伺服器首選的時間段,什麼是php-fpm?如何進行優化來提升效能? 是作為包含在伺服器內部的模組。
所以每當一個請求被接收,伺服器將開啟一個新的進程, 它將自動包含 什麼是php-fpm?如何進行優化來提升效能? 和執行請求。這個方法被稱為mod_php
,「什麼是php-fpm?如何進行優化來提升效能?作為一個模組」的縮寫。這種方法有其局限性,而 Nginx 和 php-fpm
克服了它。
在php-fpm
中,管理 什麼是php-fpm?如何進行優化來提升效能? 的責任在於伺服器內部的 什麼是php-fpm?如何進行優化來提升效能? 程式。換言之, Web 伺服器 (Nginx, 在本例中), 不在乎 什麼是php-fpm?如何進行優化來提升效能? 在哪和怎樣運行的,只要它知道如何發送和接收資料即可。如果需要,在這種情況下,您可以將什麼是php-fpm?如何進行優化來提升效能?視為另一台伺服器,它管理傳入請求的某些子什麼是php-fpm?如何進行優化來提升效能?進程(因此,我們將請求送到伺服器,該請求由伺服器接收並傳遞到伺服器— —太瘋狂了!:-P)。
如果你用過Nginx
,你會看到這些程式碼:
location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/run/php/php7.2-fpm.sock; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; }
對於這一行:fastcgi_pass unix:/run/php/php7.2 -fpm.sock;
,它告訴Nginx透過 php7.2-fpm.sock
的socket
與php進程通訊。因此,對於每個傳入的請求,Nginx都透過這個檔案寫入數據,在接收輸出後,將其發送回瀏覽器。
我必須再次強調,對於如何運行這不是最完整或最準確的,但對於大多數 DevOps 任務是完全準確的。
除此之外,讓我們回顧一下到目前為止所學到的東西:
流程圖如下:
什麼是php-fpm?如何進行優化來提升效能? 和 Nginx 如何協同工作? (圖片來源:資料狗)
到目前為止都不錯, 那麼關鍵問題來了:什麼是php-fpm?如何進行優化來提升效能?-FPM到底是什麼呢?
什麼是php-fpm?如何進行優化來提升效能? 中的FPM
代表「快速進程管理器」, 花式解釋就是說,在伺服器上運行的什麼是php-fpm?如何進行優化來提升效能? 並不是單一進程,而是由這個FPM 進程管理器派生、控制和終止的一些什麼是php-fpm?如何進行優化來提升效能? 進程。 web伺服器將請求傳遞給的就是這個進程管理器。
什麼是php-fpm?如何進行優化來提升效能?-FPM 本身就是一個完整的兔子洞,所以如果您願意,可以隨意探索,但是對於我們的目的,這些解釋就足夠啦。 ?
一般在正常運作的情況下,為什麼要考慮最佳化呢?為什麼不將事物保持原樣。
具有讽刺意味的是,一般我为大多数用例提供建议的话。 如果您的设置运行良好,并且没有特殊用例,请使用默认设置。 但是,如果您希望扩展一台机器之外的能力,那么从一台机器中挤出最大的处理能力是必不可少的,因为它可以将您服务器的花费减少一半(甚至更多!)。
要说明的另一件事情是,Nginx是为处理巨大的工作负载而构建的。 它能够同时处理成千上万的连接,但是如果您的什麼是php-fpm?如何進行優化來提升效能?设置不合理,那么您将浪费很多资源,因为Nginx必须等待什麼是php-fpm?如何進行優化來提升效能?完成当前处理之后才可以接受下一个请求,最终Nginx不能为您的服务提供任何优势!
所以,接下来让我们看看尝试优化 php-fpm
时我们到底要优化什么。
php-fpm
的配置文件在不同服务器上的位置可能不同,因此您需要做一些调查来确定它的位置。在 UNIX 上,你可以使用 find 命令。在我的 Ubuntu 上,它的路径是 /etc/php/7.2/fpm/php-fpm.conf
。当然,7.2是我正在运行的 什麼是php-fpm?如何進行優化來提升效能? 版本。
下面是这个文件的前几行代码:
;;;;;;;;;;;;;;;;;;;;; ; FPM Configuration ; ;;;;;;;;;;;;;;;;;;;;; ; All relative paths in this configuration file are relative to 什麼是php-fpm?如何進行優化來提升效能?'s install ; prefix (/usr). This prefix can be dynamically changed by using the ; '-p' argument from the command line. ;;;;;;;;;;;;;;;;;; ; Global Options ; ;;;;;;;;;;;;;;;;;; [global] ; Pid file ; Note: the default prefix is /var ; Default Value: none pid = /run/php/php7.2-fpm.pid ; Error log file ; If it's set to "syslog", log is sent to syslogd instead of being written ; into a local file. ; Note: the default prefix is /var ; Default Value: log/php-fpm.log error_log = /var/log/php7.2-fpm.log
很明显:这一行 pid = /run/php/php7.2-fpm.pid
告诉我们哪个文件包含了 php-fpm
进程的进程 id。
我们还看到 /var/log/php7.2-fpm.log
是 php-fpm
存储日志的地方。
在这个文件中,像下面这样添加三个变量:
emergency_restart_threshold 10 emergency_restart_interval 1m process_control_timeout 10s
前两个设置是警告性的,它们告诉 php-fpm
进程,如果10个子进程在一分钟内失败,主 php-fpm
进程应该重新启动自己。
这听起来可能不够稳健,但是 什麼是php-fpm?如何進行優化來提升效能? 是一个短暂的进程,它会泄漏内存,所以在出现高故障时重新启动主进程可以解决很多问题。
第三个选项是 process_control_timeout
,它告诉子进程在执行从父进程接收到的信号之前需要等待这么长的时间。这个设置是非常有用的。例如,当父进程发送终止信号时,子进程正在处理某些事情的时候。十秒的时间,他们会有一个更好的机会完成任务并且优雅地退出。
令人惊讶的是,这 不是 php-fpm 的核心配置!这是因为,为了 web 请求服务,php-fpm
创建了一个新的进程池,它将具有一个单独的配置。在我的例子中,进程池的名称是 www
,我想编辑的文件是 /etc/php/7.2/fpm/pool.d/www.conf
。
让我们来看看文件的内容:
; Start a new pool named 'www'. ; the variable $pool can be used in any directive and will be replaced by the ; pool name ('www' here) [www] ; Per pool prefix ; It only applies on the following directives: ; - 'access.log' ; - 'slowlog' ; - 'listen' (unixsocket) ; - 'chroot' ; - 'chdir' ; - 'php_values' ; - 'php_admin_values' ; When not set, the global prefix (or /usr) applies instead. ; Note: This directive can also be relative to the global prefix. ; Default Value: none ;prefix = /path/to/pools/$pool ; Unix user/group of processes ; Note: The user is mandatory. If the group is not set, the default user's group ; will be used. user = www-data group = www-data
快速浏览一下上面代码片段的末尾,您就会明白为什么服务器进程以 www-data
的形式运行了。如果您在设置网站时遇到文件权限问题,您可能要将目录的所有者或组更改为 www-data
,从而允许什麼是php-fpm?如何進行優化來提升效能?进程写入日志文件和上传文档等。
最后,我们到达了问题的根源,流程管理器 (pm) 设置。一般情况下,默认值是这样的:
pm = dynamic pm.max_children = 5 pm.start_servers = 3 pm.min_spare_servers = 2 pm.max_spare_servers = 4 pm.max_requests = 200
那么,这里的 「dynamic(动态)」是什么意思呢?我认为官方文档最好地解释了这一点(我的意思是,这应该已经是您正在编辑的文件的一部分,但是我在这里复制了它,以防它不是):
; Choose how the process manager will control the number of child processes. ; Possible Values: ; static - a fixed number (pm.max_children) of child processes; ; dynamic - the number of child processes are set dynamically based on the ; following directives. With this process management, there will be ; always at least 1 children. ; pm.max_children - the maximum number of children that can ; be alive at the same time. ; pm.start_servers - the number of children created on startup. ; pm.min_spare_servers - the minimum number of children in 'idle' ; state (waiting to process). If the number ; of 'idle' processes is less than this ; number then some children will be created. ; pm.max_spare_servers - the maximum number of children in 'idle' ; state (waiting to process). If the number ; of 'idle' processes is greater than this ; number then some children will be killed. ; ondemand - no children are created at startup. Children will be forked when ; new requests will connect. The following parameter are used: ; pm.max_children - the maximum number of children that ; can be alive at the same time. ; pm.process_idle_timeout - The number of seconds after which ; an idle process will be killed. ; Note: This value is mandatory.
由此可见,有三个可用值:
php-fpm
在任何给定时间点会保持活动的最小以及最大进程数量。那这些设置有什么影响呢?
简而言之,如果你有个小流量的网站,“dynamic”设置在大多数时间内都是一种资源的浪费。假设你的pm.min_spare_servers
设置成了3,那会有三个什麼是php-fpm?如何進行優化來提升效能?进程会被创建并保持运行,甚至是网站没有流量时。这种情况下,“ondemand” 就是个更好的选择, 可以让系统决定何时启动新的进程。
另一方面, 大流量 或者必须快速响应的网站将在这种情况下被惩罚。 最好避免创建新的 什麼是php-fpm?如何進行優化來提升效能? 进程的额外开销,使其成为池的一部分并对其进行监控。
使用 pm = static
固定子进程的数量,使最大的系统资源用于服务请求而不是管理 什麼是php-fpm?如何進行優化來提升效能?。假如你确定走这条路,注意它有其指导方针和陷阱.关于它的一篇相当密集但非常有用的文章是 这篇 。
写在最后
由于有关网络性能的文章可能会引发争论或使人们感到困惑,因此在结束本文之前,我觉得需要讲几句话。 性能调优既涉及系统知识,也涉及猜测和技巧。
即使您完全了解 php-fpm
的所有設置,也無法保證成功。如果您不了解 php-fpm
的存在,那麼您就不必浪費時間擔心它。繼續做您已經在做的事情並繼續下去。
同時,盡可能不讓結果變得很戲劇性。是的,您可以透過從頭開始重新編譯 什麼是php-fpm?如何進行優化來提升效能? 並刪除所有不需要的模組來獲得更好的效能,但這種方法在生產環境中不夠明智。優化某些內容的整個想法是查看您的需求是否與預設值不同(它們很少這樣做!),並根據需要進行較小的更改。
原文網址:https://geekflare.com/php-fpm-optimization/
翻譯網址:https://learnku.com/php/t/34358
推薦:《什麼是php-fpm?如何進行優化來提升效能?影片教學》
以上是什麼是php-fpm?如何進行優化來提升效能?的詳細內容。更多資訊請關注PHP中文網其他相關文章!