Apakah php-fpm? Bagaimana untuk mengoptimumkan untuk meningkatkan prestasi?

青灯夜游
Lepaskan: 2023-04-11 06:24:02
ke hadapan
10263 orang telah melayarinya

Apakah itu php-fpm? Artikel berikut akan membawa anda memahami php-fpm dan memperkenalkan perkara yang kami perlukan untuk mengoptimumkan apabila mengoptimumkan php-fpm saya harap ia akan membantu semua orang.

Apakah php-fpm? Bagaimana untuk mengoptimumkan untuk meningkatkan prestasi?

Apakah php-fpm? Bagaimana untuk mengoptimumkan untuk meningkatkan prestasi? ada di mana-mana dan boleh dikatakan sebagai bahasa yang paling banyak digunakan untuk aplikasi web Internet.

Walau bagaimanapun, prestasi tingginya tidak diketahui umum, terutamanya apabila ia berkaitan dengan sistem konkurensi tinggi. Itulah sebabnya untuk kes penggunaan khusus sedemikian, ia diambil alih oleh bahasa seperti Node (ya, saya tahu, ia bukan bahasa), Go dan Elixir.

Maksudnya, terdapat banyak perkara yang boleh anda lakukan untuk meningkatkan prestasi Apakah php-fpm? Bagaimana untuk mengoptimumkan untuk meningkatkan prestasi? pada pelayan anda. Artikel ini memfokuskan pada php-fpm, iaitu konfigurasi lalai pada pelayan jika anda menggunakan Nginx.

Jika anda tahu apa itu php-fpm, sila langkau terus ke bahagian pengoptimuman.

Apakah itu php-fpm?

Ramai pembangun tidak begitu berminat dengan pengetahuan DevOps, malah mereka yang amat sedikit yang mengetahui prinsip asasnya. Menariknya, apabila penyemak imbas menghantar permintaan kepada pelayan yang menjalankan Apakah php-fpm? Bagaimana untuk mengoptimumkan untuk meningkatkan prestasi?, Apakah php-fpm? Bagaimana untuk mengoptimumkan untuk meningkatkan prestasi? bukanlah perkhidmatan pertama untuk memproses permintaan sebaliknya, pelayan HTTP, Apache dan Nginx adalah dua yang paling penting; "Pelayan web" memutuskan cara berkomunikasi dengan Apakah php-fpm? Bagaimana untuk mengoptimumkan untuk meningkatkan prestasi? dan kemudian menghantar jenis permintaan, data dan maklumat pengepala kepada proses Apakah php-fpm? Bagaimana untuk mengoptimumkan untuk meningkatkan prestasi?.

Apakah php-fpm? Bagaimana untuk mengoptimumkan untuk meningkatkan prestasi?

Gambar di atas ialah kitaran hayat permintaan-tindak balas projek Apakah php-fpm? Bagaimana untuk mengoptimumkan untuk meningkatkan prestasi? (Sumber imej: ProinerTech)

Dalam aplikasi Apakah php-fpm? Bagaimana untuk mengoptimumkan untuk meningkatkan prestasi? moden, "find file Bahagian " ialah fail index.php, iaitu proksi yang dikonfigurasikan dalam fail konfigurasi pelayan untuk mengendalikan semua permintaan.

Tepatnya cara pelayan web menyambung ke Apakah php-fpm? Bagaimana untuk mengoptimumkan untuk meningkatkan prestasi? sedang berkembang pada masa kini, dan jika kita menyelidiki semua butiran, panjang artikel ini akan meletup. Tetapi secara kasarnya, semasa Apache menjadi pelayan web pilihan, Apakah php-fpm? Bagaimana untuk mengoptimumkan untuk meningkatkan prestasi? dimasukkan sebagai modul dalam pelayan.

Jadi apabila permintaan diterima, pelayan akan memulakan proses baharu, yang secara automatik akan mengandungi Apakah php-fpm? Bagaimana untuk mengoptimumkan untuk meningkatkan prestasi? dan melaksanakan permintaan itu. Kaedah ini dipanggil mod_php, singkatan untuk "Apakah php-fpm? Bagaimana untuk mengoptimumkan untuk meningkatkan prestasi? sebagai modul". Pendekatan ini mempunyai hadnya, dan Nginx dan php-fpm mengatasinya.

Dalam php-fpm, tanggungjawab untuk mengurus Apakah php-fpm? Bagaimana untuk mengoptimumkan untuk meningkatkan prestasi? terletak pada program Apakah php-fpm? Bagaimana untuk mengoptimumkan untuk meningkatkan prestasi? di dalam pelayan. Dalam erti kata lain, pelayan web (Nginx, dalam kes ini), tidak peduli di mana atau bagaimana Apakah php-fpm? Bagaimana untuk mengoptimumkan untuk meningkatkan prestasi? berjalan, selagi ia tahu cara menghantar dan menerima data. Jika perlu, dalam kes ini, anda boleh menganggap Apakah php-fpm? Bagaimana untuk mengoptimumkan untuk meningkatkan prestasi? sebagai pelayan lain yang menguruskan beberapa proses sub-Apakah php-fpm? Bagaimana untuk mengoptimumkan untuk meningkatkan prestasi? untuk permintaan masuk (jadi kami menghantar permintaan ke pelayan, yang diterima oleh pelayan dan dihantar ke pelayan — Sungguh gila! :- P).

