什么是 php-fpm :php 是作為一個獨立服務存在的,這個服務叫做 php-fpm
什么是 php-fpm pool :也就是 php-fpm 的進程池,這個進程池中運行了多個子進程,用來並發處理所有連接的動態請求
為什么要配置多個 pool :Nginx 接收到 php 動態請求會傳給 php-fpm 處理,php-fpm 調用 pool 中的子進程來處理動態請求,如果這個 pool 資源耗盡,會導致其他站點無法訪問資源,報 502 錯誤,因此有必要設置多個 php-fpm pool
默認只配置了一個 php-fpm pool :
[root@localhost ~]$ cat /usr/local/php/etc/php-fpm.conf [global] # 全局配置 pid = /usr/local/php/var/run/php-fpm.pid # php-fpm pid 文件 error_log = /usr/local/php/var/log/php-fpm.log # php-fpm 錯誤日志路徑 [www] # 進程池名稱 listen = /tmp/php-fcgi.sock # The address on which to accept FastCGI requests listen.mode = 666 # Set permissions for unix socket, read/write permissions must be set in order to allow connections from a web server user = php # Set the user who can accept FastCGI group = php # Set the group who can accept FastCGI pm = dynamic # 設置進程池中子進程的數目為動態的,它的數目基於下面的指令的值,關於 pm 的設置可以參考:https://gist.github.com/sotarok/2767859 pm.max_children = 50 # 同一時刻能夠存在的最大子進程的數量 pm.start_servers = 20 # 在啟動 php-fpm 時,要啟動的子進程數量 pm.min_spare_servers = 5 # 處於空閑狀態的最小子進程數量 pm.max_spare_servers = 35 # 處於空閑狀態的最大子進程數量 pm.max_requests = 500 # 每個子進程最多能處理多少個請求,達到數量后就自動退出進程池 rlimit_files = 1024 # 限制打開的文件描述符數量,這個一般是通過 ulimit 設置
配置多個 php-fpm pool :
[root@localhost ~]$ cat /usr/local/php/etc/php-fpm.conf [global] pid = /usr/local/php/var/run/php-fpm.pid error_log = /usr/local/php/var/log/php-fpm.log [www] listen = /tmp/php-fcgi.sock listen.mode = 666 user = php group = php pm = dynamic pm.max_children = 50 pm.start_servers = 20 pm.min_spare_servers = 5 pm.max_spare_servers = 35 pm.max_requests = 500 rlimit_files = 1024 [www2] listen = /tmp/php-fcgi2.sock listen.mode = 666 user = php group = php pm = dynamic pm.max_children = 50 pm.start_servers = 20 pm.min_spare_servers = 5 pm.max_spare_servers = 35 pm.max_requests = 500 rlimit_files = 1024
[root@localhost ~]$ /usr/local/php/sbin/php-fpm -t [root@localhost ~]$ /etc/init.d/php-fpm reload [root@localhost ~]$ ps aux | grep php-fpm
Nginx 如何使用不同的 php-fpm pool :
[root@localhost ~]$ cat /usr/local/nginx/conf/vhost/test.com.conf server { listen 80; server_name www.test.com; index index.html index.html index.php; root /data/www; location ~ \.php$ { include fastcgi_params; fastcgi_pass unix:/tmp/php-fcgi.sock; # 在這里指定使用哪個進程池 fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /data/www$fastcgi_script_name; } }