在 Ubuntu 上配置 PHP-FPM 多实例可以帮助你更好地管理不同的 PHP 应用程序,提高安全性和性能。以下是一个详细的步骤指南,帮助你在 Ubuntu 系统上设置多个 PHP-FPM 实例。
sudo 权限的用户。首先,确保你的系统已经安装了 PHP 和 PHP-FPM。如果尚未安装,可以使用以下命令进行安装:
sudo apt update sudo apt install php-fpm php-cli PHP-FPM 的默认配置文件位于 /etc/php/{版本号}/fpm/pool.d/www.conf。为了创建多个实例,我们需要复制并修改这个配置文件。
假设我们要创建两个 PHP-FPM 实例,分别用于不同的项目。
sudo mkdir -p /etc/php/{版本号}/fpm/pool.d 将 {版本号} 替换为你当前安装的 PHP 版本,例如 7.4 或 8.0。
sudo cp /etc/php/{版本号}/fpm/pool.d/www.conf /etc/php/{版本号}/fpm/pool.d/project1.conf sudo cp /etc/php/{版本号}/fpm/pool.d/www.conf /etc/php/{版本号}/fpm/pool.d/project2.conf 编辑每个实例的配置文件,以区分它们。
project1.confsudo nano /etc/php/{版本号}/fpm/pool.d/project1.conf 修改以下参数:
[project1] user = www-data group = www-data listen = /run/php/php{版本号}-project1.sock listen.owner = www-data listen.group = www-data pm = dynamic pm.max_children = 5 pm.start_servers = 2 pm.min_spare_servers = 1 pm.max_spare_servers = 3 php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i php_admin_flag[log_errors] = on php_admin_value[memory_limit] = 512M 说明:
listen:指定 Unix socket 的路径,确保不同实例的路径唯一。pm.max_children、pm.start_servers 等参数根据你的服务器资源进行调整。php_admin_value[memory_limit]:设置每个子进程的内存限制。project2.confsudo nano /etc/php/{版本号}/fpm/pool.d/project2.conf 类似于 project1.conf,修改相关参数,例如:
[project2] user = www-data group = www-data listen = /run/php/php{版本号}-project2.sock listen.owner = www-data listen.group = www-data pm = dynamic pm.max_children = 5 pm.start_servers = 2 pm.min_spare_servers = 1 pm.max_spare_servers = 3 php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i php_admin_flag[log_errors] = on php_admin_value[memory_limit] = 512M 确保 listen 路径唯一,例如使用 php{版本号}-project2.sock。
对于每个实例,分别重启 PHP-FPM 服务以应用配置更改。
sudo systemctl restart php{版本号}-fpm 例如,对于 PHP 7.4:
sudo systemctl restart php7.4-fpm sudo systemctl restart php7.4-fpm@project1 sudo systemctl restart php7.4-fpm@project2 根据你使用的 Web 服务器,配置相应的虚拟主机以使用不同的 PHP-FPM 实例。
假设你有两个项目分别位于 /var/www/project1 和 /var/www/project2。
project1编辑 Nginx 的虚拟主机文件:
sudo nano /etc/nginx/sites-available/project1 添加或修改以下内容:
server { listen 80; server_name project1.example.com; root /var/www/project1; index index.php index.html index.htm; location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php{版本号}-project1.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } location / { try_files $uri $uri/ =404; } } project2编辑 Nginx 的虚拟主机文件:
sudo nano /etc/nginx/sites-available/project2 添加或修改以下内容:
server { listen 80; server_name project2.example.com; root /var/www/project2; index index.php index.html index.htm; location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php{版本号}-project2.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } location / { try_files $uri $uri/ =404; } } sudo ln -s /etc/nginx/sites-available/project1 /etc/nginx/sites-enabled/ sudo ln -s /etc/nginx/sites-available/project2 /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl restart nginx 如果你使用 Apache,可以通过 mod_proxy_fcgi 来配置。
sudo a2enmod proxy_fcgi setenvif sudo systemctl restart apache2 编辑 Apache 的虚拟主机文件,例如 /etc/apache2/sites-available/project1.conf:
<VirtualHost *:80> ServerName project1.example.com DocumentRoot /var/www/project1 <Directory /var/www/project1> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> <FilesMatch \.php$> SetHandler "proxy:unix:/run/php/php{版本号}-project1.sock|fcgi://localhost" </FilesMatch> </VirtualHost> 同样地,为 project2 创建类似的配置文件 /etc/apache2/sites-available/project2.conf。
sudo a2ensite project1.conf sudo a2ensite project2.conf sudo systemctl restart apache2 确保每个项目都使用正确的 PHP-FPM 实例运行。
project1.example.com 和 project2.example.com,检查是否正常显示。sudo tail -f /var/log/php{版本号}-fpm@project1.log sudo tail -f /var/log/php{版本号}-fpm@project2.log 权限设置:确保 PHP-FPM 用户(通常是 www-data)对项目目录有适当的读写权限。
资源限制:根据服务器的资源调整 pm.max_children 等参数,以避免资源耗尽。
安全性:限制 PHP-FPM 监听的地址,仅允许必要的连接,增强安全性。
监控和优化:使用工具如 systemd 的服务监控或第三方监控工具来监控 PHP-FPM 实例的性能和健康状态。
通过以上步骤,你应该能够在 Ubuntu 上成功配置多个 PHP-FPM 实例,以更好地管理和优化不同的 PHP 应用程序。