如何使用NGINX配置PHP-FPM
PHP-FPM(FastCGI流程管理器)是PHP的FastCGI实现的替代方法,具有一些附加功能,可用于高流量站点。
它是使用NGINX处理PHP页面的首选方法,并且比传统的基于CGI的方法(例如SUPHP或者mod_php)运行PHP脚本要快。
使用PHP-FPM的主要优点是,与运行PHP的任何其他方法相比,它使用大量的内存和CPU。
主要原因是它妖魔化了PHP,从而将其转换为后台进程,同时提供了用于管理PHP请求的CLI脚本。
PHP-FPM NGINX配置前提条件
您可以使用root或者启用sudo的用户打开到Ubuntu 18.04系统的SSH会话。
您已经在Ubuntu 18.04系统中安装了NGINX和PHP。
NGINX PHP-FPM配置步骤
1.安装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池将通过创建自己的主进程使它们独立运行。
这意味着可以使用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]:池的名称,并且在所有池名称中必须唯一。
用户和组:将在其下运行池的用户和组。
listen:此池的套接字文件的名称。
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 ... ...
另外,上述池配置文件中的流程管理器设置被设置为动态。
选择最适合您要求的设置。
流程管理器的其他配置选项是:
静态的:将维护固定数量的PHP进程。
按需:启动时不会创建任何子级。
当服务器中接收到新请求时,将对子节点进行分叉。
创建完上述配置文件后,请重新启动fpm服务以应用新设置:
# systemctl start php7.3-fpm
FPM池将立即创建以服务php页面。
请记住,可以通过指定上面的FPM配置文件来创建单独的systemd服务,从而使您能够启动/停止该池而不影响其他池。
3.为PHP-FPM配置NGINX
现在创建一个将使用上述FPM池的NGINX服务器块。
为此,请编辑您的NGINX配置文件,并在php的位置块内使用" fastcgi_pass"选项传递池套接字文件的路径。
server { listen 80; server_name example.theitroad.local; root /var/www/html/wordpress; access_log /var/log/nginx/example.theitroad.local-access.log; error_log /var/log/nginx/example.theitroad.local-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
4.测试PHP-FPM NGINX配置
要测试上述NGINX配置文件是否确实在使用新创建的FPM池,请在Web根目录内创建一个php信息文件。
在上面的NGINX配置文件中,我已经将/var/www/html/wordpress
用作网络根目录。
根据您的环境调整此值。
# cd /var/www/html/wordpress # echo "<?php echo phpinfo();?>" > info.php
创建完PHP信息页面后,将您喜欢的Web浏览器指向该页面。
您会注意到,$_SERVER ['USER']和$$SERVER ['HOME']
变量的值分别指向我们先前在FPM配置文件中设置的wordpress_user
和/home/wordpress_user
。
从而确认NGINX正在使用我们所需的FPM池提供php页面。