【Squid講座 第5回】ネットが遅い?Squidの「キャッシュ機能」を極限までチューニングして爆速化せよ

「プロキシを通すと遅くなる」なんて言わせない。

こんにちは!「LINUX工房」管理人の「リナックス先生」です。
前回は、SSLバンピングを使ってHTTPS通信を制御するという、少し難しいテーマを扱いました。

さて、プロキシサーバーを導入すると、社内のユーザーからこんなクレームが来ることがあります。
「ネットが重くなった」「画像の表示がワンテンポ遅れる」

コウ君

先生、まさにそれです!
セキュリティのために導入したのに、「遅いから外してくれ」って言われて肩身が狭いです。
間にサーバーを挟むんだから、どうしても遅くなるのは仕方ないんじゃないんですか?

リナックス先生

それは設定が「デフォルトのまま」だからよ。
Squidの真骨頂は「キャッシュ(Cache)」にあるの。
一度誰かが見たWebページや画像をSquidが保存しておけば、2人目からはインターネットに取りに行かずに、Squidが即座に返却してくれるわ。
設定次第では、直結するより遥かに速くなるのよ!

今回は、Squidのパフォーマンス・チューニング編です。
サーバーのメモリとディスクをフル活用して、ユーザーが驚くような「爆速プロキシ」を作り上げましょう。

🦑 Squid完全攻略講座(バックナンバー)


第1章:Squidのキャッシュの仕組み(メモリ vs ディスク)

Squidは2種類の保管場所を持っています。
それぞれの特性を理解することが、チューニングの第一歩です。

1. メモリキャッシュ (RAM)

サーバーの物理メモリ(RAM)上にデータを保存します。

  • 速度: 爆速(ナノ秒単位)。
  • 容量: 少ない(サーバーの搭載メモリに依存)。
  • 揮発性: 再起動すると消える。
  • 用途: よくアクセスされる小さな画像、アイコン、HTML、DNS検索結果など。

2. ディスクキャッシュ (HDD/SSD)

ハードディスクやSSD上にデータを保存します。

  • 速度: メモリより遅い(特にHDDは遅い)。
  • 容量: 巨大(数TBでも可能)。
  • 永続性: 再起動しても残る。
  • 用途: 大きなファイル(PDF、インストーラー、動画)、あまり頻繁にはアクセスされないが残しておきたいもの。

理想的な戦略

「可能な限りメモリに詰め込み、溢れた分や大きいファイルだけディスクに逃がす」のが鉄則です。
デフォルト設定のSquidは、メモリ使用量が非常に保守的(少なめ)に設定されているため、現代のハイスペックサーバーでは宝の持ち腐れ状態です。
これを解放してあげましょう。


第2章:【実践】メモリキャッシュの最適化

それでは /etc/squid/squid.conf を編集していきます。
まずはメモリ周りの設定です。

1. cache_mem(使用するメモリ量)

Squidがキャッシュデータのために使うメモリの上限です。
デフォルトはわずか 256 MB 程度になっていることが多いです。

推奨値: サーバーの実装メモリの 1/3 〜 1/2 程度。
(例:4GBのサーバーなら 1GB〜2GB)

# 設定例(2GBを割り当てる)
cache_mem 2048 MB

⚠️ 注意:割り当てすぎに注意!
OS自身も動くためにメモリが必要です。ギリギリまで割り当てると、スワップ(ディスクへの退避)が発生し、逆に激重になります。
また、Squidはキャッシュデータ以外にも「管理用」としてメモリを消費するため、cache_mem で指定した以上のメモリを食います。余裕を持ちましょう。

2. maximum_object_size_in_memory(メモリに入れる最大サイズ)

「これより大きいファイルはメモリには入れない(最初からディスクに書く)」という閾値です。
デフォルトは 512 KB 程度です。

最近のWebサイトは高画質画像が多いため、少し広げておくとヒット率が上がります。

# 設定例(4MB以下のファイルはメモリに入れる)
maximum_object_size_in_memory 4 MB

第3章:【実践】ディスクキャッシュの最適化(aufs)

次はディスクキャッシュです。
デフォルトでは無効化されている(コメントアウトされている)ことが多いので、有効化します。

1. cache_dir(保存場所と形式)

ここがチューニングの肝です。
Squidにはいくつかのストレージ形式がありますが、Linuxでは aufs を使うのが定石です。

  • ufs: 標準的だが、I/O処理中にSquid全体の動きが一瞬止まる(ブロッキング)。
  • aufs: I/O処理を別スレッドで行う(非同期)。圧倒的に高速。

書式: cache_dir aufs [パス] [容量MB] [L1ディレクトリ数] [L2ディレクトリ数]

# 設定例(/var/spool/squid に 10GB確保、aufs使用)
cache_dir aufs /var/spool/squid 10000 16 256
  • 10000 : キャッシュ容量(MB)。ディスクの空き容量と相談して決めます(ディスクの8割程度まで)。
  • 16 : 1階層目のディレクトリ数。通常は16でOK。
  • 256 : 2階層目のディレクトリ数。通常は256でOK。

2. オブジェクトサイズの制限

ディスクには、あまりに巨大なファイル(ISOイメージなど)はキャッシュしたくない場合があります。
ディスク容量を圧迫し、他の小さなキャッシュを追い出してしまうからです。

# ディスクに保存する最大ファイルサイズ(100MB)
maximum_object_size 100 MB

# これより小さいファイルはディスクに保存しない(0でOK)
minimum_object_size 0 KB

3. 【重要】キャッシュディレクトリの初期化

