2014-11-06 30 views
1

我正在使用nginx作爲負載平衡代理,並且我也希望它將其響應緩存在磁盤上,因此它不必擊中上游服務器經常。nginx沒有在磁盤上緩存代理響應,即使我問它

我試着按照http://wiki.nginx.org/ReverseProxyCachingExample的說明操作。我使用的是由Docker提供的nginx 1.7。

這裏是我的nginx.conf(它被安裝到nginx/conf.d/):

upstream balancer53 { 
    server conceptnet-api-1:10053; 
    server conceptnet-api-2:10053; 
} 

proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=STATIC:1g max_size=1g; 

server { 
    listen 80; 
    gzip on; 
    gzip_proxied any; 
    gzip_types application/json; 
    charset utf-8; 
    charset_types application/json; 

    location /web { 
     proxy_pass http://balancer53; 
     proxy_set_header X-Remote-Addr $proxy_add_x_forwarded_for; 
     proxy_cache STATIC; 
     proxy_cache_valid 200 1d; 
     proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504; 
     proxy_ignore_headers X-Accel-Expires Expires Cache-Control X-RateLimit-Limit X-RateLimit-Remaining X-RateLimit-Reset; 
    } 
    location /data/5.3 { 
     proxy_pass http://balancer53; 
     proxy_set_header X-Remote-Addr $proxy_add_x_forwarded_for; 
     proxy_cache STATIC; 
     proxy_cache_valid 200 1d; 
     proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504; 
     proxy_ignore_headers X-Accel-Expires Expires Cache-Control X-RateLimit-Limit X-RateLimit-Remaining X-RateLimit-Reset; 
    } 

    location /data/5.2 { 
     # serve the old version 
     proxy_pass http://conceptnet52:10052/; 
     proxy_set_header X-Remote-Addr $proxy_add_x_forwarded_for; 
     proxy_cache STATIC; 
     proxy_cache_valid 200 1d; 
     proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504; 
     proxy_ignore_headers X-Accel-Expires Expires Cache-Control X-RateLimit-Limit X-RateLimit-Remaining X-RateLimit-Reset; 
    } 
    location/{ 
     root /var/www; 
     index index.html; 
     autoindex on; 
     rewrite ^/static/(.*)$ /$1; 
    } 
} 

儘管這樣的配置,從來都沒有在/data/nginx/cache顯示出來。

下面是來自上游服務器的響應報頭的一個例子:

$ curl -vs http://localhost:10053/data/5.3/assoc/c/en/test > /dev/null 
* Hostname was NOT found in DNS cache 
* Trying ::1... 
* Connected to localhost (::1) port 10053 (#0) 
> GET /data/5.3/assoc/c/en/test HTTP/1.1 
> User-Agent: curl/7.35.0 
> Host: localhost:10053 
> Accept: */* 
> 
< HTTP/1.1 200 OK 
* Server gunicorn/19.1.1 is not blacklisted 
< Server: gunicorn/19.1.1 
< Date: Thu, 06 Nov 2014 20:54:52 GMT 
< Connection: close 
< Content-Type: application/json 
< Content-Length: 1329 
< Access-Control-Allow-Origin: * 
< X-RateLimit-Limit: 60 
< X-RateLimit-Remaining: 59 
< X-RateLimit-Reset: 1415307351 
< 
{ [data not shown] 
* Closing connection 0 

每個上游服務器強制執行速率限制,但我沒關係與緩存的響應不顧限速。我不確定這些頭文件是否阻止了緩存,這就是爲什麼我告訴nginx忽略它們的原因。

我需要做些什麼才能讓nginx開始使用緩存?

+0

如果您使用的是Mac在VirtualBox中的泊塢窗,建議把** SENDFILE關閉**。 – Anatoly 2014-11-09 18:01:10

回答

0

我試圖與nginx.conf單獨運行Nginx的,並發現它抱怨的一些選項是無效的。我想我從來沒有成功構建一個新的nginx容器。

特別是,事實證明,你不只是把任何舊的標題放在proxy_ignore_headers選項。它只需要特定的標題作爲參數,代理系統關心的參數。

這裏是我的修訂nginx.conf,它的工作:

upstream balancer53 { 
    server conceptnet-api-1:10053; 
    server conceptnet-api-2:10053; 
} 

proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=STATIC:100m max_size=100m; 

server { 
    listen 80; 
    gzip on; 
    gzip_proxied any; 
    gzip_types application/json; 
    charset utf-8; 
    charset_types application/json; 

    location /web { 
     proxy_pass http://balancer53; 
     proxy_set_header X-Remote-Addr $proxy_add_x_forwarded_for; 
     proxy_cache STATIC; 
     proxy_cache_valid 200 1d; 
     proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504; 
     proxy_ignore_headers X-Accel-Expires Expires Cache-Control; 
    } 
    location /data/5.3 { 
     proxy_pass http://balancer53; 
     proxy_set_header X-Remote-Addr $proxy_add_x_forwarded_for; 
     proxy_cache STATIC; 
     proxy_cache_valid 200 1d; 
     proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504; 
     proxy_ignore_headers X-Accel-Expires Expires Cache-Control; 
    } 
    location/{ 
     root /var/www; 
     index index.html; 
     autoindex on; 
     rewrite ^/static/(.*)$ /$1; 
    } 
} 
0

官方文檔告訴如果頭部包含「Set-Cookie」字段,則不會緩存這樣的響應。請查看here

使緩存工作使用隱藏和忽視技術:

location /web { 
    ... 
    proxy_hide_header  Set-Cookie; 
    proxy_ignore_headers Set-Cookie; 
} 
+0

我在我的問題中包含了完整的上游頭文件。 Set-Cookie不是其中之一。我的應用程序不使用cookie。 – rspeer 2014-11-10 22:59:17

+0

檢查磁盤上創建的代理緩存密鑰和文件 – Anatoly 2014-12-07 10:21:48