Nginx

Joomla、Nginx 和 FastCGI 記憶體

  • January 29, 2019

我正在將我託管的一些 Joomla 站點從 LAMP 堆棧移動到 LEMP 堆棧上。我已按照指南啟動並執行 FastCGI 記憶體,並且在文件根目錄中使用單個 time.php 文件,我可以看到記憶體正在工作。

但是,當我從同一個 Web 伺服器載入我的 Joomla 站點時,記憶體沒有起作用。

如果我在訪問 Joomla 網站的首頁時使用 CURL 分析標題,我可以看到以下內容:

Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
X-Cache: MISS

最後一個 X-Cache 條目是我作為指南的一部分添加的自定義標頭,只是為了指示是否正在使用記憶體。但是,其他兩個條目必須在某個時候由 Joomla 生成,這似乎與記憶體沒有被使用有關。(當我 CURL 之前提到的 time.php 文件時,這兩行失去了,因為這不是 Joomla 站點的一部分。)

我知道這裡可能發生了一些特定於 Joomla 的事情,所以我會問如何改變 Joomla 在 Joomla 論壇上的行為。

我對 SE 的問題略有不同:Cache-Control 和 Pragma 條目是否負責阻止我的站點使用 FastCGI 記憶體,有什麼我可以添加到 nginx conf 文件中來刪除這些條目的嗎?

兩個問題,兩個答案:

Cache-Control 和 Pragma 條目是否負責阻止我的站點使用 FastCGI 記憶體?

是的,他們是。

實際上它是“Cache-Control”標頭。在過去的 HTTP 1.0 中,“Pragma”標頭從未設計為 HTTP 響應標頭(應該只是 HTTP 請求標頭)。

有什麼我可以添加到 Nginx conf 文件中來刪除這些條目的嗎?

是的,你可以——但也許你不應該。

**記憶體私人內容可能會導致災難,因為您可以向每個未知訪問者顯示 CMS 管理面板。**您必須檢查 CMS 是否為每個訪問者創建了一個新會話,或者這是否僅適用於後端使用者。如果 CMS 為每個訪問者創建一個會話,我建議不要記憶體。如果不是這種情況,但 CMS 提供了這些“不可記憶體”標頭,您可以使用 Nginx 覆蓋此行為。

在我看來,您不應該在 Web 伺服器中覆蓋程序員在 CMS 程式碼中所做的事情。但我們並不生活在一個完美的世界裡。很少有優秀的 CMS 編碼人員知道他們在 Cache-Control 標頭方面做了什麼。

只要沒有會話 cookie,我在這裡描述的覆蓋就會忽略 CMS 的 Cache-Control 標頭。因此可以記憶體公共頁面。但是,如果客戶端打開後端的登錄頁面,則會啟動會話並設置會話 cookie。由於會話cookie,該客戶端的所有後續請求都將在不使用記憶體數據的情況下得到響應。

如何覆蓋:

  1. 您必須確定會話 cookie 的名稱(例如 PHPSESSID)。

  2. 調整你的 Nginx 配置。請參閱下面的範例:

# deliver static files or handle URL by CMS
location / {
   try_files               $uri @php;
}

# execute directly addressed PHP files
location ~ \.php$ {
   try_files               /467e1r1afrptaubui2oum6r95ssy9zbe.htm @php;
}

# common php handler
location @php {
   try_files               $uri /index.php?url=$uri&$query_string;

   include                 fastcgi_params;

   fastcgi_pass            unix:/run/php/php7.2-fpm.sock;
   fastcgi_index           index.php;
   fastcgi_param           SCRIPT_FILENAME  $document_root$fastcgi_script_name;
   fastcgi_param           SCRIPT_NAME      $fastcgi_script_name;

   # caching
   fastcgi_cache           phpfpm;
   fastcgi_cache_key       "$request_method $scheme://$host$request_uri";
   fastcgi_cache_use_stale updating error timeout invalid_header http_500;
   # overwrite: cache web pages and permanent redirects for one hour
   fastcgi_cache_valid     200 301 3600s;

   # pass header Set-Cookie and Cookie
   fastcgi_pass_header     Set-Cookie;
   fastcgi_pass_header     Cookie;
   # ignore header Cache-Control, Expires and Vary
   fastcgi_ignore_headers  Cache-Control Expires Vary;
   # hide headers Expires, Pragma, Vary
   fastcgi_hide_header     Expires;
   fastcgi_hide_header     Pragma;
   fastcgi_hide_header     Vary;

   # do not cache if cookie PHPSESSID exists
   fastcgi_no_cache        $cookie_PHPSESSID;
   fastcgi_cache_bypass    $cookie_PHPSESSID;
}
  1. 測試您的設置。

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