Khi nào nên sử dụng hay không sử dụng sendfile bật / tắt trong Nginx?


12

Chúng tôi có thiết lập này trong nginx.confmột thời gian khá lâu.

sendfile on;

Khi chúng tôi đã cập nhật một tệp, ví dụ /js/main.jsvà truy cập từ trình duyệt https://test.com/js/main.js?newrandomtimestamp , nó vẫn sẽ tải phiên bản cũ hơn trừ khi chúng tôi làm mới hoàn toàn (xóa bộ nhớ cache) từ trình duyệt của chúng tôi.

Nhưng khi chúng ta thay đổi cài đặt từ sendfile; để gửi đi; trình duyệt sẽ tải đúng phiên bản của tệp đã cập nhật.

Đối với máy chủ web sản xuất của chúng tôi, chúng tôi có nên sử dụng sendfile trên; hoặc gửi đi; Nếu sendfile trên; là bắt buộc (Có thể vì lý do bộ nhớ đệm tốt hơn? Hiệu suất nhanh hơn?) thì làm thế nào để giải quyết vấn đề nêu trên?

Dưới đây là nginx.confmáy chủ sản xuất của chúng tôi và chúng tôi đang sử dụng phiên bản 1.7.5:

user  nginx;
worker_processes  2;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
worker_rlimit_nofile 51200;

events {
    use epoll;
    worker_connections  51200;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    client_max_body_size 8m;
    sendfile        on;
    keepalive_timeout  65;

    real_ip_header X-Forwarded-For;
    set_real_ip_from 0.0.0.0/0;
    large_client_header_buffers 4 32k;

    gzip on;
    gzip_min_length 1k;
    gzip_buffers 4 16k;
    gzip_http_version 1.1;
    gzip_comp_level 2;
    gzip_types text/plain application/x-javascript application/javascript text/css application/xml application/json;
    gzip_vary on;


    include /etc/nginx/conf.d/*.conf;
}

Để làm cho mọi thứ dễ dàng hơn, chúng ta có nên khởi động lại nginx mỗi khi chúng tôi triển khai các tệp mới vào máy chủ sản xuất của mình không? Nếu chúng tôi không muốn khởi động lại nginx, làm thế nào khác chúng tôi có thể xóa bộ đệm nginx? (giả sử nếu sendfile bật; có liên quan đến bộ đệm)
Forestclown

Có nginx của bạn trong một số loại môi trường ảo (như virtualbox)?
Alexey Ten

Máy chủ sản xuất của chúng tôi hoạt động trên Amazon EC2
Forestclown

Có một số báo cáo lỗi về sendfilevà ổ đĩa VirtualBox (ví dụ: virtualbox.org/ticket/819 ). Có thể có vấn đề tương tự với Amazon.
Alexey Ten

Kiểm tra cài đặt cấu hình của open_file_cache khi bạn nhấn bộ đệm trong này tại đây. Bạn có thể vô hiệu hóa nó hoàn toàn hoặc giảm TTL (open_file_cache_valid). Bạn sẽ tìm thấy thêm chi tiết tại đây: nginx.org/en/docs/http/ Từ Các vấn đề được đề cập liên quan đến Virtualbox là do hệ thống tệp cụ thể VBOXSF nhưng điều này không nên xảy ra ở đây. Các vấn đề đã biết khác được liên kết với hệ thống tập tin NFS cũng không có ở đây.
Jens Bradler

Câu trả lời:


1

Có thể có một giải pháp cho vấn đề lưu trữ tệp của bạn ở cấp ứng dụng. Đó là một vấn đề nổi tiếng trong thế giới phát triển JavaScript. Giải pháp thường được gọi là "băm đầu ra".

Ý tưởng cơ bản là thêm một hàm băm của nội dung tệp vào tên tệp để tệp được coi là "mới" và không tìm thấy trong bộ đệm.

Angular làm điều đó tại thời điểm xây dựng (xem --outputHashing:).


1

... Trừ khi chúng tôi làm mới hoàn toàn (xóa bộ nhớ cache) từ trình duyệt của chúng tôi.

Bản thân điều này, một biểu hiện rõ ràng rằng "vấn đề" nằm ở phía khách hàng.

sendfile không liên quan gì đến bộ nhớ đệm, chỉ có cách NGINX đệm / đọc tệp (cố gắng nhồi nội dung trực tiếp vào "khe" mạng hoặc đệm nội dung của nó trước).

Giải thích hợp lý duy nhất là trình duyệt cụ thể của bạn loại bỏ ?newrandomtimestampnhư một tham số không có giá trị, do đó, nó đang tải cùng một tài nguyên được lưu trong bộ nhớ cache cho một trong hai example.com?blahexample.com?boo.

Nếu bạn thử, sau đó lập https://example.com/js/main.js?v=newrandomtimestampkế hoạch, nên cung cấp nội dung mới hơn mỗi lần.


0

bạn csn cũng sử dụng một loại trừ khỏi bộ đệm ẩn tập tin này như tôi làm

 location updater/serversettings.xml {
        expires -1;
        add_header 'Cache-Control' 'no-store, no-cache, 
 must-revalidate, proxy-revalidate, max-age=0';
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.