在 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.conf
sudo 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.conf
sudo 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 应用程序。