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

时间:2014-09-19 11:33:25

标签: apache ubuntu fastcgi php suexec

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

注意:当我将关闭“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数据

/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

2 个答案:

答案 0 :(得分: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放了什么并不重要,但我觉得它看起来更好。是的,我的域名可以通过IP和域访问,即使它显示localhost所以不要让它欺骗你。

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

# 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池中的内容相匹配,因此请相应更改。同样,请确保您也更改了文档根目录的路径。

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

答案 1 :(得分:0)

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

相关问题