我已经设置了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-data-
/var/www/html
/cgi-bin
/etc/apache2/可用站点/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/hp.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
我很久以前就写过这个工作配置,它可以在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和domain访问,尽管上面写着localhost
,所以不要让它欺骗你。
如果你想使用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池中的内容相匹配,所以要相应地进行更改。同样,请确保您也更改了文档根目录的路径。
我给你的三个答案都是有效的例子。我甚至在发布这个答案之前进行了测试。
您要求Apache以用户example
的身份运行,但您为用户www-data
设置了配置文件。文档中说,当Apache用户是www-data
时,会读取配置文件/etc/apache2/suexec/www-data
。我从未尝试过,但可能需要设置配置文件/etc/apache2/suexec/example
。我发现有一点令人困惑的是这两个阶段:Apache用户和目标用户,后者被允许运行目标cgi。Suexec在这两个阶段执行检查。suexec的custom
版本允许不同的Apache用户使用不同的配置文件运行,但这与使用SuexecUserGroup
Apache指令选择目标用户不同。我们不需要更改Apache用户,如果我们只想更改目标用户,即运行CGI的用户。为此,pristine
版本就足够了。不管怎样,这是我的理解。我希望它能帮助到别人。