Nginx配置PHP-FPM:高性能Web服务器优化指南

这是文章《如何使用NGINX配置PHP-FPM》的第1部分(共1部分)。

内容片段: PHP-FPM(FastCGI进程管理器)是PHP的FastCGI实现的一种替代方案,具有一些适用于高流量网站的额外功能。它是使用NGINX处理PHP页面的首选方法,并且比基于传统CGI的方法(如SUPHP或mod_php)更快速地运行PHP脚本。使用PHP-FPM的主要优势是它使用相对较少的内存和CPU资源,与其他任何运行PHP的方法相比。主要原因是它使PHP变成了后台进程,同时提供了一个CLI脚本来管理PHP请求。

PHP-FPM NGINX配置前提要求

  • 您可以通过root用户或具有sudo权限的用户,打开与Ubuntu 18.04系统的SSH会话。
  • 您已在Ubuntu 18.04系统中安装了NGINX和PHP。

NGINX PHP-FPM 配置步骤:

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

安装PHP-FPM

Nginx本身无法运行PHP脚本。它需要一个像PHP-FPM这样的PHP模块来高效地管理PHP脚本。另一方面,PHP-FPM通过创建自己的进程在NGINX环境之外运行。因此,当用户请求一个PHP页面时,Nginx服务器将使用FastCGI将请求传递给PHP-FPM服务。在Ubuntu 18.04中安装php-fpm取决于PHP及其版本。在继续在服务器上安装FPM之前,请检查已安装的PHP的文档。假设您已经安装了最新的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池将使它们能够通过创建自己的master进程独立运行。这意味着每个PHP应用程序可以使用PHP-FPM来配置自己的缓存设置。对一个池的配置的更改不需要您启动或停止其他FPM池。让我们为有效地运行PHP应用程序创建一个FPM池,通过一个独立的用户来运行。首先,创建一个新用户,该用户将对这个池拥有独占权限。

# 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]: 池的名称,在所有池名称中必须是唯一的。
  • usergroup: 池将运行的用户和组。
  • listen: 此池的套接字文件名称。
  • listen.ownerlisten.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值设置为dynamic时使用。

除了上述设置,还可以通过env['PHP_FOO'] = $bar的形式将一些系统环境变量传递给php-fpm服务。例如,在上述配置文件中添加以下选项将设置主机名和临时文件夹位置到PHP环境。

...
...
env[HOSTNAME] = $HOSTNAME
env[TMP] = /tmp
...
...

此外,在上述的池配置文件中,进程管理器的设置被设置为动态。选择一个最符合您要求的设置。进程管理器的其他配置选项有:

  • static: 将维护固定数量的PHP进程。
  • ondemand: 启动时不创建子进程。当服务器接收到新请求时,会派生子进程。

完成上述配置文件后,重新启动fpm服务以应用新的设置。

# systemctl start php7.3-fpm

FPM池将立即创建,用于服务php页面。请记住,您可以通过指定上述FPM配置文件来创建一个单独的systemd服务,从而使您能够在不影响其他池的情况下启动/停止该池。

3. 为PHP-FPM配置NGINX

现在创建一个NGINX服务器块,它将利用上述的FPM池。为了做到这一点,编辑您的NGINX配置文件,并在php的location块中使用fastcgi_pass选项传递池的套接字文件的路径。

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

         access_log /var/log/nginx/example.scdev.com-access.log;
         error_log  /var/log/nginx/example.scdev.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 Server Block PHP-FPM

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

# nginx -t
# systemctl restart nginx

4. 测试 PHP-FPM 和 NGINX 的配置。

为了测试上述NGINX配置文件是否确实使用了新创建的FPM池,请在Web根目录中创建一个php信息文件。我在上述NGINX配置文件中使用了/var/www/html/wordpress作为Web根目录。根据您的环境调整该值。

# 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 Test Php Info Page

摘要

在本文中,我们学习了如何安装php-fpm并为不同用户和应用程序配置独立的池。我们还学会了如何配置NGINX服务器块以连接到PHP-FPM服务。PHP-FPM提供了可靠性、安全性、可扩展性和速度,同时还具有许多性能调优选项。现在,您可以将默认的PHP-FPM池拆分为多个资源池以为不同的应用程序提供服务。这不仅可以提升服务器安全性,还可以使您能够更优化地分配服务器资源!

bannerAds