Jika anda telah menggunakan Nginx, anda akan melihat kod ini:

     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;
    }
Salin selepas log masuk

Untuk baris ini: fastcgi_pass unix:/run/php/php7.2-fpm.sock;, ia memberitahu Nginx untuk lulus php7.2-fpm.sock dengan socket Komunikasi proses Apakah php-fpm? Bagaimana untuk mengoptimumkan untuk meningkatkan prestasi?. Jadi, untuk setiap permintaan yang masuk, Nginx menulis data melalui fail ini dan selepas menerima output, menghantarnya kembali ke penyemak imbas.

Saya mesti menegaskan sekali lagi bahawa ini bukanlah yang paling lengkap atau tepat tentang cara menjalankannya, tetapi ia benar-benar tepat untuk kebanyakan tugas DevOps.

Dengan itu, mari semak semula perkara yang telah kami pelajari setakat ini:

  • Apakah php-fpm? Bagaimana untuk mengoptimumkan untuk meningkatkan prestasi? tidak menerima permintaan yang dihantar secara langsung oleh penyemak imbas. Pelayan web seperti Nginx memintasnya terlebih dahulu.
  • Pelayan web tahu cara menyambung ke proses Apakah php-fpm? Bagaimana untuk mengoptimumkan untuk meningkatkan prestasi? dan menghantar semua data permintaan (tampal semua) ke Apakah php-fpm? Bagaimana untuk mengoptimumkan untuk meningkatkan prestasi?.
  • Setelah Apakah php-fpm? Bagaimana untuk mengoptimumkan untuk meningkatkan prestasi? menyelesaikan tugasnya, ia menghantar respons kembali ke pelayan web, yang kemudian menghantarnya kembali kepada klien (dalam kebanyakan kes, penyemak imbas).

Carta alir adalah seperti berikut:

Apakah php-fpm? Bagaimana untuk mengoptimumkan untuk meningkatkan prestasi?

Bagaimanakah Apakah php-fpm? Bagaimana untuk mengoptimumkan untuk meningkatkan prestasi? dan Nginx berfungsi bersama? (Sumber imej: Data Dog)

Setakat ini begitu baik, maka persoalan utamanya ialah: apakah sebenarnya Apakah php-fpm? Bagaimana untuk mengoptimumkan untuk meningkatkan prestasi?-FPM?

FPM dalam Apakah php-fpm? Bagaimana untuk mengoptimumkan untuk meningkatkan prestasi? bermaksud "Pengurusan Proses Pantas" Penjelasan yang menarik ialah Apakah php-fpm? Bagaimana untuk mengoptimumkan untuk meningkatkan prestasi? yang berjalan pada pelayan bukanlah satu proses, tetapi beberapa proses Apakah php-fpm? Bagaimana untuk mengoptimumkan untuk meningkatkan prestasi? yang dihasilkan, dikawal dan ditamatkan oleh pengurus proses FPM ini. Pengurus proses inilah yang pelayan web menghantar permintaan kepada.

Apakah php-fpm? Bagaimana untuk mengoptimumkan untuk meningkatkan prestasi?-FPM ialah lubang arnab secara keseluruhannya, jadi jangan ragu untuk menerokainya jika anda mahu, tetapi untuk tujuan kami, penjelasan ini sudah memadai. ?

Mengapa kita perlu mengoptimumkan php-fpm?

Secara amnya, dalam keadaan operasi biasa, mengapa kita perlu mempertimbangkan pengoptimuman? Kenapa tidak biarkan perkara seperti sedia ada.

具有讽刺意味的是,一般我为大多数用例提供建议的话。 如果您的设置运行良好,并且没有特殊用例,请使用默认设置。 但是,如果您希望扩展一台机器之外的能力,那么从一台机器中挤出最大的处理能力是必不可少的,因为它可以将您服务器的花费减少一半(甚至更多!)。

要说明的另一件事情是,Nginx是为处理巨大的工作负载而构建的。 它能够同时处理成千上万的连接,但是如果您的Apakah php-fpm? Bagaimana untuk mengoptimumkan untuk meningkatkan prestasi?设置不合理,那么您将浪费很多资源,因为Nginx必须等待Apakah php-fpm? Bagaimana untuk mengoptimumkan untuk meningkatkan prestasi?完成当前处理之后才可以接受下一个请求,最终Nginx不能为您的服务提供任何优势!

所以,接下来让我们看看尝试优化 php-fpm 时我们到底要优化什么。

如何优化 Apakah php-fpm? Bagaimana untuk mengoptimumkan untuk meningkatkan prestasi?-FPM ?

