X-post来自 StackOverflow
我读过无数关于此问题的论坛帖子,但似乎没有一个答案能解决我的情况。以下是日志摘录:
[proxy_fcgi:error] [pid XXXX] [client redacted] AH01071: Got error 'Unable to open primary script: /home/user-account/public_html/www/index.php (No such file or directory)'
我已经手动验证该文件可以通过 SSH 读取;此外,其他非 php 文件也可以通过浏览器访问。
我的目录结构如下:
/home/user-account
/home/user-account/apps
/home/user-account/apps/old
/home/user-account/apps/current
/home/user-account/public_html
/home/user-account/public_html/old > symlink to > /home/user-account/apps/old
/home/user-account/public_html/test > symlink to > /home/user-account/apps/current
/home/user-account/public_html/www > symlink to > /home/user-account/apps/current
我在'domain.com'上有2个子域名:
old.domain.com
test.domain.com
因此,根据 cPanel/WHM/Apache 写出其虚拟主机的方式(考虑 ServerAlias 指令),最终的域结构是:
old.domain.com
www.old.domain.com (I ignore this)
test.domain.com
www.test.domain.com (I ignore this)
domain.com (.htaccess redirects to www.domain.com)
www.domain.com (This is the domain with the issue; also domain.com would be an issue if not for the redirect)
到目前为止,我一直在真实目录 下开发我的 wordpress 网站/home/user-account/public_html/test
。该网站运行良好。然后我决定上线。我将真实文件夹移动到其当前位置(/home/user-account/apps/current
)并/home/user-account/public_html/test
对其进行符号链接。我重新启动了 Apache 并验证该test.domain.com
网站仍按预期运行(测试符号链接)。对符号链接设置充满信心,我删除了原始符号链接/home/user-account/public_html/www
(指向 的旧 rails 应用程序/home/user-account/apps/old
),并创建了一个指向 的新符号链接/home/user-account/apps/current
。问题就是从这时开始的。
httpd.conf:
测试子域和主域(带有 www 别名)之间唯一明显的区别是,测试子域的自动生成指令指向真正的别名文件夹位置(DocumentRoot/Directory/ScriptAlias 都使用/home/user-account/public_html/test
)。我相信这是因为我使用 cPanel 创建了一个子域,该子域必须指向 内的目录/home/user-account/public_html
。但主域的自动生成指令都指向/home/user-account/public_html
而不是/home/user-account/public_html/www
。
然而,apache 2.4 允许我通过将 custom.conf 文件放在适当的目录中来包含自定义虚拟主机配置选项。因此,对于测试子域,我不需要它们中的任何一个,但对于主域,我必须使用它们;我知道它们正在工作,因为错误日志(位于本文顶部)显示它使用了正确的 DocumentRoot。以下是 std custom.conf 的摘录,显示除了设置 DocumentRoot 之外,我还明确覆盖了其他自动生成的指令:
DocumentRoot /home/user-account/public_html/www
<IfModule mod_include.c>
<Directory "/home/user-account/public_html/www">
SSILegacyExprParser On
</Directory>
</IfModule>
<IfModule alias_module>
ScriptAlias /cgi-bin/ /home/user-account/public_html/www/cgi-bin/
</IfModule>
<IfModule ssl_module>
<Directory "/home/user-account/public_html/www/cgi-bin">
SSLOptions +StdEnvVars
</Directory>
</IfModule>
文件权限:
我没有更改文件权限的原始设置,而且我已经验证了它们是正确的。再次,一切test.domain.com
按预期运行。只是(www.?)domain.com
情况并非如此。
其他没有起到任何作用的“修复”:
- 重建/重新启动 PHP-FPM(无效)
- 设置处理程序/代理覆盖(SetHandler 是由 rebuildhttpdconf 自动为我创建的,我不认为这是问题所在,因为它正在为测试子域工作;ProxyOverride 似乎没有做任何事情)
- 设置 wordpress .htaccess(已到位并符合此处显示的内容。再次强调,测试子域名正在运行,它是一个别名,就像 www 一样)
服务器统计:
- EasyApache 4 具有
- Apache 2.4.43
- 修改代理服务器
- PHP 7.3
- php73-php-fpm
- Apache 2.4.43
无论您考虑什么,请记住,测试子域和主域(包括 .htaccess)中的文件几乎没有区别;它们都别名为同一个目录。我能看到的唯一区别是 test 是一个注册的子域,因此 httpd.conf 处理它的方式与主域略有不同。但是我不能通过 cPanel 添加“www”子域 - 它不允许我这样做 - 可能是因为它无论如何都会别名为 www。
我一直在努力尝试解决这个问题,我的公共网站已经宕机超过 24 个小时了,因此我将非常感谢您提供的任何帮助!
附录:
我不知道它是否相关(它似乎没有影响我的旧 rails 应用程序),但在 WHM > 管理 SSL 主机下,我的主域和 www 子域指向文档根目录/home/user-account/public_html
,而我的子域指向正确的各自目录。
我还尝试在主域上设置 vhost 以使用测试目录(与测试子域相同),但它给出了相同的错误。我不认为这是权限/文件问题。
我还在目录中创建了一个 test.php 文件/public_html
,以测试直接访问。它仍然出错并记录:
AH01071: Got error 'Unable to open primary script: /home/user-account/public_html/www/index.php (No such file or directory)', referer: https:// domain.com/test.php
答案1
答案是我必须通过给定域的 PHP-FPM 配置设置 doc_root。为什么?我不知道 - 如果有人可以解释一下,我宁愿不必通过 FPM 配置来做事情,而是尽可能通过 Apache 来设置它。我不需要为子域执行此操作...