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


12

この設定は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;
}

作業を簡単にするために、新しいファイルを運用サーバーに展開するたびにnginxを再起動する必要がありますか?nginxを再起動したくない場合、他にどのようにnginxキャッシュをクリアできますか?(sendfileがオンの場合、キャッシュに関連していると仮定)
forestclown '19年

あなたのnginxは(virtualboxのような)ある種の仮想環境にありますか?
Alexey Ten

私たちの本番サーバーはAmazon EC2にあります
フォレストクラウン、2015年

sendfileおよびVirtualBoxドライブに関するいくつかのバグレポートがあります(例:virtualbox.org/ticket/819)。アマゾンにも同様の問題があるかもしれません。
Alexey Ten

ここでこの内部キャッシュにアクセスしているときに、open_file_cacheの構成設定を確認してください。完全に無効にするか、TTL(open_file_cache_valid)を減らすことができます。詳細については、こちらをご覧ください:nginx.org/en/docs/http/…Virtualboxに リンクされている前述の問題は、特定のファイルシステムVBOXSFが原因ですが、ここでは当てはまりません。他の既知の問題は、ここにもないNFSファイルシステムにリンクされています。
Jens Bradler、

回答:


1

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

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

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


1

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

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

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

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

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


0

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

 location updater/serversettings.xml {
        expires -1;
        add_header 'Cache-Control' 'no-store, no-cache, 
 must-revalidate, proxy-revalidate, max-age=0';
    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.