web-dev-qa-db-ja.com

Nginxでsendfileのオン/オフを使用する場合と使用しない場合

この設定はnginx.conf かなり長い間。

sendfile on;

ファイルを更新したとき。 /js/main.jsおよびブラウザからのアクセス https://test.com/js/main.js?newrandomtimestamp 、ブラウザから完全に更新(キャッシュをクリア)しない限り、古いバージョンがロードされます。

しかし、sendfileから設定を変更すると、 sendfileをオフにします。ブラウザは、更新されたファイルの正しいバージョンをロードします。

実稼働Webサーバーでは、sendfileをオンに使用する必要があります。またはsendfile off ;? sendfileがオンの場合;上記の問題を解決するにはどうすればよいですか(キャッシュが改善されたためか、パフォーマンスが向上したかなど)。

以下はnginx.conf本番サーバーで、バージョン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;
}
12
forestclown

...ブラウザからフルリフレッシュ(キャッシュのクリア)を行わない限り。

これ自体、「問題」がクライアント側にあるという明確な兆候です。

sendfileはキャッシングとは関係がなく、NGINXがファイルをバッファ/読み取りする方法のみです(コンテンツをネットワークの「スロット」に直接詰めるか、最初にコンテンツをバッファするかを試みます)。

唯一の妥当な説明は、特定のブラウザが?newrandomtimestampを値なしのパラメータとして破棄するため、example.com?blahexample.com?booのどちらにも同じキャッシュリソースをロードすることです。

試してみると、https://example.com/js/main.js?v=newrandomtimestampスキームすべき毎回新しいコンテンツを提供します。

1

アプリケーションレベルでのファイルキャッシュの問題に対する解決策があるかもしれません。これはJavaScript開発の世界では よく知られている 問題です。ソリューションは通常、「出力ハッシュ」のようなものと呼ばれます。

基本的な考え方は、ファイルの内容のハッシュをファイル名に追加して、ファイルが「新規」と見なされ、キャッシュに見つからないようにすることです。

Angularはビルド時にそれを行います(参照: --outputHashing )。

1

あなたはcsnも私と同じようにこのファイルをキャッシュから除外します

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