Skip to main content

如何配置带有 NGINX 的 PHP-FPM

作者 Meghna Gangwar PHP-FPM(FastCGI进程管理器)可以替代 PHP FastCGI 实现。它的一些额外的功能对流量大的网站很有用。PHP-FPM 是用 NGINX 处理 PHP 页面的首选方法,比传统的基于 CGI 的方法(如 SUPHP 或 mod_php)运行 PHP 脚本要快。使用 PHP-FPM 的主要优点是,与其他任何运行 PHP 的方法相比,它使用的内存和 CPU 要少得多。这主要是因为它能够将 PHP 转变为一个后台进程,同时提供一个 CLI 脚本来管理 PHP 请求。

PHP-FPM NGINX 配置前期准备

  • 你可以使用 root 或启用 sudo 功能的用户打开一个 SSH 会话到你的 Ubuntu 18.04系统。
  • 已经在 Ubuntu 18.04系统中安装了 NGINX 和 PHP 。

NGINX PHP-FPM 配置步骤

  • 安装 PHP-FPM
  • 配置 PHP-FPM 池
  • 为 PHP-FPM 配置 NGINX
  • 测试 PHP-FPM 的 NGINX 配置

1. 安装 PHP-FPM

NGINX 无法运行自己的 PHP 脚本,它需要一个像 PHP-FPM 这样的 PHP 模块来有效地管理 PHP 脚本。而 PHP-FPM 创建了自己的进程,在 NGINX 环境之外运行。因此,当用户请求一个 PHP 页面时,NGINX 服务器会使用 FastCGI 将请求传递给 PHP-FPM。在 Ubuntu 18.04上,PHP-FPM 的安装取决于 PHP 和它的版本。因此,你应该在检查完所安装的 PHP 的文档后,再继续在服务器上安装FPM。假设已经安装了最新的 PHP 7.3,那么可以使用下面的 apt-get 命令安装 FPM。

# apt-get install php7.3-fpm

安装结束后,FPM服务会自动启动。可以用以下 systemd 命令进行验证:

# systemctl status php7.3-fpm
● php7.3-fpm.service - The PHP 7.3 FastCGI Process Manager
Loaded: loaded (/lib/systemd/system/php7.3-fpm.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2019-02-17 06:29:31 UTC; 30s ago
Docs: man:php-fpm7.3(8)
Main PID: 32210 (php-fpm7.3)
Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/sec"
Tasks: 3 (limit: 1152)
CGroup: /system.slice/php7.3-fpm.service
├─32210 php-fpm: master process (/etc/php/7.3/fpm/php-fpm.conf)
├─32235 php-fpm: pool www
└─32236 php-fpm: pool www

2. 配置 PHP-FPM 池

PHP-FPM 服务创建了一个默认池,其配置(www.conf)可以在 /etc/php/7.3/fpm/pool.d 文件夹中找到。你可以根据自己的需求定制默认池。但是,标准的做法是创建各自独立的池,这样可以更好地控制对每个 FPM 进程的资源分配。此外,隔离 FPM 池可以使它们创建自己的主进程,从而能够独立运行。这意味着使用 PHP-FPM,每个 PHP 应用程序都可以配置自己的缓存设置。改变一个池的配置不需要启动或停止其他的 FPM 池。接下来让我们创建一个 FPM 池,通过一个独立用户有效地运行一个PHP应用程序。首先,创建一个新的用户,该用户将拥有对这个池子的专有权:

# groupadd wordpress_user
# useradd -g wordpress_user wordpress_user

现在导航到 FPM 配置目录,用你喜欢的文本编辑器(比如 vi )创建一个配置文件。

# cd /etc/php/7.3/fpm/pool.d
# vi wordpress_pool.conf
[wordpress_site]
user = wordpress_user
group = wordpress_user
listen = /var/run/php7.2-fpm-wordpress-site.sock
listen.owner = www-data
listen.group = www-data
php_admin_value[disable_functions] = exec,passthru,shell_exec,system
php_admin_flag[allow_url_fopen] = off
; Choose how the process manager will control the number of child processes.
pm = dynamic
pm.max_children = 75
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20
pm.process_idle_timeout = 10s

上述 FPM 配置选项及其值参见如下描述:

  • [wordpress_site]:池的名称,所有池的名称都必须是唯一的。
  • user(用户) 和 group(组):池在该用户和组下运行。
  • listen:该池的socket文件的名称。
  • listen.owner 和 listen.group:必须与运行 NGINX 的用户和组相匹配。在我们的例子中是www-data。
  • php_admin_value:允许设置自定义的 PHP 配置值。
  • php_admin_flag:允许设置 PHP 布尔标志。
  • pm:进程管理器的设置,其值为dynamic(动态的),意味着子进程的数量是根据以下指令动态设置的。
  • pm.max_children:可以同时存活的子进程的最大数量。
  • pm.start_servers: 启动时创建的子进程的数量。
  • pm.min_spare_servers: 处于“空闲”状态(等待处理)的子进程的最小数量。如果空闲进程的数量少于这个数字,那么将再创建一些子进程。
  • pm.max_spare_servers: 处于空闲状态(等待处理)的子进程的最大数量。如果空闲进程的数量大于这个数字,那么一些子进程将被“杀死”。
  • pm.process_idle_timeout:服务器空闲进程想要的最大数量。只在 pm 值被设置为动态时使用。除了上述设置外,还可以使用env['PHP_FOO'] = $bar 这样的方法,将一些系统环境变量传递给 PHP-FPM 服务。例如,在上述配置文件中加入以下选项,就会把主机名和临时文件夹位置设置为 PHP 环境。
...
...
env[HOSTNAME] = $HOSTNAME
env[TMP] = /tmp
...
...

另外,上述池子配置文件中的进程管理器被设置为动态。你应该选择一个最适合你需求的设置。另外还有“- Static(静态的)”选项,该选项将维持一个数量固定的 PHP 进程。

  • ondemand:在启动时不创建子进程。当服务器收到新的请求时,子进程将被分叉(fork)。 完成上述配置文件的创建后,重新启动 FPM 服务以应用新的设置:
# systemctl start php7.3-fpm

FPM 池将被立即创建,开始为 PFP 页面提供服务。记住,你可以指定上述 FPM 配置文件,来创建一个单独的 systemd 服务,从而在不影响其他池的情况下启动/停用这个池。

3. 为 PHP-FPM 配置 NGINX

现在创建一个 NGINX 服务器块,它将用到上面创建的 FPM 池。完成这一步需要编辑你的 NGINX 配置文件,并在 PHP 的位置块中使用选项 fastcgi_pass ,来传递池的 socket 文件的路径。

         server {
listen 80;
server_name example.journaldev.com;
root /var/www/html/wordpress;

access_log /var/log/nginx/example.journaldev.com-access.log;
error_log /var/log/nginx/example.journaldev.com-error.log error;
index index.html index.htm index.php;

location / {
try_files $uri $uri/ /index.php$is_args$args;
}

location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php7.2-fpm-wordpress-site.sock;
fastcgi_index index.php;
include fastcgi.conf;
}
}

NGINX 服务器块

确保上述配置的设置在语法上是正确的,并重新启动 NGINX。

# nginx-t
# systemctl restart nginx
  1. 测试 PHP-FPM 的 NGINX 配置 为了测试上述 NGINX 配置文件是否确实使用了新创建的 FPM 池,你需要在 web 根目录下创建一个 PHP 信息文件。上面示例的 NGINX 配置文件中使用了 /var/www/html/wordpress 作为 web root。你应该根据自己的环境来调整这个值。
# cd /var/www/html/wordpress
# echo "<?php echo phpinfo();?>" > info.php

完成 PHP 信息页面的创建之后,使用你喜欢的网络浏览器指向该页面。你会注意到 $_SERVER['USER']$_SERVER['HOME'] 变量的值分别指向我们之前在 FPM 配置文件中设置的 wordpress_user/home/wordpress_user,从而证实 NGINX 确实正在使用我们想要的 FPM 池为 PHP 页面服务。 NGINX PHP-FPM 测试

结语

在这篇文章中,我们学习了如何安装 PHP-FPM 并为不同的用户和应用程序配置独立的池。我们还学习了如何配置 NGINX 服务器块,来连接到 PHP-FPM 服务。PHP-FPM 提供了可靠、安全、可扩展和速度快的服务,以及大量的性能调整选项。现在你可以把默认的 PHP-FPM 池分成多个资源池,为不同的应用程序服务。这不仅可以提高服务器的安全性,还让你能够优化服务器资源分配。