「プロキシを通すと遅くなる」なんて言わせない。
こんにちは!「LINUX工房」管理人の「リナックス先生」です。
前回は、SSLバンピングを使ってHTTPS通信を制御するという、少し難しいテーマを扱いました。
さて、プロキシサーバーを導入すると、社内のユーザーからこんなクレームが来ることがあります。
「ネットが重くなった」「画像の表示がワンテンポ遅れる」
先生、まさにそれです!
セキュリティのために導入したのに、「遅いから外してくれ」って言われて肩身が狭いです。
間にサーバーを挟むんだから、どうしても遅くなるのは仕方ないんじゃないんですか?
それは設定が「デフォルトのまま」だからよ。
Squidの真骨頂は「キャッシュ(Cache)」にあるの。
一度誰かが見たWebページや画像をSquidが保存しておけば、2人目からはインターネットに取りに行かずに、Squidが即座に返却してくれるわ。
設定次第では、直結するより遥かに速くなるのよ!
今回は、Squidのパフォーマンス・チューニング編です。
サーバーのメモリとディスクをフル活用して、ユーザーが驚くような「爆速プロキシ」を作り上げましょう。
🦑 Squid完全攻略講座(バックナンバー)
- 【第1回】プロキシサーバーとは?仕組みの完全図解とインストール
- 【第2回】アクセス制御の基礎(ACL)とポート設定
- 【第3回】「誰?」を識別する認証プロキシ(Basic/Digest)の構築
- 【第4回】暗号化通信の制御!HTTPSとSSL接続の仕組み
- 【第5回】爆速化!キャッシュ機能のチューニングとメモリ管理
- 【第6回】アクセスログ解析とモニタリングの極意
- 【第7回】鉄壁の守り!フィルタリング(ブラックリスト/ホワイトリスト)
- 【第8回】トラブルシューティングと冗長化構成(PACファイル)
第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 01 … 0F というディレクトリが作られていれば成功です。
第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」で自分専用環境
サーバー知識を年収に
「ITエンジニア転職」


コメント