Ubuntu Weekly Recipe

第20回いろいろなキャッシュ:dnsmasq, cache proxy

Ubuntuを利用していく上で、一時的なデータをキャッシュすることで体感速度や利便性を向上させることができます。今回はターミナルからの設定に慣れることも兼ねて、キャッシュ関連の設定を行うレシピを紹介します。

preloadの利用

第8回で紹介したpreloadも一種のキャッシュです。詳細な使い方は第8回を参照してください。

DNSのキャッシュ――dnsmasqを使う

Webブラウザなどを用いてインターネットアクセスを行う場合、システム側では暗黙でDNS解決を行い、ホスト名からIPアドレスを取得しています。Windowsでは暗黙で、Mac OS XではlookupdがDNS解決の結果をキャッシュしていますが、Linuxではキャッシュを行わず、都度DNSサーバへ問い合わせを行ってしまいます。

ローカルでdnsmasqというDNSサーバを稼働させることで、これらのキャッシュと同等の処理を行わせよう、というのがこのレシピです。

ただし、極端に帯域が狭い環境でもない限り、最悪ケースでも100ms程度で名前解決が行えるはずですから、体感速度にはほとんど影響しません。ただし、DNSサーバへの負荷を下げることができますから、無意味ではありません。

dnsmasqのインストール

今回紹介するdnsmasqは、簡易DNSキャッシュサーバとして動作させるのに適した、小型のサーバプログラムです。キャッシュサーバとして動作させる場合、DNSの実装として代表的なbindに比べて非常に簡単に設定できます。さらに、上流のDNSサーバとして/etc/resolv.confに書かれたものを利用するため、ほとんど設定が必要なく、デスクトップ環境で使うのに非常に適しています。

dnsmasqのインストールは次のように行います。まずパッケージをインストールしましょう。

$ sudo apt-get install dnsmasq

dnsmasqは他のPCから参照することもできますが、今回はローカルでのみ動作させますので、/etc/dnsmasq.confの「listen-address=127.0.0.1」という行のコメントアウトを解除します。

--- /etc/dnsmasq.conf.orig
+++ /etc/dnsmasq.conf
@@ -87,7 +87,7 @@
 #except-interface=
 # Or which to listen on by address (remember to include 127.0.0.1 if
 # you use this.)
-#listen-address=127.0.0.1
+listen-address=127.0.0.1
 # If you want dnsmasq to provide only DNS service on an interface,
 # configure it as shown above, and then use the following line to
 # disable DHCP on it.

設定ファイルを修正したら、dnsmasqを再起動します。操作を行うと、以下の例のような表示が出力されるはずです。

なお、多くのホストにアクセスする場合は、cache-sizeパラメータを大きくし、キャッシュする容量を増やしておいた方がよいでしょう。

$ sudo /etc/init.d/dnsmasq restart
 * Restarting DNS forwarder and DHCP server dnsmasq
   ...done.

dnsmasqが正しく動作していることを確認するため、digコマンドを用いて出力を確認しましょう。⁠example.com. 66989 IN A 208.77.188.166」といった出力が得られれば問題ありません。

$ dig @127.0.0.1 example.com

resolv.conf/dhclient.confの設定

このままでは通常の名前解決にはdnsmasqは利用されませんので、resolv.confを修正します。/etc/resolv.confには「nameserver」で始まる既存のエントリがいくつか記述されているはずですが、以下のように、それらの先頭に「nameserver 127.0.0.1」を追加します。

nameserver 127.0.0.1
nameserver 208.77.188.166

