2012-02-10 39 views
15

Tôi đang cố gắng lưu trữ nội dung tĩnh về cơ bản bên trong các đường dẫn bên dưới trong cấu hình máy chủ ảo. Đối với một số lý do tập tin không được lưu trữ. Tôi thấy một số thư mục và các tập tin bên trong thư mục cache nhưng nó luôn luôn là một cái gì đó giống như 20mb không cao hơn không thấp hơn. Nếu đó là bộ nhớ đệm hình ảnh ví dụ sẽ mất ít nhất 500MB không gian.nginx là bộ nhớ cache proxy không lưu trữ bất cứ thứ gì

Dưới đây là phần bộ nhớ cache 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; 

Heres mặc định máy chủ ảo.

**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

tou đã tryed để bật khai thác gỗ lỗi? –

+1

có. không có gì kết luận. –

Trả lời

35

Đảm bảo phụ trợ của bạn không trả về tiêu đề Set-Cookie. Nếu Nginx thấy nó, nó sẽ vô hiệu hóa bộ nhớ đệm.

Nếu đây là trường hợp của bạn, tùy chọn tốt nhất là sửa chương trình phụ trợ của bạn. Khi sửa chữa các phụ trợ không phải là một lựa chọn, nó có thể để hướng dẫn Nginx để bỏ qua Set-Cookie tiêu đề

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

Xem documentation

proxy_ignore_header sẽ đảm bảo rằng bộ nhớ đệm xảy ra. proxy_hide_header sẽ đảm bảo tải trọng Cookie không được bao gồm trong tải trọng được lưu trong bộ nhớ cache. Điều này rất quan trọng để tránh bị rò rỉ cookie thông qua bộ nhớ cache NGINX.

+4

thực sự nó không phải là cookie được đặt nhưng kiểm soát bộ nhớ cache. Tôi phát hiện ra rằng IIS đã thực sự bộ nhớ đệm các tập tin tĩnh và phản ứng với nginx là không cache các tập tin prolly bởi vì nó đã được bộ nhớ đệm nó. Một khi tôi gỡ bỏ những tập tin từ bộ nhớ cache iis nó làm việc. :) –

+1

Tôi yêu bạn, bạn tiết kiệm đêm của tôi! – micred

+0

và đêm của tôi ... những gì còn lại của nó – mkoryak

10

Tôi muốn thêm rằng nhiều tùy chọn cấu hình và kết hợp có thể tắt bộ nhớ đệm proxy trong Nginx. Thật không may, đây là tài liệu kém.

Trong cấu hình của tôi, tôi đặt proxy_buffering on và nó đã bật bộ nhớ đệm như mong đợi.

+1

Vì vậy, làm thế nào là 'proxy_buffering on' liên quan, bạn có thể giải thích xin vui lòng? – Meglio

+0

Tôi đã tìm kiếm một số tài liệu chính thức về mối quan hệ giữa proxy đệm và proxy bộ nhớ đệm, nhưng tôi không thể tìm thấy bất kỳ tài nguyên tốt để trích dẫn ở đây. Tôi đã thêm câu trả lời này, bởi vì việc tắt 'proxy_buffering' tắt chỉ đơn giản là vô hiệu hóa bất kỳ hành vi bộ nhớ đệm được định cấu hình nào mà không có cảnh báo hoặc bất kỳ điều gì khác. Tôi đoán rằng nếu không có bộ đệm nginx không có cách nào để lưu trữ và do đó lưu trữ một phản hồi từ máy chủ mà nó đang proxy. Câu trả lời này gợi ý một số điều, thậm chí có thể yêu cầu Tero Kilkanen người đưa ra câu trả lời: http://serverfault.com/a/692585/144118 – Overbryd

+0

Làm cho ngày của tôi. Tôi đã dành 3 ngày! Để tìm ra những gì sai với cấu hình của chúng tôi. Big, tuyệt vời cảm ơn bạn @Overbryd, từ tận đáy lòng của tôi. –

0

Đối với những gì đáng giá, trải nghiệm của tôi là nginx không phải lúc nào cũng lưu vào bộ nhớ cache những thứ bạn nói.

Ví dụ, trên centos7, với các tùy chọn cấu hình

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

nginx thực sự lưu trữ các tập tin tại địa chỉ:

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

Đó có thể là systemd hoặc bản vá từ RedHat. Hãy thử systemctl cat nginx.service và xem nếu có một tùy chọn trong đó để cung cấp cho chroot nó hoặc một cái gì đó tương tự – Jason

+0

Có lẽ bạn phải chỉ định 'proxy_cache_path/tmp/my_nginx_cache use_temp_path = off ...', nếu không thì nginx sẽ thêm vào như là tiền tố 'proxy_temp_path ', được đặt thành'/tmp/systemd-private-phJlfG/'trong trường hợp của bạn. – antonbormotov

+0

Đã xác nhận - 'PrivateTmp = true' trong tệp đơn vị hệ thống nginx.service từ RHEL nginx rpm. Nếu bạn đặt bộ nhớ cache của bạn dưới/tmp, nó sẽ không được liên tục trong thiết lập này (khởi động lại nginx sẽ dẫn đến nó nhận được một thư mục cache mới tươi). –

0

sau khi trải qua nhiều câu trả lời và ý kiến, tôi thấy cấu hình này cuối cùng hoạt động:

10m = 10mb bộ nhớ cache chính, tối đa 2GB, không hoạt động = 120m (làm mới từ nguồn sau 120 phút không hoạt động), use_temp_path = off (để giảm io)

proxy_cache_valid - Tình trạng bộ nhớ cache của 200 và 302 cho 60minutes

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; 
    } 
} 
Các vấn đề liên quan