Apache-2.2

在 Apache 上為不同的 URL 執行多個 PHP-FPM 池?

  • March 14, 2016

由於 PHP 應用程序各部分的優先級不同,這裡的目標是有一個池用於一般用途,另一個池用於/api/*URL。更複雜的是,該應用程序使用內部 URL 路由,因此無法僅通過 . 來區分這兩種情況FilesMatch

我從這個開始:

<FilesMatch "\.php$">
   SetHandler proxy:fcgi://127.0.0.1:9000
</FilesMatch>

<LocationMatch "^/api/">
   SetHandler proxy:fcgi://127.0.0.1:9001
</LocationMatch>

這是在全域上下文中,在 VirtualHost 指令之外,因為有多個虛擬主機,都具有相同的要求。

它不起作用,所有 URL 都由第一個池( at 的那個:9000)處理。

任何想法如何創建此配置?這適用於 Apache 2.4。

好的,用If. 顯然,翻譯REQUEST_URI: 在If評估時發生了一些有趣的事情,它不包含我需要的內容,所以我匹配THE_REQUEST了包含逐字 HTTP 請求的內容。這是我的解決方案的樣子:

<FilesMatch "\.php$">
   # First pool, catches everything
   SetHandler proxy:fcgi://127.0.0.1:9000
   SetEnv PHP_POOL_ID "1"
</FilesMatch>

<If "%{THE_REQUEST} =~ m#/api/#">
   # Second pool, only for certain URLs
   SetHandler proxy:fcgi://127.0.0.1:9001
   SetEnv PHP_POOL_ID "2"
</If>

這些SetEnv語句僅用於調試,它們可以在日誌中用於跟踪哪個池已為請求提供服務,例如:

CustomLog "/var/log/httpd/php_pool.log" "%h %l %u %t \"%r\" %>s %b php:%{PHP_POOL_ID}e" env=PHP_POOL_ID

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