これでシステムが利用するDNSサーバとして127.0.0.1(自ホスト)で動作しているdnsmasqが使われるようになります。以下のように、digコマンドの⁠SERVER⁠が127.0.0.1になったことを確認してください(ちなみに、nameserverを追加する前にdigを行った場合、SERVERは既存のDNSサーバを指しているはずです⁠⁠。

$ dig | grep 127.0.0.1
;; SERVER: 127.0.0.1#53(127.0.0.1)

また、デスクトップ環境として一般的な、DHCPクライアントとして利用する環境では/etc/resolv.confは起動時に(厳密にはDHCPによるアドレス取得のたびに)自動的に生成されます。逆に言えば、先ほど行ったnameserver行の追加を、都度行う必要があります。

これでは非常に使いにくいので、DHCPクライアントの設定を行い、生成されるresolv.confにnameserver 127.0.0.1行を自動的に追加するようにします。

/etc/dhcp3/dhclient.confにコメントアウトされた状態でサンプルとして入力されていますが、⁠prepend domain-name-servers 127.0.0.1;」という行を有効にしてください。これにより、以降自動生成されるresolv.confにはnameserver 127.0.0.1行が含まれるようになります。

DNSキャッシュのクリア

dnsmasqを利用している場合、DNSのキャッシュのクリアを任意のタイミングで行う必要が出てくる場合があります。典型的なのは、DNSラウンドロビンで構成されたサーバ群にアクセスする場合です(特に、yahoo.comなどの高度なDNSラウンドロビン制御を行っているサイトの場合、キャッシュがクリアできないと「詰む」ことがあります⁠⁠。

そのような場合は、以下のコマンドでキャッシュをクリアすることが可能です。

$ sudo /etc/init.d/dnsmasq force-reload

Apache2を利用したcache proxy

DNSキャッシュサーバに続けて、Webブラウザのキャッシュを貯め込むHTTPプロクシサーバを構築してみましょう。こちらも先ほどと同じく、ローカルマシン専用に構築します。

HTTPプロクシサーバには様々な実装が存在しますが、今回はあえてApacheを利用したプロクシサーバを構築してみましょう。

なお、充分に高速な回線を利用している場合、プロクシサーバを経由させてもアクセス速度は高速化されません。低速な回線(AIREDGEなど)で利用する場合には大きな効果があるでしょう。

プロクシサーバとしてのApacheのインストール

Apache2.xにはmod_proxyとmod_cacheという二つのモジュールが同梱されており、これらを利用することでプロクシサーバとしても動作させることができます。

以下のようにインストールしてください。

$ sudo apt-get install apache2
$ for i in proxy proxy_http proxy_ftp proxy_connect cache disk_cache mem_cache; do sudo a2enmod $i  ; done 
$ sudo /etc/init.d/apache2 force-reload

このままでは意味もなく外部から接続できてしまいますので、ports.confを変更し、localhostからのみ接続できるように修正します。/etc/apache2/ports.confの⁠Listen⁠行を、以下のように修正(:80や:443の前に127.0.0.1を追加)してください。

Listen 127.0.0.1:80

<IfModule mod_ssl.c>
    Listen 127.0.0.1:443
</IfModule>

この状態でApacheをリスタートします。

$ sudo /etc/init.d/apache2 restart

Apacheが正しくローカルホストからのみの接続をListenしているかをチェックしましょう。以下のコマンドを利用します。以下のように、localhost:www がListenされていれば問題ありません(ports.confの修正前であれば、*:wwwでListenしていたはずです⁠⁠。

$ sudo lsof -i | grep apache
apache2   11835     root    3u  IPv4  68519       TCP localhost:www (LISTEN)
apache2   11840 www-data    3u  IPv4  68519       TCP localhost:www (LISTEN)
apache2   11858 www-data    3u  IPv4  68519       TCP localhost:www (LISTEN)

ここまでの設定が終了したら、プロクシサーバとしての機能を有効にします。/etc/apache2/mods-available/proxy.confを以下のように修正してください。

--- proxy.conf.orig
+++ proxy.conf
@@ -2,19 +2,18 @@
         #turning ProxyRequests on and allowing proxying from all may allow
         #spammers to use your proxy to send email.

-        ProxyRequests Off
+        ProxyRequests On

         <Proxy *>
                 AddDefaultCharset off
                 Order deny,allow
                 Deny from all
-                #Allow from .example.com
+                Allow from 127.0.0.1
         </Proxy>

         # Enable/disable the handling of HTTP/1.1 "Via:" headers.
         # ("Full" adds the server version; "Block" removes all outgoing Via: headers)
         # Set to one of: Off | On | Full | Block

-        ProxyVia On
+        ProxyVia Off
 </IfModule>

修正したら、再度apacheをリロードします。

$ sudo /etc/init.d/apache2 force-reload

これでプロクシサーバの準備ができました。Firefoxの設定を変更しましょう。⁠編集⁠⁠→⁠設定]でオプションダイアログを開き、⁠詳細⁠⁠ネットワーク⁠タブにある、⁠接続設定]ボタンを押し、⁠手動でプロキシを設定する⁠から設定を行ってください。

キャッシュの制限

Apache2のディスクキャッシュは、放っておくとHDDを使い切るまでキャッシュを貯め込もうとします。そこで、htcachecleanという削除のためのコマンド兼デーモンが用意されています。

上記の設定を行った時点で(正確には、e2enmod disk_cacheの時点で)Apacheが起動すると自動的に/usr/sbin/htcachecleanがデーモンモードで動作するようになっています。

デフォルトではキャッシュが300MB以下になるように動作します。このキャッシュの増減は、/etc/default/apache2にあるHTCACHECLEAN_SIZEパラメータで行うことができます。

おすすめ記事

記事・ニュース一覧