web-dev-qa-db-ja.com

ロードバランサーを通過するときにNginxがgzip圧縮されたアセットを送信しない

他のアプリケーションサーバーにリクエストを委任するロードバランサーとして機能するnginxサーバーがあります。

アセットをアプリケーションサーバーに直接リクエストしようとすると、アセットはgzip圧縮されたバージョンで提供されます。サンプル:

➜ ~ curl -IH 'Accept-Encoding: gzip, deflate' http://application/asset.css HTTP/1.1 200 OK Server: nginx/1.6.2 Date: Thu, 15 Sep 2016 14:13:03 GMT Content-Type: text/css Content-Length: 35038 Connection: keep-alive Content-Encoding: gzip Expires: Thu, 31 Dec 2037 23:55:55 GMT Cache-Control: max-age=315360000 Cache-Control: public

ロードバランサーへの同じリクエスト中に、アセットの非圧縮バージョンを返します。 ➜ ~ curl -IH 'Accept-Encoding: gzip, deflate' https://load-balancer/asset.css HTTP/1.1 200 OK Server: nginx/1.6.2 Date: Thu, 15 Sep 2016 14:16:15 GMT Content-Type: text/css Content-Length: 240442 Connection: keep-alive Expires: Thu, 31 Dec 2037 23:55:55 GMT Cache-Control: max-age=315360000 Cache-Control: public Accept-Ranges: bytes

ここにLBの私の構成があります:location / { client_max_body_size 10M; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_Host; proxy_set_header X-Forwarded-Proto https; # if use ssl proxy_redirect off; proxy_pass http://application; }

前もって感謝します

2
Iván Guillén

解決しました!

ロードバランサーからアップストリーム(アプリケーションサーバー)に送信されるリクエストはHTTP/1.0で行われるのに対し、アプリケーション側のnginxサーバーは、リクエストがHTTP> = 1.1の場合にのみファイルを圧縮することを理解しました。デフォルトのパラメータが原因です。

http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_http_version

3
Iván Guillén

これを解決する別の方法があります。アップストリームへの接続をプロキシするために、より高いHTTPプロトコルバージョンを設定できます。これは次のパラメータで実行できます:proxy_http_version 1.1;

このようにして、持続的接続追加の新しいステータスコード

たとえば、これは私自身の設定ブロックです。

server {
    listen       80;
    server_name  domain.tld;
    location / {
         include proxy_params;
         proxy_http_version 1.1;
         proxy_pass http://my-up-stream;
    }
}

http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_http_version

3
mahyard