- Arch Linux 2011.08.19(Linux 3.4.2 i686)
- 带有 SuExec 的 Apache 2.2.22
- PHP 5.4.4 (cli) 通过 FastCGI
我的网站之前都运行良好......我不确定什么时候发生的,因为我是在一周后才注意到的(我猜可能是在系统升级之后),但我的所有 VirtualHosts 都离线了,出现了可怕的“脚本头过早结束:php-fcgid-wrapper”500 错误。
SuExec 日志为每个站点提供了以下信息:
[2012-07-16 00:45:02]: uid: (1001/site) gid: (1001/site) cmd: php-fcgid-wrapper
[2012-07-16 00:45:02]: command not in docroot (/var/www/site/fcgi-bin/php-fcgid-wrapper)
这不是(或至少不应该是)事实……我自动编译 Apache用--with-suexec-docroot=/srv/www
set。不过,我还是尝试了健全性检查,看看 docroot SuExec 实际上认为它有什么:
$ suexec -V
suexec policy violation: see suexec log for more details
日志中声称:
[2012-07-16 01:07:52]: too few arguments
也尝试过使用 sudo;结果一样。所以,这也没有意义,并且使我无法正确诊断问题。
我尝试的另一件事是将所有内容从/srv/www
移至/var/www
默认的 docroot,以查看是否在升级过程中恢复为原始存储库版本。更新了我的 VirtealHosts,重新启动了 Apache,但仍然出现相同的 500 错误。
还有什么原因造成这种情况?
答案1
您需要重新编译 suexec.c --with-suexec-docroot=/srv/www
答案2
您不需要重新编译它。您可以使用此包在 debian 或 ubuntu 上设置自定义路径:
apt-get install apache2-suexec-custom
安装软件包后,会有一个特殊目录,您可以在其中为每个用户设置 suexec 路径。应该有一个针对 www-data 用户的示例文件:
/etc/apache/suexec/<some-user-name>
如果你没有 Debian 或 Ubuntu,你必须寻找这样的包或使用正确的 docroot 重新编译 suexec(请参阅suexec 文档)。参数为:
--with-suexec-docroot=DIR
您必须检查如何为您的发行版执行此操作。
答案3
使用以下命令查找 fcgid 配置:
/usr/lib/apache2/suexec -V
-D AP_DOC_ROOT="/var/www"
-D AP_GID_MIN=100
-D AP_HTTPD_USER="www-data"
-D AP_LOG_EXEC="/var/log/apache2/suexec.log"
-D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"
-D AP_UID_MIN=100
-D AP_USERDIR_SUFFIX="public_html"
包装器必须写入目录树:AP_DOC_ROOT 才能被访问和运行。
答案4
有一个 www-data 文件(/etc/apache2/suexec/www-data),其中有两行:
/var/www
/public/cgi-bin/
你可以把这些行改成你喜欢的