web-dev-qa-db-fra.com

Comment forcer NGINX à charger de nouveaux fichiers statiques?

J'ai récemment lancé une mise à jour majeure sur un site et j'ai un problème où certaines personnes ne peuvent pas se connecter car leur navigateur charge old fichiers javascript. Certaines des choses que j'ai faites incluent:

  • Cache contournant tous les fichiers javascript
  • Ensemble sendfile off dans nginx.conf
  • Ensemble expires 1s dans mysite.conf
  • Définissez explicitement l'en-tête Cache-Control: add_header Cache-Control no-cache;

Ci-dessous sont mes fichiers de conf pour nginx. Toute aide serait très appréciée.

/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

Avez-vous essayé de supprimer manuellement tout ce qui se trouve dans votre cache? C'est généralement /var/cache/nginx.

Je crois qu'avoir add_header Cache-Control no-cache; set devrait empêcher les choses d'être mises en cache, mais peut-être avez-vous quelque chose qui a été mis en cache avant de définir cela?

19
Abe Miessler

Réglage expires -1; à l'intérieur d'un bloc d'emplacement désactivera complètement la mise en cache.

16
sven13

Vous ignorez le cache de votre navigateur de lecteurs. À moins que vous ne changiez le nom de vos objets (par exemple, ajoutez un numéro de version au .js), ou que les objets aient été envoyés avec une ETag ou une Modification-Date, le navigateur peut considérer que sa version de l'objet est toujours valide pour quelques décennies, et ne consultez jamais votre serveur.

7
Gerard H. Pille

Face au même problème. Si vous utilisez cloudflare pour la protection DDOS (sinon, veuillez le faire), puis activez

  • mode développeur pendant un certain temps.
  • Vérifiez toujours les résultats de votre fichier statique dans une fenêtre de navigation privée (dans google chrome c'est ce qu'on appelle)).
  • arrêter nginx> supprimer le cache> démarrer le service nginx.
1
Gajendra D Ambi

Ce n'est pas très pertinent pour la question elle-même, mais cela peut vous faire gagner quelques heures.

J'ai eu le même problème et après avoir essayé toutes les solutions mentionnées dans cette question, les réponses et d'autres questions similaires, j'ai vérifié mon panneau de contrôle Cloudfare et y ai trouvé la section "mise en cache". Il s'est avéré que Cloudfare stupide avait mis en cache mon fichier CSS principal et peu importe ce qui renvoyait la version mise en cache à la place de la nouvelle (même par wget).

Donc, si vous servez votre site avec Cloudfare et rencontrez ce problème:

  1. Accédez à votre panneau de configuration, à la section Caching
  2. Appuyez sur Purger tout
0
Dany

Vos clients ont très probablement une version en cache et ils ne vérifient pas s'ils sont modifiés sur votre serveur. Vous devez donc corriger vos paramètres de cache, puis vous pouvez les déplacer vers un dossier différent. Par exemple. si vous déplacez /styles/*.css vers/css/à la place, et tous les fichiers js des scripts vers/js/leurs navigateurs devront récupérer les ressources.

0
Brunis