
如果有許多小型網站(大約 300 個)在輕量級網路流量中運行,它們是否應該全部使用同一個池,還是為每個網站使用單獨的池會更好?
讓我們假設網站是可信的,並且這裡不考慮在池中擁有單獨的用戶/群組的好處(例如更好地控制訪問/權限)。
答案1
通常,我更喜歡每個網站使用一個池(但可能不是這裡,請閱讀全部)。
主要原因是允許每個網站的 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"
(...)
您也可以使用chrootphp-fpm 的模式,但這更複雜。在這種情況下,使用 chroot 池,為所有客戶端僅使用一個池可能會更容易(因此共用 chroot,這實際上不是很好)。這是因為 apc 之類的東西由所有池共享,這意味著使用多個 chroot 池,最終可能會在不同池中得到多個具有相同路徑的文件,而 apc 只會儲存該文件的一個快取版本。事實上,在 apc+chroot 的情況下,最好的解決方案是運行多個 php-fpm 實例,每個實例一個池。對於 300 個網站來說並不是一件容易的事。
然後,您可以使用池設定來管理每個網站可以使用多少個 php 流程pm.[static/dynamic]
。請注意,對於 300 個小型網站這可能會成為一個問題,如果大量這些網站不活動,那麼您的大部分記憶體將被不執行任何操作的池進程使用。
在您的情況下,流量很低且網站很輕,因此在您的機器上運行超過 300 個(至少)池進程而不執行任何操作,這是一種矯枉過正。在您的具體情況下,我認為我會使用少量的池(也許您可以按應用程式?按版本?按需求將一些網站分組在一起?),讓每個池能夠運行多個網站。或者也許只有一個,我會嘗試使用一組網站對它們應用一些 open_basedir 限制,但如果它們確實相同,您可以只使用一個池運行。