Kapan menggunakan atau tidak menggunakan sendfile on / off di Nginx?

12

Kami memiliki pengaturan ini di kami nginx.confcukup lama.

sendfile on;

Ketika kami telah memperbarui file mis /js/main.jsdan akses dari browser https://test.com/js/main.js?newrandomtimestamp , itu masih akan memuat versi yang lebih lama kecuali kami melakukan penyegaran penuh (cache yang jelas) dari browser kami.

Tetapi ketika kita mengubah pengaturan dari sendfile aktif; untuk mengirim file; browser akan memuat versi yang benar dari file yang diperbarui.

Untuk server web produksi kami, haruskah kami menggunakan sendfile pada; atau lepas dari file ;? Jika sendfile aktif; diperlukan (Mungkin karena alasan caching yang lebih baik? Kinerja lebih cepat?) lalu bagaimana mengatasi masalah yang disebutkan di atas?

Di bawah ini adalah nginx.confserver produksi kami, dan kami menggunakan versi 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;
}
badut hutan
sumber
Untuk mempermudah, haruskah kita memulai kembali nginx setiap kali kita menyebarkan file baru ke server produksi kita? Jika kita tidak ingin me-restart nginx, bagaimana lagi kita bisa menghapus cache nginx? (dengan asumsi jika sendfile aktif; terkait dengan cache)
forestclown
Apakah nginx Anda dalam semacam lingkungan virtual (seperti virtualbox)?
Alexey Ten
Server produksi kami ada di Amazon EC2
forestclown
Ada beberapa laporan bug tentang sendfiledan drive VirtualBox (mis. Virtualbox.org/ticket/819 ). Mungkin ada masalah serupa dengan Amazon.
Alexey Ten
Lihat pengaturan config open_file_cache saat Anda menekan cache internal ini di sini. Anda dapat menonaktifkannya sepenuhnya atau mengurangi TTL (open_file_cache_valid). Anda akan menemukan rincian lebih lanjut di sini: nginx.org/en/docs/http/... Masalah yang disebutkan terkait dengan Virtualbox adalah karena sistem file VBOXSF tertentu tetapi ini tidak seharusnya terjadi di sini. Masalah lain yang diketahui terkait dengan sistem file NFS yang juga di sini tidak ada.
Jens Bradler

Jawaban:

1

Mungkin ada solusi untuk masalah caching file Anda di level aplikasi. Ini masalah terkenal di dunia pengembangan JavaScript. Solusinya biasanya disebut sesuatu seperti "keluaran hashing".

Ide dasarnya adalah menambahkan hash dari isi file ke nama file sehingga file tersebut dianggap "baru" dan tidak ditemukan dalam cache.

Angular melakukannya saat membangun (lihat --outputHashing:).

Anthony Mastrean
sumber
1

... kecuali jika kami melakukan penyegaran penuh (menghapus cache) dari browser kami.

Ini sendiri, manifestasi yang jelas bahwa "masalah" ada di sisi klien.

sendfile tidak ada hubungannya dengan caching, hanya bagaimana NGINX buffer / membaca file (mencoba memasukkan konten langsung ke "slot" jaringan, atau buffer isinya terlebih dahulu).

Satu-satunya penjelasan yang masuk akal adalah bahwa browser spesifik Anda membuang ?newrandomtimestampsebagai parameter tanpa nilai, sehingga memuat sumber daya yang di-cache sama untuk example.com?blahdan example.com?boo.

Jika Anda mencobanya, maka https://example.com/js/main.js?v=newrandomtimestampskema harus memberikan konten yang lebih baru setiap saat.

Danila Vershinin
sumber
0

Anda csn juga menggunakan pengecualian dari caching file ini seperti yang saya lakukan

 location updater/serversettings.xml {
        expires -1;
        add_header 'Cache-Control' 'no-store, no-cache, 
 must-revalidate, proxy-revalidate, max-age=0';
    }
djdomi
sumber