如何使用 NGINX 配置 PHP-FPM

PHP-FPM(FastCGI Process Manager)是对FastCGI实现PHP的替代方案,为具有高流量网站提供一些额外的功能,它是使用NGINX处理PHP页面的首选方法,比传统的CGI基于方法(如 SUPHP或 `mod_php')更快运行PHP脚本。使用PHP-FPM的主要优点是,它使用的内存和CPU比运行PHP的任何其他方法要少得多。

PHP-FPM NGINX 配置前提条件

  • 您可以使用 root 或使用 sudo启用的用户打开您的 Ubuntu 18.04 系统上的 SSH 会话.
  • 您已经在 Ubuntu 18.04 系统中安装了 NGINX和 PHP。

NGINX PHP-FPM 配置步骤

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

1. 安装 PHP-FPM

Nginx 不知道如何自行运行 PHP 脚本. 它需要一个 PHP-FPM 模块来有效地管理 PHP 脚本. 另一方面, PHP-FPM 通过创建自己的过程在 NGINX 环境之外运行。 因此,当用户请求一个 PHP 页面时,nginx 服务器会通过 FastCGI 将请求传递给 PHP-FPM 服务。 在 Ubuntu 18.04 中安装 php-fpm 取决于 PHP 及其版本。 在继续在您的服务器上安装 FPM 之前,检查安装的 PHP 文档。 假设您已经安装了最新 PHP 7.3,那么您可以使用以下 apt-get 命令安装 FPM。

1# apt-get install php7.3-fpm

FPM 服务将在安装结束后自动启动,您可以使用以下 systemd 命令来验证:

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

2. 配置 PHP-FPM 池

php-fpm 服务创建了一个默认池,其配置(www.conf)可以在 `/etc/php/7.3/fpm/pool.d 文件夹中找到。您可以根据您的要求定制默认池,但这是一个标准的做法,创建单独池以更好地控制每个 FPM 流程的资源分配。此外,分离 FPM 池将允许它们通过创建自己的主流程独立运行。这意味着每个 PHP 应用程序可以使用 PHP-FPM 配置以配置其自己的缓存设置。一个池的配置变化不需要你开始或停止其余的 FPM 池。让我们通过一个单独的用户有效地创建一个运行 PHP 应用程序的 FPM 池。

1# groupadd wordpress_user
2# useradd -g wordpress_user wordpress_user

现在,导航到 FPM 配置目录,并使用您最喜欢的文本编辑器创建配置文件,如 vi:

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

以上 FPM 配置选项及其值如下所述。

  • ** [文字发布站] *: 池名必须在所有池名中独有( _) ( ) 用户和组: 管理池的用户和组( _) * ** listen **: 此池的套接字文件名称
  • ** listen. owner and listen. 组**: 必须匹配正在运行的 NGINX 用户和组 。 就我们而言,是www-data.
  • php_admin_value:允许设置自定义的php配置值. (_) ( )* php_admin_flag:允许设置 PHP 布尔旗.
  • ** 小时**: 进程管理器设置和值是动态的,意味着根据以下指令动态设定了子进程的数量. () ( )* 下午max_儿童: 可以同时活下来的儿童最多数量. ( ( )* ** pm. start_服务器**: 启动时创建的儿童数量
  • p.min_spare_服务器: 在"idle"状态下(等待处理)儿童的最低数量. 如果闲置进程的数量少于这个数量,则会创建一些孩子.
  • p.max_spare_服务器: 闲置状态下的儿童最多(等待处理). 如果闲置过程的数量大于这个数量,那么一些儿童将会被杀死.
  • 页:1 想要的最大空闲服务器进程数 。 仅在 pm 值设定为动态时使用 。 (_) (英语)

除了上述设置外,还可以将少数系统环境变量传输到php-fpm服务中,例如,在上面的配置文件中添加下列选项,将主机名称和临时文件夹位置设置为PHP环境。

1...
2...
3env[HOSTNAME] = $HOSTNAME
4env[TMP] = /tmp
5...
6...

此外,上面的池配置文件中的流程管理器设置设置设置为动态。 选择最适合您的要求的设置。 流程管理器的其他配置选项是:- 静态:将维持固定数量的PHP流程。

  • ondemand:在启动时没有创建孩子.在服务器上接收新请求时,孩子将被分叉。

一旦完成创建上述配置文件,请重新启动 fpm 服务以应用新的设置:

1# systemctl start php7.3-fpm

请记住,您可以通过指定上面的 FPM 配置文件来创建一个单独的 systemd 服务,从而允许您启动/停止此池而不会影响其他池。

NGINX 配置为 PHP-FPM

现在创建一个 NGINX 服务器块,将使用上述 FPM 池. 要做到这一点,请编辑您的 NGINX 配置文件,并使用 php 位置块中的 fastcgi_pass 选项通过池的插槽文件的路径。

 1server {
 2         listen 80;
 3         server_name example.journaldev.com;
 4         root         /var/www/html/wordpress;
 5
 6         access_log /var/log/nginx/example.journaldev.com-access.log;
 7         error_log  /var/log/nginx/example.journaldev.com-error.log error;
 8         index index.html index.htm index.php;
 9
10         location / {
11                      try_files $uri $uri/ /index.php$is_args$args;
12         }
13
14         location ~ \.php$ {
15            fastcgi_split_path_info ^(.+\.php)(/.+)$;
16            fastcgi_pass unix:/var/run/php7.2-fpm-wordpress-site.sock;
17            fastcgi_index index.php;
18            include fastcgi.conf;
19    }
20}

NGINX Server Block PHP-FPM

请确保上述配置设置是语法正确的,然后重新启动 NGINX。

1# nginx-t
2# systemctl restart nginx

测试 PHP-FPM NGINX 配置

要测试上述 NGINX 配置文件是否确实使用新创建的 FPM 池,请在 Web 根中创建一个 PHP 信息文件. 我已在上述 NGINX 配置文件中使用 /var/www/html/wordpress 作为 Web 根。

1# cd /var/www/html/wordpress
2# echo "<?php echo phpinfo();?>" > info.php

一旦你完成了创建的PHP信息页面,点击你最喜欢的网页浏览器,你会注意到值$_SERVER$_SERVER的变量分别指向wordpress_user/home/wordpress_user,我们之前在FPM配置文件中设置,从而确认NGINX正在使用我们想要的FPM池服务的php页面。

NGINX PHP-FPM Test Php Info Page

摘要

在本文中,我们学到了如何安装php-fpm并为不同的用户和应用程序配置单独的池。我们还学到了如何配置NGINX服务器块以连接到PHP-FPM服务。PHP-FPM提供了可靠性,安全性,可扩展性和速度,以及许多性能调节选项。您现在可以将默认的PHP-FPM池分成多个资源池来服务不同的应用程序。这不仅会提高您的服务器安全性,还可以让你优化服务器资源的分配!

Published At
Categories with 技术
comments powered by Disqus