PHP-FPM(FastCGI Process Manager)是对FastCGI实现PHP的替代方案,为具有高流量网站提供一些额外的功能,它是使用NGINX处理PHP页面的首选方法,比传统的CGI基于方法(如 SUPHP或 `mod_php')更快运行PHP脚本。使用PHP-FPM的主要优点是,它使用的内存和CPU比运行PHP的任何其他方法要少得多。
PHP-FPM NGINX 配置前提条件
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。
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页面。
摘要
在本文中,我们学到了如何安装php-fpm并为不同的用户和应用程序配置单独的池。我们还学到了如何配置NGINX服务器块以连接到PHP-FPM服务。PHP-FPM提供了可靠性,安全性,可扩展性和速度,以及许多性能调节选项。您现在可以将默认的PHP-FPM池分成多个资源池来服务不同的应用程序。这不仅会提高您的服务器安全性,还可以让你优化服务器资源的分配!