Wann soll sendfile in Nginx ein- oder ausgeschaltet werden?

12

Wir haben diese Einstellung nginx.conffür eine ganze Weile in unserer .

sendfile on;

Wenn wir eine Datei aktualisiert haben, z. B. /js/main.jsüber den Browser https://test.com/js/main.js?newrandomtimestamp , wird die ältere Version weiterhin geladen, es sei denn, wir führen eine vollständige Aktualisierung (Cache löschen) in unserem Browser durch.

Aber wenn wir die Einstellungen von sendfile an ändern; Datei abschicken; Der Browser lädt die richtige Version der aktualisierten Datei.

Sollten wir für unseren Produktionswebserver sendfile on verwenden? oder sendfile off;? Wenn sendfile on; ist erforderlich (Mai aus Gründen des besseren Caching? Schnellere Leistung?), wie kann dann das oben erwähnte Problem gelöst werden?

Unten finden Sie die nginx.confin unserem Produktionsserver, und wir verwenden Version 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;
}
Waldclown
quelle
Sollten wir nginx jedes Mal neu starten, wenn wir neue Dateien auf unserem Produktionsserver bereitgestellt haben? Wenn wir Nginx nicht neu starten möchten, wie können wir dann den Nginx-Cache leeren? (vorausgesetzt, sendfile on; hängt mit dem Cache zusammen)
Forestclown
Befindet sich Ihr Nginx in einer virtuellen Umgebung (wie Virtualbox)?
Alexey Ten
Unser Produktionsserver ist auf Amazon EC2
Forestclown
Es gibt mehrere Fehlerberichte zu einem sendfileVirtualBox-Laufwerk (z . B. virtualbox.org/ticket/819 ). Möglicherweise gibt es ein ähnliches Problem mit Amazon.
Alexey Ten
Überprüfen Sie die Konfigurationseinstellungen von open_file_cache, während Sie diesen internen Cache hier aufrufen. Sie können es vollständig deaktivieren oder die TTL (open_file_cache_valid) reduzieren. Weitere Details finden Sie hier: nginx.org/en/docs/http/… Die genannten Probleme im Zusammenhang mit Virtualbox sind auf das spezifische Dateisystem VBOXSF zurückzuführen, dies sollte hier jedoch nicht der Fall sein. Andere bekannte Probleme hängen mit dem NFS-Dateisystem zusammen, das auch hier nicht vorhanden ist.
Jens Bradler

Antworten:

1

Möglicherweise gibt es eine Lösung für Ihr Problem beim Zwischenspeichern von Dateien auf Anwendungsebene. Es ist ein bekanntes Problem in der JavaScript-Entwicklungswelt. Die Lösung wird normalerweise als "Ausgabe-Hashing" bezeichnet.

Die Grundidee besteht darin, dem Dateinamen einen Hash des Dateiinhalts hinzuzufügen, damit die Datei als "neu" betrachtet und nicht im Cache gefunden wird.

Angular macht es zur Build-Zeit (siehe :) --outputHashing.

Anthony Mastrean
quelle
1

... es sei denn, wir führen eine vollständige Aktualisierung (Cache löschen) in unserem Browser durch.

Dies an sich ist eine klare Manifestation, dass das "Problem" auf der Clientseite liegt.

sendfile hat nichts mit Caching zu tun, sondern nur damit, wie NGINX die Datei puffert / liest (versucht, den Inhalt direkt in den "Steckplatz" des Netzwerks zu stopfen oder zuerst den Inhalt zu puffern).

Die einzig vernünftige Erklärung ist, dass Ihr spezifischer Browser ?newrandomtimestampals Parameter ohne Wert verworfen wird, sodass für beide example.com?blahund dieselbe zwischengespeicherte Ressource geladen wird example.com?boo.

Wenn Sie es versucht, dann https://example.com/js/main.js?v=newrandomtimestampSchema, sollte neue Inhalten gibt jedes Mal.

Danila Vershinin
quelle
0

Sie können auch ein Ausschließen aus dem Caching dieser Datei verwenden, wie ich es tue

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