Php

(proxy_fcgi:error) AH01071: Got error ‘Unable to open primary script:’ (沒有這樣的文件或目錄)

  • April 22, 2020

來自 StackOverflow的 X-post

我已經閱讀了無數關於此的論壇文章,但沒有一個答案似乎對我的情況有所幫助。這是日誌摘錄:

[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/ProxyOverride(SetHandler 是由rebuildhttpdconf 自動為我創建的,我不認為這是問題,因為它適用於測試子域;ProxyOverride 似乎沒有做任何事情)
  • 設置 wordpress .htaccess(已經到位並與此處顯示的內容匹配。同樣,測試子域正在工作,它是一個別名,就像 www 一樣)

伺服器統計:

  • EasyApache 4 與

    • 阿帕奇 2.4.43

      • mod_proxy_fcgi
    • PHP 7.3

      • php73-php-fpm

無論您考慮什麼,請記住,測試子域中的文件與主域(包括 .htaccess)中的文件幾乎沒有區別;它們都別名到同一個目錄。我能看到的唯一區別是 test 是一個註冊的子域,因此 httpd.conf 處理它與主域略有不同。但是,我不能只通過 cPanel 添加一個“www”子域——它不會讓我這樣做——可能是因為它無論如何都會給 www 取別名。

我一直在努力解決這個問題,我的公共網站已經關閉了 24 小時以上,所以我非常感謝你能提供的任何幫助!

附錄:

我不知道它是否相關(它似乎沒有影響我的舊 Rails 應用程序),但在 WHM > Manage SSL Hosts 下,我的主域和 www 子域指向 的文件根目錄/home/user-account/public_html,而我的子域指向正確的相應的目錄。

我還嘗試將主域上的虛擬主機設置為使用測試目錄(與測試子域相同),但它給了我同樣的錯誤。我認為這不是權限/文件問題。

我還在/public_html目錄中創建了一個 test.php 文件,以便測試直接訪問。它仍然出錯並記錄:

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

答案是我必須通過 PHP-FPM 配置為給定域設置 doc_root。為什麼?我不知道 - 如果有人可以對此有所了解,我寧願不必通過 FPM 配置來做事,如果可能的話,可以通過 Apache 進行設置。我不必為子域執行此操作…

引用自:https://serverfault.com/questions/1013628