Ubuntu Weekly Recipe

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

この記事を読むのに必要な時間:およそ 3 分

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

著者プロフィール

吉田史(よしだふみひと)

Ubuntu Japanese Team Member株式会社創夢所属。システム管理を中心にWindows/PC Unixを併用している。Ubuntu Japanese Teamではパッケージサーバの管理や翻訳などの作業を担当。

コメント

  • 焼き鳥

    刺せない串はない。この記事のおかげで、串活動も、充実します。

    エレガントな串カツには、この記事が良い。

    Commented : #1  串職人 (2012/05/23, 23:04)

コメントの記入