web-dev-qa-db-ja.com

nginx gzip_static:なぜ非圧縮ファイルが必要なのですか?

私はnginx 1.4.4で動作していますUbuntu 12.04.4
nginxは、Railsアプリケーションサーバーのクラスタを逆プロキシしています。

静的ファイル(主にアセット)は、アプリケーションサーバーにアクセスすることなく直接提供されます。
私はそれをgzip応答に設定し、可能な場合は事前圧縮されたファイルを使用するようにしました。

http {
  gzip on;
  gzip_http_version 1.0;
  gzip_proxied any;
  # other ngx_http_gzip_module directives...

  server {
    # proxy configuration

    location ^~ /assets/ {
      gzip_static on;
      expires max;
      add_header Cache-Control public;
      # root is inherited
      try_files $uri =404;
      error_page 404 /404.html;
    }
  }
}

これは機能します。
私はrealのgzip圧縮済みアセットとdummy非圧縮アセットを使用してテストしました。同じ名前だが内容が異なる:

/assets/application-a45d6...e2593.css         # dummy content
/assets/application-a45d6...e2593.css.gz      # real CSS

切り替えがわかりましたgzip_staticonoffを使用すると、nginxは期待されるバージョンのファイルを正しく処理します。
ここまでは順調ですね。

ただし、このセットアップは、非圧縮バージョンの場合にのみ機能しますファイルも存在します。 pre-compressedバージョンのみを使用すると、404が発生します。

ドキュメント は言う:

gzip_static
「always」の値(1.3.6)では、クライアントがサポートしているかどうかを確認せずに、すべてのケースでgzip圧縮されたファイルが使用されます。とにかくディスク上に非圧縮ファイルがない場合、またはngx_http_gunzip_moduleが使用されている場合に役立ちます。

(はい:onalwaysの両方を試しましたが、gunzip on。何も変わっていません)

ファイルの圧縮バージョンをのみにしても問題ないことを示唆しているようです。これは本当ですか?構成に問題はありますか?

4
tompave

バグを発見した可能性があります。しかし、一般的に、3つの理由から、どちらのファイルも必要です。

  1. 一部のクライアントは、圧縮データを要求しません。gzip_static always;彼らはそれを理解していないかもしれません。
  2. ファイルが常に見つかり、リクエストがRailsに上流に渡されないか、404ハンドラーによってキャッチされていないことを確認するため)(考えられるバグ)。その1つはおそらく何が起こっているかです。
  3. 実行時にnginxでファイルを圧縮または圧縮解除すると、繰り返し実行する必要があり、アプリケーションの実行に使用できる貴重なCPUを消費します。静的リソースを送信するだけで、CPUの負荷が大幅に軽減されます。
6
Michael Hampton

非圧縮ファイルはNginx 1.6では必要ありません。

    location ~ \.txt$ {
        gzip_static on;
        gunzip on;
    }

両方とも curl http://localhost/index.txtおよびcurl -H "Accept-Encoding: gzip" http://localhost/index.txt | gunzipだけで正常に機能するようになりました/srv/www/localhost/index.txt.gz私のルートディレクトリ。

6
hendry

@hendryの言うことに反して、元のファイルを保持する必要があります。

Nginx 1.15.9 (Ubuntu)を使用しています。

gzip_staticは次の場所にコンパイルされています。

nginx -V 2>&1 | grep "\-\-with\-http_gzip_static_module

gunzipは以下でコンパイルされます:

nginx -V 2>&1 | grep "\-\-with\-http_gunzip_module"

古くなっているかもしれませんが、私はこれを見つけました:

try_filesはgzip_staticを認識しません。ただし、非gzファイルと.gzファイルの両方が存在する場合、nginxは引き続きそれを受け入れます。これは、gzが存在しないかどうかに関係なく、適切な場合に.gzバージョンを提供する「通常の」gzip_static処理とは異なります。 - http://mailman.nginx.org/pipermail/nginx/2012-June/034102.html

Try_filesがそこで機能するためには元のファイルが必要であり、常にgzip_staticの影響を受けないようです。これは、try_files $ uri = 404では$ uriファイルが存在する必要があるためです。 - https://trac.nginx.org/nginx/ticket/157

これは私のnginx.confです:

events {
    worker_connections 768;
}

http {
    server {
        # Enable static gzip
        gzip_static on;
        gunzip on;

        listen 8080 default_server;
        listen [::]:8080 default_server;

        root /home/user/projects/project1/build;

        location / {
            try_files $uri /index.html;
        }
    }
}

Sudo nginx -t -c nginx.conf -p $PWDで実行します。

Sudo killall -9 nginx; Sudo nginx -c nginx.conf -p $PWD; ps aux | grep nginxで再起動します。

1
rofrol