如何配置Apache通过终端在Ubuntu 12.04上将PHP作为FastCGI运行?


35

我对UNIX命令行Web服务器管理/管理领域比较陌生。

许多带有控制面板管理选项的主机都允许您通过一个简单的选项来更改PHP的运行方式。

最常见的选择是:

  • apache模块
  • CGI申请
  • FastCGI应用

我的问题很简单,如何通过命令行更改此设置?我知道有许多用于Apache的配置文件。

我找到的最接近的东西是这个问题,但是目录结构似乎与我的操作系统不匹配(Ubuntu 12.04)。

我很困惑,似乎没有一个明确的指南,我可以找到似乎很常见的东西来详细说明此过程。如果存在,请原谅我...如果存在,请指出正确的方向。


我找到的最接近的东西是在SO上的那个问题,该网站不是Stack Overflow。
ta.speot。是

1
在fastcgi上解释得很好。

1
@ ta.speot.is 宽恕pleaassuh。谢谢Matt,我当然浏览了fastcgi.com,但是我发现这些说明有些难以遵循。
伊万·马特森

@ ta.speot.is,简单的错字。他的意思是“ SE”而不是“ SO”。
Pacerier,2015年

Answers:


49

感谢以前的回答,他们一路为我提供帮助,但是要使工作正常,我必须结合一些地方的说明,以为我会写出一套完整的命令。

仅供参考,我正在运行Ubuntu 14.04,Apache 2.4,并且默认情况下还运行了modphp,以前的说明也无需禁用modphp。

我还发现http://blog.starcklin.com/2013/08/install-mod-fastcgi-and-php5-fpm-on-ubuntu/非常有用且直接。

只需一个接一个地在终端中运行以下命令。

首先安装必要的软件包(我假设已经安装了php5,因此将其省略,将其添加回第一次安装)。另外请注意,从Apache 2.4开始,您可以使用event-mpm代替worker,请参阅http://www.vps.net/blog/2013/04/08/apache-mpms-prefork-worker-and-event/。我的示例显示了worker,但是如果您愿意使用event替换单词worker。

sudo apt-get install apache2-mpm-worker

sudo apt-get install libapache2-mod-fastcgi php5-fpm

现在启用您需要的mod,并禁用不需要的mod。

sudo a2dismod php5 mpm_prefork

sudo a2enmod actions fastcgi alias mpm_worker

创建php5.fcgi文件,并授予Web服务器使用它的权限。

sudo touch /usr/lib/cgi-bin/php5.fcgi

sudo chown -R www-data:www-data /usr/lib/cgi-bin

为php5-fpm创建一个全局配置

sudo nano /etc/apache2/conf-available/php5-fpm.conf

粘贴以下内容(我们将使用套接字而不是IP地址)

<IfModule mod_fastcgi.c> 
   AddHandler php5.fcgi .php 
   Action php5.fcgi /php5.fcgi 
   Alias /php5.fcgi /usr/lib/cgi-bin/php5.fcgi 
   FastCgiExternalServer /usr/lib/cgi-bin/php5.fcgi -socket /var/run/php5-fpm.sock -pass-header Authorization -idle-timeout 3600 
   <Directory /usr/lib/cgi-bin>
       Require all granted
   </Directory> 
</IfModule>

启用php5-fpm conf

sudo a2enconf php5-fpm

重新启动Apache和FPM

sudo service apache2 restart && sudo service php5-fpm restart

按照其他说明,将以下内容粘贴到Web服务器上的新的可浏览php文件中。

<?php phpinfo();

在网络浏览器中打开您刚刚编辑的文件,如果在Server API旁边看到“ FPM / FastCGI”,则说明您正在使用FastCGI提供PHP!


4
这是一个救命稻草。旧版apache的说明在Ubuntu 14.04和apache 2.4上无效。但是这就像一个魅力。+100 !!
Bhavin Doshi 2014年

我完全按照此步骤操作,但是却收到错误消息“您没有访问/php5.fcgi/index的权限”……并且在错误日志中,“服务器配置拒绝了客户端:/ usr / lib / cgi-bin /php5.fcgi'...有什么想法吗?
真幸运2014年

弄清楚了...出于某种原因,我正在使用旧的“ order deny,allow”配置作为root用户...现在已全部修复:D
幸运的是

安装软件包和配置后出现以下错误“ apache2:/etc/apache2/apache2.conf的第216行的语法错误:/etc/apache2/conf-enabled/php5-fpm.conf的第9行的语法错误:预期</ Directory>但看到了</ IfModule>”
Farooq,2016年


20

我终于找到了一个很好的教程,专门用于执行此操作。我将概述已经安装了LAMP堆栈的步骤,但是可以在此处找到完整的教程。

新的注意事项:

在本教程中,首先使用以下命令切换到root用户:

sudo su

就我而言,我只是给这些命令加上前缀sudo而不是切换用户,因此我将以这种方式记录我的步骤。

开始

第一步:安装Apache Worker MPM(多进程模块)

sudo apt-get install apache2-mpm-worker

这取代了我安装的prefork,这是安装Apache时的默认设置。

步骤2:安装PHP5和必要的模块

sudo apt-get install libapache2-mod-fastcgi php5-fpm php5

此时,您可能会在安装'libapache2-mod-fastcgi'时出错:

Reading package lists... Done
Building dependency tree       
Reading state information... Done
Package libapache2-mod-fastcgi is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or is only available from another source

E: Package 'libapache2-mod-fastcgi' has no installation candidate

这部分不在上面的教程中

要对此进行协调,multiverse必须将存储库添加到apt源中。

去做这个:

sudo nano /etc/apt/sources.list

