如何使用PHP-FPM池保护多个Web站点

随着服务器硬件变得更快、更高效,在一台机器上托管多个网站不再是不寻常的事情。为了更好的性能、进程隔离和安全性,考虑为每个网站使用单独的PHP FastCGI进程管理器 PHP- FPM池。本文将简单介绍在一个带有Nginx和PHP 7.4的Ubuntu 20.04 LTS云服务器上为多个站点使用单独的PHP- FPM池的基本知识。

1、删除默认站点

Nginx安装了一个默认站点,这对本文来说是多余的。要删除默认站点,以非root sudo用户SSH到服务器,然后运行:

$ sudo rm /etc/nginx/sites-enabled/default

2、创建站点用户

为了安全目的和隔离,每个站点需要作为不同的用户运行。为此,创建两个用户帐户。将它们分配给www-data组,这样web服务器就可以与用户交互,反之亦然,但不要给它们登录权限或将任何其他信息关联到帐户。要创建用户,运行命令:

$ sudo useradd site1$ sudo useradd site2$ usermod -a -G site1 www-data$ usermod -a -G site2 www-data

3、分配目录权限

创建两个目录并锁定权限,以便为两个不同的站点准备服务器。

$ sudo mkdir /var/www/site1$ sudo chown -R site1:site1 /var/www/site1$ sudo mkdir /var/www/site2$ sudo chown -R site2:site2 /var/www/site2$ sudo chmod 770 /var/www/site2

Unix权限为770。每个用户和用户的关联组对目录具有完全权限(7),但是世界没有权限(0)。这个设置限制了site1用户不能看到site2的数据,反之亦然。

4、创建新的PHP-FPM池

复制默认的PHP-FPM池作为两个新用户池的模板:

$ sudo cp /etc/php/7.4/fpm/pool.d/www.conf /etc/php/7.4/fpm/pool.d/fpm-site1.conf$ sudo cp /etc/php/7.4/fpm/pool.d/www.conf /etc/php/7.4/fpm/pool.d/fpm-site2.conf

删除不需要的默认池。

$ sudo rm /etc/php/7.4/fpm/pool.d/www.conf

5、配置第一个池

每个池都有一个关联的用户和Unix套接字。编辑第一个配置文件:

$ sudo nano /etc/php/7.4/fpm/pool.d/fpm-site1.conf

改变四行:

更改方括号内将池名称从[www]设置为[site1]的顶部一行。

修改线路user = www-data为user = site1。

将线路group = www-data修改为group = site1。

修改line listen = /run/php/php7.4-fpm。/run/php/php7.4-site1-fpm.sock。

保存文件并退出。

6、配置第二个池

编辑第二个配置文件:

$ sudo nano /etc/php/7.4/fpm/pool.d/fpm-site2.conf

改变四行:

更改方括号内将池名称从[www]设置为[site2]的顶部一行。

将行user = www-data更改为user = site2。

将line group = www-data更改为group = site2。

修改line listen = /run/php/php7.4-fpm。/run/php/php7.4-site2-fpm.sock。

保存文件并退出。

7、重启PHP-FPM

重新启动PHP-FPM守护进程。

$ sudo service php7.4-fpm restart

守护进程应该重新启动,不会出现错误。验证两个独立的PHP-FPM池正在运行。

$ sudo service php7.4-fpm status

如果FPM服务池是正确的,它们在流程列表中可见分叉:

CGroup: /system.slice/php7.4-fpm.service         ├─70796 php-fpm: master process (/etc/php/7.4/fpm/php-fpm.conf)         ├─70807 php-fpm: pool site1         ├─70808 php-fpm: pool site1         ├─70809 php-fpm: pool site2         └─70810 php-fpm: pool site2

实际的进程id可能与上面列出的不同。

8、创建Nginx站点

1)、服务器需要两个新站点来使用两个PHP-FPM池,每个池关联一个。

为site1创建一个配置文件:

$ sudo nano /etc/nginx/sites-available/site1

2)、将以下内容粘贴到文件中:

server {    server_name site1.example.com;     access_log /var/log/nginx/site1.access.log;    error_log /var/log/nginx/site1.error.log;     root /var/www/site1;     index index.php;     try_files $uri $uri/ /index.php?$query_string;     location ~ \.php$ {            fastcgi_pass unix:/var/run/php/php7.4-fpm-site1.sock;            include snippets/fastcgi-php.conf;    }}

3)、保存并退出该文件。以上的重要变化是:

server_name—主机的完全限定DNS名称

access_log—访问日志的位置和名称

error_log—错误日志的位置和名称

root—web服务器使用的磁盘上文件的位置

fastcgi_pass—池创建的PHP-FPM sock的位置

4)、为site2创建一个类似的文件。

$ sudo nano /etc/nginx/sites-available/site2

5)、这个文件的内容与site1匹配,除了它包含了site2的信息:

server {    server_name site2.example.com;     access_log /var/log/nginx/site2.access.log;    error_log /var/log/nginx/site2.error.log;     root /var/www/site2;     index index.php;     try_files $uri $uri/ /index.php?$query_string;     location ~ \.php$ {            fastcgi_pass unix:/var/run/php/php7.4-fpm-site2.sock;            include snippets/fastcgi-php.conf;    }}

6)、保存并退出该文件。

7)、将这些文件链接到相应的Nginx目录。

$ sudo ln -s /etc/nginx/sites-available/site1 /etc/nginx/sites-enabled/site1$ sudo ln -s /etc/nginx/sites-available/site2 /etc/nginx/sites-enabled/site2

8)、重启Nginx。

$ sudo service nginx restart

这应该不会出现错误。

9、测试配置

在每个站点的根目录中添加一个测试文件,以测试配置并验证哪个用户为每个web站点服务。

1)、为site1创建一个索引文件。

$ nano /var/www/site1/index.php

2)、将以下内容粘贴到文件中:

<?phpphpinfo();

3)、保存并退出该文件。

4)、为site2创建一个索引文件。

$ nano /var/www/site2/index.php

5)、将以下内容粘贴到site2的文件中:

<?phpphpinfo();

6)、保存并退出该文件。

7)、打开浏览器,访问http://site1.example.com和http://site2.example.com。

检查每个站点的PHP信息页面。在PHP变量部分中,变量$_SERVER['USER']对于site1.example.com应该是site1,对于site2.example.com应该是site2。

总结

为服务于单个服务器上的每个网站创建单独的PHP-FPM池,可以为管理员提供更强的安全性、更明确的边界,并更容易排除与单个站点相关的问题。

未经允许不得转载:便宜VPS网 » 如何使用PHP-FPM池保护多个Web站点