Bagaimana cara memaksa NGINX untuk memuat file statis baru?

22

Baru-baru ini saya mendorong pembaruan besar ke sebuah situs dan saya mengalami masalah di mana beberapa orang tidak dapat masuk karena browser mereka memuat file javascript lama . Beberapa hal yang telah saya lakukan meliputi:

  • Cache penghilang semua file javascript
  • Diatur sendfile offdalam nginx.conf
  • Diatur expires 1sdi mysite.conf
  • Secara eksplisit mengatur header Kontrol-Cache: add_header Cache-Control no-cache;

Di bawah adalah file conf saya untuk nginx. Bantuan apa pun akan sangat dihargai.

/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/*;
}
jwerre
sumber

Jawaban:

18

Sudahkah Anda mencoba menghapus semua yang ada di cache secara manual? Ini biasanya /var/cache/nginx.

Saya percaya bahwa memiliki add_header Cache-Control no-cache;set harus menjaga hal-hal dari di-cache, tetapi mungkin Anda memiliki sesuatu yang di-cache di sana sebelum Anda menetapkan itu?

Abe Miessler
sumber
2
Itu pemikiran yang bagus. Saya mencoba menghapus file yang di-cache tetapi /var/cache/nginxbenar-benar kosong
jwerre
14

Pengaturan expires -1;di dalam blok lokasi sebenarnya akan menonaktifkan caching sepenuhnya.

sven13
sumber
7

Anda mengabaikan cache browser pembaca Anda. Kecuali jika Anda mengubah nama objek Anda (mis. Tambahkan nomor versi ke .js), atau objek dikirim dengan ETag atau Modifikasi-Tanggal, peramban dapat mempertimbangkan versi objeknya masih berlaku untuk beberapa decennia, dan jangan pernah berkonsultasi dengan server Anda.

Gerard H. Pille
sumber
Ini adalah jawaban yang benar, pengguna sudah memiliki versi cache dan jika Anda tidak memiliki 304 - periksa apakah dimodifikasi Anda harus memaksa semua pengguna Anda untuk memaksa penyegaran data situs Anda, atau mengubah nama semua konten statis Anda, atau memindahkan konten statis Anda ke folder yang berbeda.
Brunis
0

Kemungkinan besar klien Anda memiliki versi cache dan mereka tidak memeriksa apakah mereka dimodifikasi di server Anda. Jadi Anda perlu memperbaiki pengaturan cache Anda, maka Anda dapat memindahkannya ke folder lain. Misalnya. jika Anda memindahkan /styles/*.css ke / css / sebagai gantinya, dan semua file js dari skrip ke / js / browser mereka harus mengambil ulang sumber daya.

Brunis
sumber
0

Menghadapi masalah yang sama. Jika Anda menggunakan cloudflare untuk perlindungan DDOS (jika tidak silakan lakukan) maka aktifkan

  • mode pengembang untuk sementara waktu.
  • Selalu periksa file statis Anda menghasilkan jendela penyamaran (di google chrome itulah yang disebut).
  • hentikan nginx> hapus cache> mulai layanan nginx.
Gajendra D Ambi
sumber