cache_dir の設定を有効にしたら、Squidを再起動する前に、ディレクトリ構造を作成するコマンドを実行する必要があります。
これをやらないとSquidが起動しません。

# Squidを停止
sudo systemctl stop squid

# キャッシュディレクトリの構造を作成(-z オプション)
sudo squid -z

# 実行ログが表示され、完了したら起動
sudo systemctl start squid

/var/spool/squid/ の中に 00 010F というディレクトリが作られていれば成功です。


第4章:キャッシュの寿命を決める「refresh_pattern」

「キャッシュしたのはいいけど、本家のサイトが更新されたらどうするの?」
そのルールを決めるのが refresh_pattern です。

Squidは、Webサーバーからの「Last-Modified(最終更新日時)」や「Expires(有効期限)」ヘッダーを見て、キャッシュの鮮度を計算します。
しかし、ヘッダーがない場合などのデフォルトルールを定義する必要があります。

書式: refresh_pattern [-i] [正規表現] [最小(分)] [%] [最大(分)]

# 画像ファイルは長くキャッシュする(最低1440分〜最大10080分=7日間)
refresh_pattern -i \.(gif|png|jpg|jpeg|ico)$ 1440 20% 10080

# ISOファイルやアップデートファイルは超長くキャッシュする
refresh_pattern -i \.(iso|gz|tar|zip|exe)$ 14400 20% 43200

# デフォルト(その他すべて)
refresh_pattern . 0 20% 4320

パラメータの意味:

  • 最小(Min): この期間内なら、サーバーに問い合わせずにキャッシュを返す(絶対ヒット)。
  • 最大(Max): この期間を過ぎたら、必ずサーバーに更新確認に行く。
  • %(Percent): (現在の時刻 - 最終更新日時) * % が、キャッシュ経過時間より長ければ新鮮とみなす。
    (例:10日前に作られたファイルなら、その20%=2日間はキャッシュを信じる)

第5章:キャッシュしたくない通信の除外

逆に、「キャッシュすると不具合が起きるサイト」もあります。
社内システムや、常に最新情報が必要な金融系サイトなどです。

no_cache 設定を使って除外します。

# キャッシュしないドメインの定義
acl no_cache_domains dstdomain .my-company.local .bank.co.jp

# 適用(deny = キャッシュしない)
cache deny no_cache_domains

第6章:運用コマンド「ヒット率確認」と「削除」

設定して終わりではありません。
効果が出ているか確認しましょう。

1. ヒット率の確認(squidclient)

Squidには管理用コマンド squidclient があります。
これを使って統計情報を見ます。

sudo squidclient mgr:info

出力の中に以下の行があります。

Cache Hits as % of Request Hits: 5min: 45.2%, 60min: 42.1%
Cache Hits as % of Byte Hits:    5min: 12.5%, 60min: 15.0%

この Request Hits がヒット率です。
一般的に、30%〜50% 程度あれば優秀です。
つまり、全アクセスの半分近くをSquidが即答しており、インターネット回線の負荷を半分に減らしていることになります。

2. キャッシュのクリア(全削除)

「キャッシュのせいで古いページが表示され続ける!」というトラブルが起きた場合、キャッシュを全て消してリセットする手順です。

# 1. Squidを停止
sudo systemctl stop squid

# 2. キャッシュディレクトリの中身を削除(危険コマンドなので注意!)
# 設定した cache_dir のパスを指定
sudo rm -rf /var/spool/squid/*

# 3. ディレクトリ構造を再作成
sudo squid -z

# 4. 起動
sudo systemctl start squid

第7章:トラブルシューティング Q&A

Q1. HTTPS(SSL)のキャッシュが効いていない気がする

A. SSLバンピングをしていない場合、効きません。
第4回で解説した「SSLバンピング」を行っていない場合、Squidは暗号化されたトンネルを中継しているだけなので、中の画像やHTMLを個別にキャッシュすることはできません。
HTTPS通信をキャッシュしたいなら、SSLバンピングの導入が必須です。

Q2. “Disk usage over limit” の警告が出る

A. キャッシュがいっぱいです(正常動作)。
Squidは、cache_dir で指定した容量がいっぱいになると、古いキャッシュから自動的に削除(LRU方式)して新しいデータを入れます。
警告ログは出ますが、機能停止するわけではないので問題ありません。
あまりに頻繁に入れ替わるようなら、ディスク容量を増やすことを検討してください。


まとめ:キャッシュは「資産」である

お疲れ様でした!
これであなたのSquidは、ただの「関所」から「高速化エンジン」へと進化しました。

今回の重要ポイント:

  • メモリキャッシュ(cache_mem)を増やして、小さなファイルを爆速化する。
  • ディスクキャッシュには aufs を使い、大きなファイルを保存する。
  • refresh_pattern でキャッシュの賞味期限を適切に決める。
  • 設定変更後は squid -z で初期化が必要な場合がある。

適切にチューニングされたプロキシは、ユーザーにとって「邪魔者」ではなく「快適なネット環境の立役者」になります。

さて、プロキシが稼働し始めると、次に気になるのは「誰がどんなサイトを見ているのか?」ですよね。
次回、第6回は「アクセスログ解析とモニタリングの極意」です。
Squidのログフォーマットをカスタマイズし、可視化ツールを使って「サボっている社員」や「ウイルス感染の兆候」を発見するテクニックを紹介します。
お楽しみに!

▼ エンジニアとしてのキャリアを加速させる ▼

高速プロキシを構築
「VPS」で自分専用環境

おすすめVPSを見る

サーバー知識を年収に
「ITエンジニア転職」

転職エージェントを見る

コメント