NginxをリバースプロキシとしてTomcatのレスポンスをGzip圧縮する

Nginxをリバースプロキシとして使う

Nginxは軽量&高速に動くWebサーバーです。前回インストールと表示まで実験しました。今回はNginxをリバースプロキシとして動作させて、既存のWebサーバの動作を高速化させます。

はじめまして、Nginx

Tomcatのセットアップ

アプリケーションサーバ兼WebサーバとしてTomcatをインストールします。

$ sudo brew install tomcat

以上です。

Nginxをリバースプロキシとして使う

NginxはWebサーバとして使う事もできますが、既に使い慣れたApacheやTomcatからコンテンツを移動するのは面倒です。逆に、ApacheやTomcatでサイトが運営中の場合、複雑な設定ファイルを修正するのは面倒です。そこで、既存のWebサーバに触らず動作を変えます。

Nginxの動作を設定するファイルは、nginx.confです。これを編集します。

$ vi /usr/local/etc/nginx/nginx.conf
http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;
    
    server {
        listen       8088;
        server_name  localhost;

        location / {
	    proxy_pass http://localhost:8080;
        }
    }
}

Nginxを再起動して動作確認します。

$ /usr/local/Cellar/nginx/1.0.6/sbin/nginx -s stop
$ /usr/local/Cellar/nginx/1.0.6/sbin/nginx

http://localhost:8088を指定して無事に表示できました。概念図は以下になります。

Gzipの設定をする

GzipはHTTPでやり取りされる情報をzip圧縮して通信の効率を上げる仕組みです。Webアプリのボトルネックは描画よりも通信周りということでGzipは有効です。nginx.confを以下のように修正しました。

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;
    
    gzip on;
    gzip_http_version 1.1;
    gzip_types text/plain
               text/xml
               text/css
               application/xml
               application/xhtml+xml
               application/rss+xml
               application/javascript
               application/x-javascript;
    gzip_buffers 4 8k;
    gzip_min_length 1000;
    gzip_comp_level 1;
    gzip_proxied off;
    gzip_disable "MSIE [1-6]\."  "Mozilla/4";
    gzip_vary off;
    
    server {
        listen       8088;
        server_name  localhost;

        location / {
	    proxy_pass http://localhost:8080;
        }
    }
}

基本的にはgzip_onとgzip_typesだけの設定で動きます。実際に動いているかブラウザで確認します。

まずは、直接Tomcatを見た場合

次に、NginxでGzipをした場合

Gzipを使った場合、通信量は、47.83KBから35.61KBになり、25%OFFとなりました。ただし、ロード時間は33msから51msへと増えてしまいました。おそらくこれはnginxでの処理時間とzip圧縮されたファイルを解凍している時間かと思います。今回の例はローカルで行っていますのでちょっと例が悪かったですね。実際のところはデータサイズに合わせてネットワーク通信時間が掛かりますのでGzip圧縮は有効な手段かと思います。

まとめ

Nginxを用いることによって、既存のWebサーバの設定を一切変更することなくネットワーク上に流れるデータサイズを小さくすることができました。リバースプロキシを使ってアプリケーション全体のパフォーマンスを上げましょう!

参考資料

HttpGzipModule