Làm cách nào để buộc NGINX tải các tệp tĩnh mới?


22

Gần đây tôi đã đẩy một bản cập nhật lớn cho một trang web và tôi gặp sự cố khi một số người không thể đăng nhập vì trình duyệt của họ đang tải các tệp javascript . Một số điều tôi đã làm bao gồm:

  • Cache làm hỏng tất cả các tệp javascript
  • Đặt sendfile offtrong nginx.conf
  • Đặt expires 1strong mysite.conf
  • Hoàn toàn đặt tiêu đề Cache-Control: add_header Cache-Control no-cache;

Dưới đây là tập tin conf của tôi cho nginx. Bất kì sự trợ giúp nào đều được đánh giá cao.

/etc/nginx/sites-enables/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/*;
}

Câu trả lời:


18

Bạn đã thử xóa thủ công mọi thứ trong bộ nhớ cache của mình chưa? Điều này là điển hình /var/cache/nginx.

Tôi tin rằng việc add_header Cache-Control no-cache;thiết lập nên giữ mọi thứ khỏi bị lưu vào bộ nhớ cache, nhưng có lẽ bạn có một cái gì đó đã được lưu trong bộ nhớ cache trước khi bạn đặt nó?


2
Đó là một suy nghĩ tốt. Tôi đã cố xóa các tệp được lưu trong bộ nhớ cache nhưng /var/cache/nginxhoàn toàn trống rỗng
jwerre

14

Thiết lập expires -1;bên trong một khối vị trí sẽ thực sự vô hiệu hóa hoàn toàn bộ đệm.


7

Bạn đang bỏ qua bộ nhớ cache của trình duyệt độc giả của bạn. Trừ khi bạn thay đổi tên của các đối tượng của mình (ví dụ: thêm số phiên bản vào .js) hoặc các đối tượng được gửi bằng ETag hoặc Ngày sửa đổi, trình duyệt có thể coi phiên bản đối tượng của mình vẫn hợp lệ cho một vài decennia, và không bao giờ tham khảo máy chủ của bạn.


Đây là câu trả lời đúng, người dùng đã có phiên bản được lưu trong bộ nhớ cache và nếu bạn không có 304 - hãy kiểm tra xem bạn đã sửa đổi hay chưa, buộc bạn phải buộc làm mới dữ liệu trang web của mình hoặc đổi tên tất cả nội dung tĩnh của bạn hoặc di chuyển nội dung tĩnh của bạn vào một thư mục khác.
Brunis

0

Nhiều khả năng khách hàng của bạn có phiên bản được lưu trong bộ nhớ cache và họ không kiểm tra xem chúng có bị sửa đổi trên máy chủ của bạn không. Vì vậy, bạn cần sửa các thiết lập bộ đệm của mình, sau đó bạn có thể di chuyển chúng sang một thư mục khác. Ví dụ. thay vào đó, nếu bạn di chuyển /ststyle/*.css sang / css / và tất cả các tệp js từ tập lệnh đến / js / trình duyệt của họ sẽ phải tải lại tài nguyên.


0

Đối mặt với cùng một vấn đề. Nếu bạn đang sử dụng cloudflare để bảo vệ DDOS (nếu không thì vui lòng làm) sau đó kích hoạt

  • chế độ nhà phát triển trong một thời gian.
  • Luôn kiểm tra kết quả tệp tĩnh của bạn trong một cửa sổ ẩn danh (trong google chrome, cái được gọi là cửa sổ).
  • dừng nginx> xóa bộ nhớ cache> bắt đầu dịch vụ nginx.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.