我在其上附加了以下几行:

deb http://archive.ubuntu.com/ubuntu precise multiverse
deb http://archive.ubuntu.com/ubuntu precise-updates multiverse
deb http://security.ubuntu.com/ubuntu precise-security multiverse

precise在这种情况下,指的是我的Ubuntu版本“ Precise Pangolin ”。

所以现在,保存这些更改并返回到终端:

sudo apt-get update

然后再次:

sudo apt-get install libapache2-mod-fastcgi php5-fpm php5

现在将(应该)工作。

现在启用以下Apache模块:

sudo a2enmod actions fastcgi alias

重新启动Apache

sudo service apache2 restart

步骤3:Apache配置

为了使Apache使用PHP-FPM,我们需要以下配置:

<IfModule mod_fastcgi.c>
    AddHandler php5-fcgi .php
    Action php5-fcgi /php5-fcgi
    Alias /php5-fcgi /usr/lib/cgi-bin/php5-fcgi
    FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -host 127.0.0.1:9000 -pass-header Authorization
    <Directory /usr/lib/cgi-bin>
        Require all granted 
    </Directory>
    #directory statement mult be on multiple lines
</IfModule>

注意:

如果您使用的是Apache的旧版本(2.3.x或更高版本),则省去了

   <Directory /usr/lib/cgi-bin> Require all granted </Directory>

您可以使用以下命令检查已安装的版本

apache2 -version

您可以将其放在全局Apache配置中(这样,所有vhost都启用了它),例如在/etc/apache2/conf.d/php5-fpm.conf(此文件不存在,因此必须创建它)中,也可以将其放置在应使用PHP-FPM的每个vhost中。

我选择走全球路线,所以:

sudo nano /etc/apache2/conf.d/php5-fpm.conf

粘贴在上面的代码块中,然后保存并退出。这个新文件将由Apache的默认配置自动加载,该默认配置将加载目录中的所有文件/etc/apache2/conf.d/

重新启动Apache:

sudo service apache2 restart

现在在文档根目录中创建以下PHP文件/var/www

sudo nano /var/www/info.php

加:

<?php phpinfo();

保存并退出。

现在,我们在浏览器中调用该文件(例如http://your-server-ip/info.php

在顶部的Server API下,您应该看到FPM/FastCGI

成功!

有关如何将PHP-FPM更改为使用unix套接字而不是默认TCP端口或如何为单个虚拟主机(而不是所有虚拟主机)进行配置的更多信息,请参阅顶部链接的源教程。


我必须在</ IfModule>之前添加它:<Directory / usr / lib / cgi-bin>要求所有授予的</ Directory>
Rimu Atkinson 2014年

@RimuAtkinson是正确的,默认情况下,所有目录在更高版本中都是禁止的,因此您必须专门授予对cgi-bin目录的访问权限。这应该添加到答案中,因为如果没有它,您将得到
403。– johnrom

感谢您的指导!请注意,Require all granted仅从Apache 2.4开始才需要该功能。如果我将其放在Apache 2.2的配置文件中,它将失败。
leemes

我加了一条纸条。(随时对其进行精细编辑;这是您的帖子。)。有关详细信息,请参见stackoverflow.com/a/22040167/592323
leemes

1
这个答案在ubuntu 14.04上不起作用。请参考JDawgg的答案以在14.04中完成。
Bhavin Doshi 2014年

1

在执行已接受答案的步骤后,在Ubuntu 14.04中,编辑/etc/apache2/conf-available/php5-fpm.conf

<IfModule mod_fastcgi.c>
    AddHandler php5-fcgi .php
    Action php5-fcgi /php5-fcgi
    Alias /php5-fcgi /usr/lib/cgi-bin/php5-fcgi
    FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -socket /var/run/php5-fpm.sock -pass-header Authorization -idle-timeout 3600
    <Directory /usr/lib/cgi-bin>
        Require all granted
    </Directory>
</IfModule>

然后执行

#sudo a2enconf php5-fpm
#sudo apache2 restart

0

如果有人在Ubuntu 16.04上执行此操作,并且已从php 7降级到php 5.6(Ondrej),则必须替换一些行(基于JDawgg的回答):

sudo apt-get install libapache2-mod-fastcgi php5-fpm安装到:

sudo apt-get install libapache2-mod-fastcgi php5.6-fpm 

须藤a2dismod php5 mpm_prefork到:

sudo a2dismod php5.6 mpm_prefork

须藤纳米/etc/apache2/conf-available/php5-fpm.conf到:

sudo vim /etc/apache2/conf-available/php5.6-fpm.conf

php5.6-fpm的安装过程已经创建了该文件,因此无需创建一个。但是,我删除了该文件上的所有现有文本,因为它原本是针对mod_php5的。

<IfModule mod_fastcgi.c> 
   AddHandler php5.fcgi .php 
   Action php5.fcgi /php5.fcgi 
   Alias /php5.fcgi /usr/lib/cgi-bin/php5.fcgi 
   FastCgiExternalServer /usr/lib/cgi-bin/php5.fcgi -socket /var/run/php/php5.6-fpm.sock -pass-header Authorization -idle-timeout 3600 
   <Directory /usr/lib/cgi-bin>
       Require all granted
   </Directory> 
</IfModule>

我将文件路径从/var/run/php5-fpm.sock更改为/var/run/php/php5.6-fpm.sock。

须藤a2enconf php5-fpm至:

sudo a2enconf php5.6-fpm

sudo服务apache2重新启动&& sudo服务php5-fpm重新启动为:

sudo service apache2 restart && sudo service php5.6-fpm restart

我希望这可以帮助其他像我这样的新手:)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.