我配置了 php7.0-fpm 以与 Ubuntu 16.04 上的 apache 一起工作,但不确定它是否正确配置并正常工作。
据我了解,安装和配置后,php 信息文件的输出应该显示“服务器 API --> FPM/FastCGI”,但它仍然显示“服务器 API --> Apache 2.0 Handler”。
这是我安装和配置php7.0-fpm的方式:
sudo apt-get install libapache2-mod-fastcgi php7.0-fpm
sudo a2enmod actions fastcgi alias
sudo a2enconf php7.0-fpm
sudo service php7.0-fpm restart
sudo systemctl status php7.0-fpm
sudo systemctl restart apache2.service
以下是 sudo systemctl status php7.0-fpm 的输出:
php7.0-fpm.service - The PHP 7.0 FastCGI Process Manager
Loaded: loaded (/lib/systemd/system/php7.0-fpm.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2017-11-25 11:57:33 UTC; 23h ago
Process: 1149 ExecStartPre=/usr/lib/php/php7.0-fpm-checkconf (code=exited, status=0/SUCCESS)
Main PID: 1336 (php-fpm7.0)
Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/sec"
Tasks: 3
Memory: 37.8M
CPU: 3.089s
CGroup: /system.slice/php7.0-fpm.service
├─1336 php-fpm: master process (/etc/php/7.0/fpm/php-fpm.conf)
├─1340 php-fpm: pool www
└─1341 php-fpm: pool www
Nov 25 11:57:33 ip-10-0-0-126 systemd[1]: Starting The PHP 7.0 FastCGI Process Manager...
Nov 25 11:57:33 ip-10-0-0-126 systemd[1]: Started The PHP 7.0 FastCGI Process Manager.
我做错了什么?希望得到一些帮助和建议吗?
/etc/apache2/conf-enabled/php7.0-fpm.conf
以下是我的文件的内容:
<Directory /usr/lib/cgi-bin>
Require all granted
</Directory>
<IfModule mod_fastcgi.c>
AddHandler php7-fcgi .php
Action php7-fcgi /php7-fcgi
Alias /php7-fcgi /usr/lib/cgi-bin/php7-fcgi
FastCgiExternalServer /usr/lib/cgi-bin/php7-fcgi -socket /var/run/php/php7.0-fpm.sock -pass-header Authorization
</IfModule>
答案1
您需要启用proxy_fcgi
模块并禁用mod_php7
,以使股票php7.0-fpm
配置文件生效。
如果你看一下/etc/apache2/conf-enabled/php7.0-fpm.conf
,你会在顶部看到这个:
<IfModule !mod_php7.c>
<IfModule proxy_fcgi_module>
答案2
我按照以下说明操作,成功解决了这个问题Koen Reiniers 的开发博客。我几乎完全按照说明操作,除了博客文章评论中提到的一个例外,它运行完美。您将需要mod_fastcgi以及其他几个模块。本配方将使您能够设置多个 vhost,每个 vhost 使用独立的 php7 fpm 配置。请注意,除非phpinfo()显示服务器 API 为“FPM/FastCGI”,那么您就错过了目标。这是您堆栈正常运行的酸性测试。作为检查,我还执行了“<?php touch('/tmp/fpmtest');”以检查为我的虚拟主机启动的进程是否以指定的用户/组身份执行(确实如此)。
这个菜谱是从 Koen 的博客中复制而来,并做了一些修改,他的清晰有效的指导值得称赞。
除了其中与安全相关的部分之外,你还可以不是想要启用 Apache confphp7.0-fpm如果你使用这个配方。唯一需要全局执行的代码是:
<Directory "/usr/lib/cgi-bin">
Require all granted
</Directory>
如果您的 Apache2 配置启用mod_cgi配置文件那么模块的默认配置文件中可能已经考虑到了这一点。否则,如果这个模块(或mod_cgid.c) 尚未启用,可以将其添加到在 Apache2 启动时执行的任何 conf 文件中,但根据您的服务器环境,将其仅添加到启用了 PHP-FPM 的每个 <VirtualHost> 可能会更安全。安全相关代码来自php7.0-fpm.conf也可以复制到同一位置,或全局启用。
本指南假设您在 Ubuntu 服务器上运行 PHP 7.0.* 以及 Apache(带虚拟主机)。此外,请不要在没有正确备份的情况下在生产环境中尝试此操作。
首先确保php7.0-fpm安装在您的系统上:
$ sudo apt-get install php7.0-fpm
安装完成后,如果服务未自动启动,请启动它,并验证它是否正在运行:
$ sudo service php7.0-fpm start && ps aux | grep php-fpm
要为每个虚拟主机使用 PHP-FPM,您必须将其拆分为多个资源池,每个单独的 <VirtualHost> 用户一个,这意味着如果您为一个用户分配了多个主机,您只需为该用户创建一个资源池。
PHP-FPM 的池配置的默认位置是:
/etc/php/7.0/fpm/pool.d/
要为某个用户创建新配置,只需创建一个新的 .conf 文件。我使用用户的用户名作为配置文件的名称:
$ sudo vim /etc/php/7.0/fpm/pool.d/username.conf
并将其用作您的配置(将“用户名”替换为您的用户的实际名称):
[username]
user = username
group = username
listen = /run/php/php7.0-fpm.username.sock
listen.owner = username
listen.group = username
listen.mode = 0666
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
前七行是最重要的。确保它们与 Apache 虚拟主机用户相同。最后五行是进程管理器的默认设置。为了简单起见,保留它们原样,但您可以根据自己的喜好进行更改。您可以在位于以下位置的默认配置文件中阅读有关这些设置的更多信息:
/etc/php/7.0/fpm/pool.d/www.conf
剩下的唯一一件事就是告诉 Apache 使用 PHP-FPM 而不是 mod_php。首先,确保您已启用 mod_actions 和 mod_fastcgi:
$ sudo a2enmod actions fastcgi
$ sudo service apache2 restart
将 PHP-FPM fastcgi 处理程序添加到 Apache。您必须为每个想要使用 PHP-FPM 的用户执行此操作。编辑每个 vhost 文件的用户名,通常位于:
/etc/apache2/sites-available/username.conf
在顶部添加以下内容:
<IfModule mod_fastcgi.c>
AddHandler php7-fcgi-username .php
Action php7-fcgi-username /php7-fcgi-username
Alias /php7-fcgi-username /usr/lib/cgi-bin/php7-fcgi-username
FastCgiExternalServer /usr/lib/cgi-bin/php7-fcgi-username -socket /run/php/php7.0-fpm.username.sock -pass-header Authorization
</IfModule>
再次,将“用户名”替换为虚拟主机用户的实际名称。
您必须告诉您的 vhost 实际将其用于 .php 文件,因此在同一个文件中,但在 <VirtualHost> 指令中,添加以下行:
<IfModule mod_fastcgi.c>
<FilesMatch ".+\.ph(p[3457]?|t|tml)$">
SetHandler php7-fcgi-username
</FilesMatch>
</IfModule>
再次将“用户名”替换为实际的 vhost 用户的名称并保存文件。它是很重要SetHandler 指令应使用 Apache 条件文件系统容器标记 <Location>、<LocationMatch>、<Files> 或 <FilesMatch> 的子集进行编写。省略此项将导致 SetHandler 被忽略。<Directory> 标记显然不能满足要求。
如果你想利用 PHP-FPM 的“status”和“ping”功能,并在 per-vhost 池文件中启用它们,/etc/php/7.0/fpm/pool.d目录(参见/etc/php/7.0/fpm/pool.d/www.conf(有关详细信息),您需要对 Apache2 设置进行另外两项修改。行动每个 vhost .conf 文件顶部的指令必须以“virtual”结尾,因此:
Action php7-fcgi-username /php7-fcgi-username virtual
此外,您的 SetHandler 包装器必须指定包含这些虚拟文件的正则表达式。我使用以下内容:
<LocationMatch ".+\.ph(p[3457]?|t|tml)|/(ping|status)$">
SetHandler ....
</LocationMatch>
现在剩下的就是让 Apache 重新加载其配置文件:
$ sudo service apache2 reload
要查看您的更改是否生效,请在您网站的公共目录中创建一个 phpinfo.php 文件并在浏览器中访问它:
<?php phpinfo();
页面顶部附近显示的服务器 API 应显示“FPM/FastCGI”。
要完成此过程,您应该为每个虚拟主机重复这些步骤。当您完全确定mod_php不再使用,您可以通过以下方式禁用它:
$ sudo a2dismod php7.0
在您完成此操作之前,Apache 仍将为每个请求包含一个 PHP 进程,这意味着内存使用量将保持不变,甚至可能更高。