Php

跳過站點某些區域的 nginx PHP 記憶體?

  • June 30, 2013

我剛剛使用 nginx(我是新手)和 PHP 建立了一個新伺服器。在我的網站上,基本上有 3 種不同類型的文件:

  • 靜態內容,如 CSS、JS 和一些圖像(大多數圖像位於外部 CDN 上)
  • 主要的 PHP/MySQL 數據庫驅動網站,本質上就像一個靜態網站
  • 動態 PHP/MySQL 論壇

我從這個問題這個頁面了解到,靜態文件不需要特殊處理,將盡快提供。

我按照上述問題的答案為 PHP 文件設置記憶體,現在我有這樣的配置:

location ~ \.php$ {
   try_files $uri =404;

   fastcgi_cache one;
   fastcgi_cache_key $scheme$host$request_uri;
   fastcgi_cache_valid  200 302 304 30m;
   fastcgi_cache_valid  301 1h;

   include /etc/nginx/fastcgi_params;
   fastcgi_pass unix:/var/run/php-fastcgi/php-fastcgi.socket;
   fastcgi_index index.php;
   fastcgi_param SCRIPT_FILENAME /srv/www/example$fastcgi_script_name;
   fastcgi_param HTTPS off;
}

但是,現在我想防止在論壇上記憶體(對於所有人或僅對於登錄使用者 - 尚未檢查後者是否適用於論壇軟體)。我聽說位置塊內有“如果是邪惡的”,所以我不確定如何繼續。如果在 location 塊中,我可能會在中間添加這個:

if ($request_uri ~* "^/forum/") {
   fastcgi_cache_bypass 1;
}
# or possible this, if I'm able to cache pages for anonymous visitors
if ($request_uri ~* "^/forum/" && $http_cookie ~* "loggedincookie") {
   fastcgi_cache_bypass 1;
}

這會正常工作,還是有更好的方法來實現這一目標?

如果在伺服器塊中,您可以使用它是非常安全的。相關行的工作範例:

server {
   listen   80;
...skip...
   if ($uri ~* "/forum" ) {set $no_cache 1;}
...skip...

   location ~ \.php$ {

       fastcgi_cache_bypass $no_cache;
       fastcgi_no_cache $no_cache;

     ...other fastcgi-php content...
}

另一種解決方法是在預設位置塊上方設置一個單獨的位置塊,以擷取並以不同方式處理髮往論壇的內容:

location ~ ^/forum/.*\.php$ {
   // forum php setup here
}
location ~ \.php$ {
   // regular php setup here
}

它並不完全是 DRY,但當您在 6 個月後重新閱讀時,它很簡單易讀。

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