Apache FastCgi、PHP-FPM、Suexec 权限被拒绝错误

Posted

技术标签:

【中文标题】Apache FastCgi、PHP-FPM、Suexec 权限被拒绝错误【英文标题】:Apache FastCgi, PHP-FPM, Suexec Permission Denied Error 【发布时间】:2014-11-13 23:50:52 【问题描述】:

我已经设置了 Apache2.4 + FastCgi、php-FPM、SuExec,在没有 Suexec 的情况下也可以正常工作。但是当我启用 Suexec 时,它给我的文件不存在错误(访问 php 脚本时浏览器中出现 404 Not Found Error)。

注意:当我打开 OFF "FastCgiWrapper" 时 PHP 脚本通过 PHP-FPM 工作,但是当我打开时它给我 404 错误.

Apache 错误日志(最后一行)

[authz_core:debug] [pid 3906:tid 140546979436288] mod_authz_core.c(802): [client 192.168.91.132:58225] AH01626: authorization result of Require all granted: granted
[authz_core:debug] [pid 3906:tid 140546979436288] mod_authz_core.c(802): [client 192.168.91.132:58225] AH01626: authorization result of <RequireAny>: granted
[authz_core:debug] [pid 3906:tid 140546979436288] mod_authz_core.c(802): [client 192.168.91.132:58225] AH01626: authorization result of Require all granted: granted
[authz_core:debug] [pid 3906:tid 140546979436288] mod_authz_core.c(802): [client 192.168.91.132:58225] AH01626: authorization result of <RequireAny>: granted
[core:info] [pid 3906:tid 140546979436288] [client 192.168.91.132:58225] AH00128: File does not exist: /etc/apache2/fcgi-app/info.php

配置:

/etc/apache2/mods-available/fastcgi.conf

FastCgiWrapper On

/etc/apache2/suexec/www-data

/var/www/html
/cgi-bin

/etc/apache2/sites-available/example.net.conf

<VirtualHost *:80>
        ServerName example.net
        ServerAdmin example@example.net
        DocumentRoot /var/www/html/example.net/public_html
        LogLevel debug
        ErrorLog $APACHE_LOG_DIR/error.log

    SuexecUserGroup example examplegrp
    AddHandler php-fcgi-hand .php
    Action php-fcgi-hand /php-fcgi-uri
    Alias /php-fcgi-uri fcgi-app
    FastCgiExternalServer fcgi-app -socket /var/run/php5-fpm-example.sock -pass-header Authorization -idle-timeout 30000 -flush

    <Location /php-fcgi-uri>
            Require all granted
    </Location>

</VirtualHost>

/etc/php5/fpm/pool.d/example.conf

[example]
user  = example
group = examplegrp
listen = /var/run/php5-fpm-example.sock
listen.owner = example
listen.group = examplegrp
listen.mode = 0666
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

/var/www/html/example.net/cgi-bin/php.cgi

#!/bin/sh 
PHP_FCGI_CHILDREN=5
export PHP_FCGI_CHILDREN
PHP_FCGI_MAX_REQUESTS=500
export PHP_FCGI_MAX_REQUESTS
exec /var/www/html/example.net/cgi-bin

文件夹结构和权限

/var/www/html/example.net/cgi-bin/php.cgi
/var/www/html/example.net/public_html/info.php

drwxrwxrwx 13 www-data www-data var
    |____drwxr-xr-x 5 www-data www-data www
        |____drwxr-xr-x 6 www-data www-data html
            |____ drwxr-xr-x 4 example  examplegrp example.net
                |______ drwxr-xr-x 2 example examplegrp cgi-bin
                    |_____-r-xr-xr-x 1 example examplegrp php.cgi

                |______ drwxr-xr-x 2 example examplegrp public_html
                    |_____-rwxr-xr-x 1 example examplegrp info.php

【问题讨论】:

