it-swarm.com.de

Wie zwinge ich NGINX, neue statische Dateien zu laden?

Ich habe kürzlich ein umfangreiches Update auf eine Website übertragen und habe ein Problem, bei dem sich einige Benutzer nicht anmelden können, weil ihr Browser alte Javascript-Dateien lädt. Einige der Dinge, die ich getan habe, sind:

  • Cache, der alle Javascript-Dateien kaputt macht
  • Einstellen sendfile off in nginx.conf
  • Einstellen expires 1s in mysite.conf
  • Setzen Sie den Cache-Control-Header explizit: add_header Cache-Control no-cache;

Unten sind meine Conf-Dateien für Nginx. Jede Hilfe wäre sehr dankbar.

/etc/nginx/sites-enabled/mysite.conf

proxy_cache_path  /var/cache/nginx levels=1:2 keys_zone=one:8m max_size=3000m inactive=600m;

server {
    listen 80;
    server_name mysite.com;
    return 301 https://www.mysite.com$request_uri;
}

server {

        # listen for connections on all hostname/IP and at TCP port 80
        listen *:80;

        # name-based virtual hosting
        server_name www.mysite.com;

        # location of the web root for all static files (this should be changed for local development)
        root /var/mysite.com/static;

        # redirect http requests to https
        if ($http_x_forwarded_proto = "http") {
            rewrite  ^/(.*)$  https://www.mysite.com/$1 permanent;
        }

        # error pages
        error_page 403 /errors/403.html;
        error_page 404 /errors/404.html;
        error_page 408 /errors/408.html;
        error_page 500 502 503 504 /errors/500.html;  

        # error and access out
        error_log /var/log/nginx/error.mysite.log;
        access_log /var/log/nginx/access.mysite.log;

        # use Nginx's gzip static module
        gzip_static on;
        gzip_types application/x-javascript text/css;

        location / {

            # redefine and add some request header lines which will be passed along to the node server
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_Host;
            proxy_set_header X-NginX-Proxy true;
            proxy_set_header X-Forwarded-Proto $scheme;

            # set the address of the node proxied server
            proxy_pass http://127.0.0.1:9001;

            # forbid all proxy_redirect directives at this level
            proxy_redirect off;
        }

        # do a regular expression match for any files ending in the list of extensions

        location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|Zip|tgz|gz|rar|bz2|pdf|txt|tar|wav|bmp|rtf|js|flv|swf|xml|html|htm)$ {

            # clear all access_log directives for the current level
            access_log off;
            add_header Cache-Control no-cache;
            # set the Expires header to 31 December 2037 23:59:59 GMT, and the Cache-Control max-age to 10 years
            expires 1s;
        }

}

/etc/nginx/nginx.conf

user www-data;
worker_processes 4;
pid /var/run/nginx.pid;

events {
    worker_connections 768;
    # multi_accept on;
}

http {

    ##
    # Basic Settings
    ##

    sendfile off;
    tcp_nopush off;
    tcp_nodelay off;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    # server_tokens off;

    # server_names_hash_bucket_size 64;
    # server_name_in_redirect off;

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

    ##
    # Logging Settings
    ##

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    ##
    # Gzip Settings
    ##

    gzip on;
    gzip_disable "msie6";

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}
23
jwerre

Haben Sie versucht, alles, was sich in Ihrem Cache befindet, manuell zu löschen? Dies ist normalerweise /var/cache/nginx.

Ich glaube, dass add_header Cache-Control no-cache; set sollte verhindern, dass Dinge zwischengespeichert werden, aber vielleicht haben Sie etwas, das dort zwischengespeichert wurde, bevor Sie das eingestellt haben?

19
Abe Miessler

Einstellung expires -1; innerhalb eines Standortblocks deaktiviert das Caching tatsächlich vollständig.

16
sven13

Sie ignorieren den Cache Ihres Leser-Browsers. Sofern Sie den Namen Ihrer Objekte nicht ändern (z. B. eine Versionsnummer zur .js hinzufügen) oder die Objekte mit einem ETag oder einem Änderungsdatum gesendet wurden, kann der Browser davon ausgehen, dass seine Version des Objekts für einige noch gültig ist jahrzehntelang und konsultieren Sie niemals Ihren Server.

7
Gerard H. Pille

Konnte das gleiche Problem. Wenn Sie Cloudflare für den DDOS-Schutz verwenden (wenn nicht, tun Sie dies bitte), aktivieren Sie es

  • entwicklermodus für eine Weile.
  • Überprüfen Sie immer, ob Ihre statische Datei zu einem Inkognito-Fenster führt (in google chrome wird so genannt)).
  • nginx stoppen> Cache löschen> Nginx-Dienst starten.
1
Gajendra D Ambi

Es ist nicht sehr relevant für die Frage selbst, kann Ihnen aber einige Stunden ersparen.

Ich hatte das gleiche Problem und nachdem ich jede in dieser Frage erwähnte Lösung, die Antworten und andere ähnliche Fragen ausprobiert hatte, habe ich mein Cloudfare-Kontrollfeld überprüft und dort den Abschnitt "Caching" gefunden. Es stellte sich heraus, dass dummes Cloudfare meine Haupt-CSS-Datei zwischengespeichert hatte und egal, was die zwischengespeicherte Version anstelle der neuen zurückgab (sogar von wget).

Wenn Sie also Ihre Website mit Cloudfare bedienen und dieses Problem auftritt:

  1. Gehen Sie zu Ihrem Control Panel, zum Abschnitt Caching
  2. Drücken Sie Alles löschen
0
Dany

Höchstwahrscheinlich haben Ihre Clients eine zwischengespeicherte Version und prüfen nicht, ob sie auf Ihrem Server geändert wurden. Sie müssen also Ihre Cache-Einstellungen korrigieren und können sie dann in einen anderen Ordner verschieben. Z.B. Wenn Sie stattdessen /styles/*.css nach/css/verschieben und alle js-Dateien von Skripten nach/js/ihren Browsern Ressourcen erneut abrufen müssten.

0
Brunis