我們是否應該在 Apache+PHP-FPM 中為多個網站設置一個池?
如果有許多小型網站(大約 300 個)在輕量級網路流量中執行,它們應該都使用同一個池,還是為每個站點設置一個單獨的池更好?
讓我們假設網站是受信任的,並且在此不考慮在池中擁有單獨的使用者/組的好處(例如更好地控制訪問/權限)。
通常,我更喜歡每個網站使用一個池(但可能不在此處,請閱讀全部內容)。
主要原因是允許每個網站的 php 設置。這些設置可以根據網站的需要而有所不同,但也可以更好地分離網站資源。例如更改臨時目錄或 open_basedir_settings:
(...) env[TMP] = /path/to/client/var/tmp env[TMPDIR] = /path/to/client/var/tmp env[TEMP] = /path/to/client/var/tmp env[DOCUMENT_ROOT] = /path/to/client/www php_admin_value[open_basedir] = ".:/path/to/client/www:/path/to/client/var/tmp:/path/to/client/var/log" php_admin_value[upload_tmp_dir]="/path/to/client/var/tmp" (...)
您也可以對 php-fpm 使用chroot模式,但這更複雜。在這種情況下,使用 chroot 池,可能更容易為所有客戶端僅使用一個池(因此共享 chroot,這實際上不是很好)。這是因為像 apc 這樣的東西是由所有池共享的,這意味著使用多個 chrooted 池,您最終可能會在不同的池中得到多個具有相同路徑的文件,而 apc 只會儲存文件的一個記憶體版本。事實上,在 apc+chroot 的情況下,最好的解決方案是執行多個 php-fpm 實例,每個實例一個池。對於 300 個網站來說,這不是一件容易的事。
pm.[static/dynamic]
然後,您可以使用池設置管理每個網站可以使用多少個 php 程序。請注意,對於 300 個小型網站,這可能會成為一個問題,如果大量這些網站不活躍,那麼您的大部分記憶體將被不做任何事情的池程序使用。在你的情況下,流量很低,網站很輕,所以在你的盒子上執行超過 300 個(至少)池的程序,什麼都不做,是一種矯枉過正。在您的特定情況下,我想我會改為使用少量的池(也許您可以將一些網站按應用程序?按版本?按需求?),讓每個池能夠執行多個網站。或者可能只有一個,我會嘗試使用網站組對它們應用一些 open_basedir 限制,但如果它們真的都相同,你可以只使用一個池執行。