除非我是盲人,否则我在这里看不到任何表明您正在使用 PHP-FPM 的东西。看来您正在使用 PHP-CGI。 FPM 使用通过套接字或 tcp 连接的池。您的示例都没有显示这种用法。 @Diemuzi 我已将 vhost 配置为使用 PHP-FPM,它工作正常,但是当我打开“FastCgiWrapper”时,它给了我错误“404 Not Found”。请检查我更新的问题。 【参考方案1】:

我很久以前就编写了这个工作配置,它适用于 Apache 2.4.x,所以我建议你尝试一下https://gist.github.com/diemuzi/3849349。它太大了,无法在此处发布答案。您将找到所需的所有配置。与您在此处发布的内容相比,您甚至可能会看到我所做的一些不同的事情。

但是,我也建议您停止考虑使用 FastCgiExternalServer,就像您正在尝试的那样,正如您在我的示例中所发现的那样。但改为考虑使用mod_proxy_fcgi。这是现在连接到 FPM 的一种更简单的方法,并且最近它确实支持套接字。

这是mod_proxy_fcgi方式的一个例子:

# PHP-FPM via Socket
<IfModule proxy_module>
    <IfModule proxy_fcgi_module>
        ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/usr/local/php/etc/php-fpm/[USERNAME].sock|fcgi://localhost/vhosts/[DOMAIN]/public/
    </IfModule>
</IfModule>

当然,您也需要更改unix: 路径和root 文档的路径。注意localhost 部分,这不是错误。你为 localhost 放什么并不重要,但我认为它看起来更好。是的,即使上面写着localhost,我的域也可以通过 IP 和域访问,所以不要被它骗了。

如果你想使用mod_proxy_fcgi的TCP方式你也可以这样做:

# PHP-FPM via TCP
<IfModule proxy_module>
    <IfModule proxy_fcgi_module>
        <Location ~ ^/(.*\.php(/.*)?)$>
            ProxyPass fcgi://127.0.0.1:[PORT]/vhosts/[DOMAIN]/public/
        </Location>
    </IfModule>
</IfModule>

当然要确保127.0.0.1:[PORT] 与您在 FPM 池中的内容相匹配,因此请相应地进行更改。同样,请确保您也更改了文档根目录的路径。

我给你的三个答案都是有效的例子。我什至在发布此答案之前进行了测试。

【讨论】:

【参考方案2】:

您要求 Apache 以用户 example 的身份运行,但您为用户 www-data 设置了配置文件。文档说当 Apache 用户为 www-data 时,会读取配置文件 /etc/apache2/suexec/www-data。我从未尝试过,但可能需要设置配置文件/etc/apache2/suexec/example。我发现有点令人困惑的是这两个阶段:Apache 用户和目标用户,允许运行目标 cgi。 Suexec 在这两个阶段运行检查。 custom 版本的 suexec 允许不同的 Apache 用户使用不同的配置文件运行,但这与使用 SuexecUserGroup Apache 指令选择目标用户不同。我们不需要更改 Apache 用户,如果我们只想更改目标用户,即运行 CGI 的用户。为此,pristine 版本就足够了。无论如何,这是我的理解。我希望它可以帮助某人。

【讨论】:

以上是关于Apache FastCgi、PHP-FPM、Suexec 权限被拒绝错误的主要内容,如果未能解决你的问题,请参考以下文章

centos6.8配置php-fpm(php已在apache中以模块形式运行,nginx中同时以fastcgi运行)

sh 翻译:“OS X 10.10 Yosemite本地开发环境,Apache,PHP和MySQL与Homebrew”:5。配置Apache,PHP,PHP-FPM和mod_fastcgi,配置使用`

如何启用 Apache 的 PHP-FPM 多实例

FastCGI特点原理nginx与php-fpm两种通信方式对比

Nginx和php-fpm是怎么通信的

关于cgi,fastcgi,php-fpm的一些个人理解