nginxでgzipを有効化して通信データを圧縮する方法

nginxでgzip圧縮を有効化する方法

nginxのサーバ全体でgzipによる圧縮を有効化したい場合、「/etc/nginx/nginx.conf」に「gzip on;」という設定を追加することで圧縮を有効化することができます。

# cd /etc/nginx
# cp -p nginx.conf nginx.conf_$(date +%Y%m%d-%H%M%S)
# vi nginx.conf

gzipの有効化(gzip on)

nginx.confのhttpコンテキストにはgzip onの設定がコメントとして記述されていますので、行頭の「#」を削除して設定を有効化します。

これでtext/htmlはgzipで圧縮されるようになります。

# gzip on;     ### 編集前
gzip on;       ### 編集後

「# gzip on;」の設定が存在しない場合は、「gzip on;」の設定を追加してください。

今回の手順ではサーバ全体でgzipによる圧縮を有効化させていますが、「server」「location」「location内のif」コンテキスト内で個別に設定することもできます。

text/html以外も圧縮(gzip_types)

text/html以外も圧縮したい場合は、gzip_typesで圧縮する対象をmimeタイプで指定することができます。

gzip_types 圧縮対象のMIMEタイプ;

MIMEタイプは複数指定することもできます。

設定例

必要に応じて圧縮したいMIMEタイプを設定します。

gzip_types text/plain
    text/xml
    text/css
    text/javascript
    application/javascript
    application/x-javascript
    application/json
    application/xml
    application/xml+rss
    application/octet-stream;

gzip_typesで指定する場合、text/htmlは常に圧縮する設定になっているので設定してはいけません。

設定するとMIMEタイプが重複していると警告されます。

2022/11/16 22:17:48 [warn] 88001#88001: duplicate MIME type "text/html" in /etc/nginx/nginx.conf:32

必要に応じてその他の設定

必要に応じて設定しておいたほうが良い項目を紹介します。

gzip_min_length 1000;
gzip_comp_level 1;
gzip_vary on;
gzip_proxied any;

gzip_min_length

圧縮するファイルの最小サイズを指定します。

初期設定は20byte以上のファイルを圧縮する設定となっています。

圧縮するファイルのサイズを指定することで、圧縮するコストと比較してメリットが少ない小さいサイズのファイルを圧縮を行わなくなるので、CPUの負荷を減らすことができます。

1,000byte以上のファイルから圧縮を行いたい場合は下記のように設定します。

gzip_min_length 1000;

gzip_comp_level

gzipによる圧縮レベルを設定します。

1-9の間で設定し、数字が大きいほど圧縮率は高くなりますが、その分CPUへの負荷が高くなります。

CPU使用率などを見ながらバランス良く設定しましょう。

初期設定は1となっています。

gzip_comp_level 1;

gzip_vary

「Vary: Accept-Encoding」をレスポンスヘッダにつける設定になります。

gzip_vary on;

gzip_proxied any

クライアントとNginxの間にキャッシュサーバやCDNを経由している際に、それらを経由したことを示すにViaヘッダが含まれている場合でも、gizpで圧縮したい場合に設定します。

ざっくり簡単に言うと、プロキシからのリクエストに対してgzipによる圧縮を許可するという設定になります。

gzip_proxied any;

gzip_varyとgzip_proxiedについては、下記のページにわかりやす説明がありましたので、詳しくはそちらを参照してみてください。

https://qiita.com/cubicdaiya/items/09c8f23891bfc07b14d3

設定例

今回紹介した設定の記載例です。

http {

    ##### 省略 #####

    gzip  on;
    gzip_types text/plain
    	text/xml
    	text/css
    	text/javascript
    	application/javascript
    	application/x-javascript
    	application/json
    	application/xml
    	application/xml+rss
    	application/octet-stream;
    gzip_min_length 1000;
    gzip_comp_level 1;
    gzip_vary on;
    gzip_proxied any;

    ##### 省略 #####
}

設定反映

nginxを再起動して設定を反映させます。

# systemctl restart nginx

確認方法

curlでヘッダーを確認することで、gzipによる圧縮が有効化されているかの確認を行うことができます。

Content-Encoding: gzipと表示されていればgzipによる圧縮が有効になっています。

$ curl -I -H 'Accept-Encoding: gzip,deflate' https://www.server-memo.net
HTTP/1.1 200 OK
Server: nginx/1.10.1
Date: Tue, 15 Nov 2022 14:22:01 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/7.4.33
Link: ; rel="https://api.w.org/"
Link: ; rel="alternate"; type="application/json"
Link: ; rel=shortlink
Content-Encoding: gzip

その他の設定

ここで紹介した以外にも設定できる項目があります。

詳しい説明はNginxの公式ページに説明がありますので参照してみてください。

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

コメント

タイトルとURLをコピーしました