Php-Fpm

Apache 2.4 + PHP-FPM + ProxyPassMatch

  • January 25, 2020

我最近在我的本地機器上安裝了 Apache 2.4,以及使用 PHP-FPM 的 PHP 5.4.8。

一切都很順利(過了一會兒……),但仍然有一個奇怪的錯誤:

我為 PHP-FPM 配置了 Apache,如下所示:

<VirtualHost *:80>
   ServerName localhost
   DocumentRoot "/Users/apfelbox/WebServer"
   ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/Users/apfelbox/WebServer/$1
</VirtualHost>

它有效,例如,如果我打電話http://localhost/info.php我得到正確的phpinfo()(它只是一個測試文件)。

但是,如果我呼叫一個目錄,我會File not found.在錯誤日誌中得到一個帶有正文的 404:

[Tue Nov 20 21:27:25.191625 2012] [proxy_fcgi:error] [pid 28997] [client ::1:57204] AH01071: Got error 'Primary script unknown\n'

更新

我現在嘗試使用 mod_rewrite 進行代理:

<VirtualHost *:80>
   ServerName localhost
   DocumentRoot "/Users/apfelbox/WebServer"

   RewriteEngine on    
   RewriteCond %{REQUEST_FILENAME} !-d
   RewriteRule ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/Users/apfelbox/WebServer/$1 [L,P]
</VirtualHost>

但問題是:它總是重定向,因為http://localhost/自動http://localhost/index.php請求,因為

DirectoryIndex index.php index.html

更新 2

好的,所以我認為“也許先檢查是否有文件要提供給代理:

<VirtualHost *:80>
   ServerName localhost
   DocumentRoot "/Users/apfelbox/WebServer"

   RewriteEngine on    
   RewriteCond %{REQUEST_FILENAME} !-d
   RewriteCond %{REQUEST_FILENAME} -f
   RewriteRule ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/Users/apfelbox/WebServer/$1 [L,P]
</VirtualHost>

現在完全重寫不再起作用了……

更新 3

現在我有這個解決方案:

<VirtualHost *:80>
   ServerName localhost
   DocumentRoot "/Users/apfelbox/WebServer"

   RewriteEngine on    
   RewriteCond /Users/apfelbox/WebServer/%{REQUEST_FILENAME} -f
   RewriteRule ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/Users/apfelbox/WebServer/$1 [L,P]
</VirtualHost>

首先檢查是否有文件要傳遞給 PHP-FPM(帶有完整路徑和絕對路徑),然後進行重寫。

在子目錄中使用 URL 重寫時,這不起作用,對於像http://localhost/index.php/test/ So back to square one 這樣的 URL,它也會失敗。


有任何想法嗎?

經過數小時的搜尋和閱讀 Apache 文件,我想出了一個解決方案,它允許使用池,並且即使 url 包含 .php 文件,也允許 .htaccess 中的 Rewrite 指令工作。

<VirtualHost ...>

...

# This is to forward all PHP to php-fpm.
<FilesMatch \.php$>
  SetHandler "proxy:unix:/path/to/socket.sock|fcgi://unique-domain-name-string/"
</FilesMatch>

# Set some proxy properties (the string "unique-domain-name-string" should match
# the one set in the FilesMatch directive.
<Proxy fcgi://unique-domain-name-string>
  ProxySet connectiontimeout=5 timeout=240
</Proxy>

# If the php file doesn't exist, disable the proxy handler.
# This will allow .htaccess rewrite rules to work and 
# the client will see the default 404 page of Apache
RewriteCond %{REQUEST_FILENAME} \.php$
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_URI} !-f
RewriteRule (.*) - [H=text/html]

</VirtualHost>

根據 Apache 文件,SetHandler 代理參數需要 Apache HTTP Server 2.4.10。

我希望這個解決方案也能幫助你。

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