php-fpm 的配置文件在不同服务器上的位置可能不同,因此您需要做一些调查来确定它的位置。在 UNIX 上,你可以使用 find 命令。在我的 Ubuntu 上,它的路径是 /etc/php/7.2/fpm/php-fpm.conf 。当然,7.2是我正在运行的 Apakah php-fpm? Bagaimana untuk mengoptimumkan untuk meningkatkan prestasi? 版本。

下面是这个文件的前几行代码:

;;;;;;;;;;;;;;;;;;;;;
; FPM Configuration ;
;;;;;;;;;;;;;;;;;;;;;

; All relative paths in this configuration file are relative to Apakah php-fpm? Bagaimana untuk mengoptimumkan untuk meningkatkan prestasi?'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
Salin selepas log masuk

很明显:这一行 pid = /run/php/php7.2-fpm.pid 告诉我们哪个文件包含了 php-fpm 进程的进程 id。

我们还看到 /var/log/php7.2-fpm.logphp-fpm 存储日志的地方。

在这个文件中,像下面这样添加三个变量:

emergency_restart_threshold 10
emergency_restart_interval 1m
process_control_timeout 10s
Salin selepas log masuk

前两个设置是警告性的,它们告诉 php-fpm 进程,如果10个子进程在一分钟内失败,主 php-fpm 进程应该重新启动自己。

这听起来可能不够稳健,但是 Apakah php-fpm? Bagaimana untuk mengoptimumkan untuk meningkatkan prestasi? 是一个短暂的进程,它会泄漏内存,所以在出现高故障时重新启动主进程可以解决很多问题。

第三个选项是 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
Salin selepas log masuk

快速浏览一下上面代码片段的末尾,您就会明白为什么服务器进程以 www-data 的形式运行了。如果您在设置网站时遇到文件权限问题,您可能要将目录的所有者或组更改为 www-data,从而允许Apakah php-fpm? Bagaimana untuk mengoptimumkan untuk meningkatkan prestasi?进程写入日志文件和上传文档等。

最后,我们到达了问题的根源,流程管理器 (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
Salin selepas log masuk

那么,这里的 「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.
Salin selepas log masuk

由此可见,有三个可用值:

  • Static: 无论什么情况,都会保持一个固定的Apakah php-fpm? Bagaimana untuk mengoptimumkan untuk meningkatkan prestasi?进程数量。
  • Dynamic: 我们需要指定php-fpm在任何给定时间点会保持活动的最小以及最大进程数量。
  • ondemand: 按照需求创建和销毁进程。

那这些设置有什么影响呢?

简而言之,如果你有个小流量的网站,“dynamic”设置在大多数时间内都是一种资源的浪费。假设你的pm.min_spare_servers设置成了3,那会有三个Apakah php-fpm? Bagaimana untuk mengoptimumkan untuk meningkatkan prestasi?进程会被创建并保持运行,甚至是网站没有流量时。这种情况下,“ondemand” 就是个更好的选择, 可以让系统决定何时启动新的进程。

另一方面, 大流量 或者必须快速响应的网站将在这种情况下被惩罚。 最好避免创建新的 Apakah php-fpm? Bagaimana untuk mengoptimumkan untuk meningkatkan prestasi? 进程的额外开销,使其成为池的一部分并对其进行监控。

使用 pm = static 固定子进程的数量,使最大的系统资源用于服务请求而不是管理 Apakah php-fpm? Bagaimana untuk mengoptimumkan untuk meningkatkan prestasi?。假如你确定走这条路,注意它有其指导方针和陷阱.关于它的一篇相当密集但非常有用的文章是 这篇 。

写在最后

由于有关网络性能的文章可能会引发争论或使人们感到困惑,因此在结束本文之前,我觉得需要讲几句话。 性能调优既涉及系统知识,也涉及猜测和技巧。

Walaupun anda memahami sepenuhnya semua tetapan php-fpm, kejayaan tidak dijamin. Jika anda tidak tahu bahawa php-fpm wujud, maka anda tidak perlu membuang masa untuk membimbangkannya. Teruskan melakukan apa yang anda sudah lakukan dan teruskan.

Pada masa yang sama, cuba untuk tidak membuat keputusan sedramatik mungkin. Ya, anda boleh mendapatkan prestasi yang lebih baik dengan menyusun semula Apakah php-fpm? Bagaimana untuk mengoptimumkan untuk meningkatkan prestasi? dari awal dan mengalih keluar semua modul yang tidak diperlukan, tetapi pendekatan ini tidak cukup masuk akal dalam persekitaran pengeluaran. Keseluruhan idea untuk mengoptimumkan sesuatu adalah untuk melihat sama ada keperluan anda berbeza daripada lalai (jarang sekali!) dan buat perubahan yang lebih kecil jika perlu.

Alamat asal: https://geekflare.com/php-fpm-optimization/

Alamat terjemahan: https://learnku.com/php/t/34358

Disyorkan: "Tutorial Video Apakah php-fpm? Bagaimana untuk mengoptimumkan untuk meningkatkan prestasi?"

Atas ialah kandungan terperinci Apakah php-fpm? Bagaimana untuk mengoptimumkan untuk meningkatkan prestasi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:learnku.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan