2012-02-10 92 views
15

我試圖緩存基本上在虛擬服務器配置下面的路徑內的靜態內容。由於某些原因文件沒有被緩存。我看到緩存目錄中的幾個文件夾和文件,但它總是像20mb不高不低。例如,如果緩存圖片需要至少500mb的空間。nginx作爲緩存代理不緩存任何

這裏是nginx.conf緩存部分:

** nginx.conf ** 
proxy_cache_path /usr/share/nginx/www/cache levels=1:2 keys_zone=static$ 
proxy_temp_path /usr/share/nginx/www/tmp; 
proxy_read_timeout 300s; 

繼承人的默認虛擬服務器。

**sites-available/default** 
server { 
    listen 80; 

    root /usr/share/nginx/www; 
    server_name myserver; 
    access_log /var/log/nginx/myserver.log main; 
    error_log /var/log/nginx/error.log; 

    proxy_set_header Host $host; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

    location ~* ^/(thumbs|images|css|js|pubimg)/(.*)$ { 
      proxy_pass http://backend; 
      proxy_cache static; 
      proxy_cache_min_uses 1; 
      proxy_cache_valid 200 301 302 120m; 
      proxy_cache_valid 404 1m; 
      expires max; 
    } 

    location/{ 
      proxy_pass http://backend; 
    } 
} 
+0

緩存狀態有土特產品tryed打開錯誤日誌? – 2012-02-10 17:47:36

+1

是的。沒有結論。 – 2012-02-10 18:07:50

回答

35

確保您的後端不返回Set-Cookie標頭。如果Nginx看到它,它會禁用緩存。

如果這是你的情況,最好的選擇是修復你的後端。當固定後端是不是一種選擇,它可能指示Nginx的忽略Set-Cookie

proxy_ignore_headers "Set-Cookie"; 
proxy_hide_header "Set-Cookie"; 

documentation

proxy_ignore_header將確保高速緩存發生。 proxy_hide_header將確保Cookie有效內容不包含在緩存的有效內容中。這對避免通過NGINX緩存泄漏cookie非常重要。

+4

實際上它沒有設置cookie,但緩存控制。我發現IIS實際上是在緩存靜態文件,而對nginx的響應是不會長時間緩存這些文件,因爲它已經緩存了它。一旦我從iis緩存中刪除這些文件,它就起作用了。 :) – 2012-02-10 19:14:28

+1

我愛你,你救了我的夜晚! – micred 2013-10-21 20:13:07

+0

和我的夜晚......剩下什麼吧 – mkoryak 2014-02-20 02:42:08

10

我想補充說,多個配置選項和組合可以在Nginx中禁用代理緩存。不幸的是,這是記錄不完善。

在我的配置中,我設置了proxy_buffering on並按預期啓用了緩存。

+1

那麼,'proxy_buffering on'如何關聯,請你解釋一下嗎? – Meglio 2016-03-18 08:01:42

+0

我正在尋找一些關於代理緩衝和代理緩存之間關係的官方文檔,但是我找不到任何可以引用的好資源。我添加了這個答案,因爲關閉'proxy_buffering'只是禁用任何配置的緩存行爲,沒有警告或其他任何東西。 我的猜測是,沒有緩衝nginx無法存儲,從而緩存來自它正在代理的服務器的響應。 這個答案暗示了一些事情,甚至可以問問Tero Kilkanen誰給了答案:http://serverfault.com/a/692585/144118 – Overbryd 2016-03-18 10:57:38

+0

讓我有一天。我花了3天!弄清楚我們的配置有什麼****錯誤。非常感謝@Overbryd,從我的內心深處。 – 2016-04-03 13:37:13

0

對於它的價值,我的經驗是,nginx並不總是緩存你告訴它的東西。

例如,在centos7,與配置選項

proxy_cache_path /tmp/my_nginx_cache levels=1:2 keys_zone=my_zone:10m inactive=24h max_size=1g; 

的nginx實際上是在緩存中的文件:通過多個答案和意見會後

/tmp/systemd-private-phJlfG/tmp/my_nginx_cache 
+2

這可能是systemd或RedHat的補丁。嘗試systemctl cat nginx.service,看看是否有一個選項給予chroot它或類似的東西 – Jason 2016-04-19 12:35:34

+0

很可能你必須指定'proxy_cache_path/tmp/my_nginx_cache use_temp_path = off ...',否則nginx會追加爲前綴'proxy_temp_path ',在你的情況下它被設置爲'/ tmp/systemd-private-phJlfG /'。 – antonbormotov 2017-05-23 11:36:59

+0

確認 - 來自RHEL nginx rpm的nginx.service systemd單元文件中的'PrivateTmp = true'。如果你把你的緩存放在/ tmp下,它不會在這個設置中持久化(重啓nginx會導致它獲得一個新的緩存目錄)。 – 2017-11-19 21:39:28

0

,我發現這個配置最後的工作原理:

10m = 10mb密鑰緩存,max_size爲2GB,inactive = 120m(120分鐘未激活後從源刷新),use_temp_path = off(減少io)

proxy_cache_valid - 200和30260分鐘

proxy_cache_path /tmp/cache levels=1:2 keys_zone=default_cache:10m max_size=2g 
       inactive=120m use_temp_path=off; 
proxy_cache_key "$scheme$request_method$host$request_uri"; 
proxy_cache_valid 200 302 60m; 

server { 
    listen  80; 
    server_name example.com; 

    # https://www.nginx.com/blog/nginx-caching-guide 
    location/{ 
     proxy_cache default_cache; 
     proxy_buffering on; 
     proxy_ignore_headers Expires; 
     proxy_ignore_headers X-Accel-Expires; 
     proxy_ignore_headers Cache-Control; 
     proxy_ignore_headers Set-Cookie; 

     proxy_hide_header X-Accel-Expires; 
     proxy_hide_header Expires; 
     proxy_hide_header Cache-Control; 
     proxy_hide_header Pragma; 

     add_header X-Proxy-Cache $upstream_cache_status; 
     proxy_pass http://ip-of-host:80; 

     #set   $memcached_key "$uri?$args"; 
     #memcached_pass 127.0.0.1:11211; 
     # error_page  404 502 504 = @fallback; 
    } 
}