[関連する学習の推奨事項: php グラフィック チュートリアル]
高性能最適化高性能最適化PHP-FPMとは-FPMとは は広く普及しており、インターネット Web アプリケーションで最もよく使用されていると言えます。幅広い言語。
しかし、その高いパフォーマンスは、特に同時実行性の高いシステムに関してはあまり知られていません。だからこそ、そのような特定のユースケースでは、Node (はい、言語ではないことはわかっています)、Go、Elixir などの言語に引き継がれています。
とはいえ、サーバー上の 高性能最適化高性能最適化PHP-FPMとは-FPMとは パフォーマンスを向上させるためにできることはたくさんあります。この記事は主に php-fpm
に焦点を当てています。Nginx を使用している場合、これはサーバーのデフォルト構成です。
php-fpm
が何かご存知の場合は、最適化セクションに直接ジャンプしてください。
多くの開発者は DevOps の知識にあまり興味がなく、興味があってもその基礎となる層を知っている人はほとんどいません。興味深いことに、ブラウザが 高性能最適化高性能最適化PHP-FPMとは-FPMとは を実行しているサーバーにリクエストを送信するとき、高性能最適化高性能最適化PHP-FPMとは-FPMとは がリクエストを処理する最初のサービスではなく、HTTP サーバー、Apache と Nginx が最も重要な 2 つのサービスです。 「Web サーバー」は、高性能最適化高性能最適化PHP-FPMとは-FPMとは との通信方法を決定し、リクエストのタイプ、データ、ヘッダー情報を 高性能最適化高性能最適化PHP-FPMとは-FPMとは プロセスに渡します。
上の図は、高性能最適化高性能最適化PHP-FPMとは-FPMとは プロジェクトのリクエストとレスポンスのライフ サイクルです (画像ソース: ProinerTech)
最新の 高性能最適化高性能最適化PHP-FPMとは-FPMとは アプリケーションでは、「ファイルの検索」 " の部分は index.php
ファイルで、これはすべてのリクエストを処理するためにサーバー構成ファイルで構成されたプロキシです。
Web サーバーが 高性能最適化高性能最適化PHP-FPMとは-FPMとは に接続する正確な方法は、最近進化しており、すべての詳細を掘り下げると、この記事の長さは爆発的に長くなります。しかし、大まかに言えば、Apache が Web サーバーとして選ばれていた時代には、高性能最適化高性能最適化PHP-FPMとは-FPMとは はサーバー内のモジュールとして組み込まれていました。
したがって、リクエストが受信されるたびに、サーバーは新しいプロセスを開始します。このプロセスには自動的に 高性能最適化高性能最適化PHP-FPMとは-FPMとは が含まれ、リクエストが実行されます。このメソッドは mod_php
と呼ばれ、「モジュールとしての 高性能最適化高性能最適化PHP-FPMとは-FPMとは」の略です。このアプローチには限界がありますが、Nginx と php-fpm
はそれを克服します。
php-fpm
では、高性能最適化高性能最適化PHP-FPMとは-FPMとは を管理する責任はサーバー内の 高性能最適化高性能最適化PHP-FPMとは-FPMとは プログラムにあります。言い換えれば、Web サーバー (この場合は Nginx) は、データの送受信方法を知っている限り、高性能最適化高性能最適化PHP-FPMとは-FPMとは がどこでどのように実行されているかを気にしません。この場合、必要に応じて、受信リクエストに対するサブ 高性能最適化高性能最適化PHP-FPMとは-FPMとは プロセスを管理する別のサーバーとして 高性能最適化高性能最適化PHP-FPMとは-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;
これは、php7.2-fpm.sock
の socket
を通じて 高性能最適化高性能最適化PHP-FPMとは-FPMとは プロセスと通信するように Nginx に指示します。したがって、受信リクエストごとに、Nginx はこのファイルを通じてデータを書き込み、出力を受信した後、それをブラウザーに送り返します。
これは、実行方法に関して最も完全または正確ではありませんが、ほとんどの DevOps タスクに対して完全に正確であることをもう一度強調しなければなりません。
それはさておき、これまでに学んだことを復習しましょう:
フローチャートは次のとおりです:
高性能最適化高性能最適化PHP-FPMとは-FPMとは と Nginx はどのように連携しますか? (画像出典: Data Dog)
ここまでは順調ですが、重要な質問は次のとおりです。高性能最適化高性能最適化PHP-FPMとは-FPMとは-FPM とは正確には何ですか?
FPM
高性能最適化高性能最適化PHP-FPMとは-FPMとは では「Fast」の略です。プロセス マネージャー」という派手な説明は、サーバー上で実行されている 高性能最適化高性能最適化PHP-FPMとは-FPMとは が単一のプロセスではなく、この FPM プロセス マネージャーによって派生、制御、終了される多数の 高性能最適化高性能最適化PHP-FPMとは-FPMとは プロセスであることを意味します。 Web サーバーがリクエストを渡すのはこのプロセス マネージャーです。
高性能最適化高性能最適化PHP-FPMとは-FPMとは-FPM はそれ自体がまったくのウサギの穴なので、必要に応じて自由に探索してください。ただし、私たちの目的では、これらの説明で十分です。 ?
通常、通常の操作条件では、なぜ最適化を考慮する必要があるのでしょうか?現状のままにしておいてはいかがでしょうか。
皮肉なことに、私は通常、ほとんどのユースケースに対してアドバイスを提供します。セットアップが正常に機能し、特別な使用例がない場合は、デフォルト設定を使用してください。ただし、1 台のマシンを超えた拡張を検討している場合は、1 台のマシンから最大限の処理能力を引き出すことが不可欠です。そうすることで、サーバーの支出を半分 (またはそれ以上!) に削減できるからです。
要说明的另一件事情是,Nginx是为处理巨大的工作负载而构建的。 它能够同时处理成千上万的连接,但是如果您的高性能最適化高性能最適化PHP-FPMとは-FPMとは设置不合理,那么您将浪费很多资源,因为Nginx必须等待高性能最適化高性能最適化PHP-FPMとは-FPMとは完成当前处理之后才可以接受下一个请求,最终Nginx不能为您的服务提供任何优势!
所以,接下来让我们看看尝试优化 php-fpm
时我们到底要优化什么。
php-fpm
的配置文件在不同服务器上的位置可能不同,因此您需要做一些调查来确定它的位置。在 UNIX 上,你可以使用 find 命令。在我的 Ubuntu 上,它的路径是 /etc/php/7.2/fpm/php-fpm.conf
。当然,7.2是我正在运行的 高性能最適化高性能最適化PHP-FPMとは-FPMとは 版本。
下面是这个文件的前几行代码:
;;;;;;;;;;;;;;;;;;;;; ; FPM Configuration ; ;;;;;;;;;;;;;;;;;;;;; ; All relative paths in this configuration file are relative to 高性能最適化高性能最適化PHP-FPMとは-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とは-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とは-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とは-FPMとは进程会被创建并保持运行,甚至是网站没有流量时。这种情况下,“ondemand” 就是个更好的选择, 可以让系统决定何时启动新的进程。
另一方面, 大流量 或者必须快速响应的网站将在这种情况下被惩罚。 最好避免创建新的 高性能最適化高性能最適化PHP-FPMとは-FPMとは 进程的额外开销,使其成为池的一部分并对其进行监控。
使用 pm = static
固定子进程的数量,使最大的系统资源用于服务请求而不是管理 高性能最適化高性能最適化PHP-FPMとは-FPMとは。假如你确定走这条路,注意它有其指导方针和陷阱.关于它的一篇相当密集但非常有用的文章是 这篇 。
写在最后
由于有关网络性能的文章可能会引发争论或使人们感到困惑,因此在结束本文之前,我觉得需要讲几句话。 性能调优既涉及系统知识,也涉及猜测和技巧。
即使您完全了解 php-fpm
的所有设置,也无法保证成功。 如果您不了解 php-fpm
的存在,那么您就不必浪费时间担心它。 继续做您已经在做的事情并继续下去。
同時に、結果ができるだけ劇的にならないようにしてください。はい、高性能最適化高性能最適化PHP-FPMとは-FPMとは を最初から再コンパイルし、不要なモジュールをすべて削除することでパフォーマンスを向上させることができますが、このアプローチは運用環境では十分に賢明ではありません。何かを最適化するという全体的な考え方は、ニーズがデフォルトと異なるかどうかを確認し (異なることはほとんどありません!)、必要に応じて小さな変更を加えることです。
関連する学習に関する推奨事項: php プログラミング (ビデオ)
以上が高性能最適化PHP-FPMとはの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。