Jump to contentJump to page navigation: previous page [access key p]/next page [access key n]
適用先 openSUSE Leap 15.6

26 squid: キャッシュ機能付きプロキシサーバ Edit source

概要

squid は Linux プラットフォームや Unix プラットフォームで幅広く使用されている、キャッシュ機能付きプロキシサーバです。 Web や FTP サーバなどのインターネット側のオブジェクトに対して、元のサーバよりも端末側に近いマシンが代行してアクセスを行い、それらを保管しておくことができます。また、このようなプロキシを複数階層の構成にして、応答時間の削減やネットワーク負荷の軽減などを行うこともできます。このようにして複数階層の構成にしても、エンドユーザからその構造が見えることはなく、透過的に動作させることができます。

squid はプロキシキャッシュとして動作します。クライアント (一般的には Web ブラウザ) からのオブジェクト要求をサーバに転送します。相手側のサーバから必要なオブジェクトが届くと、それをクライアントに対して配信するとともに、ハードディスク内のキャッシュとして、そのコピーを保存しておきます。このようなキャッシュの仕組みにより、複数のクライアントが同じオブジェクトを要求した場合に、ハードディスク内のキャッシュからオブジェクトを提供できるようになります。これはインターネットに直接アクセスするよりもずっと高速であるだけでなく、ネットワーク負荷の軽減にも繋がります。

squid では、キャッシュ機能のほかに、下記のような幅広い機能を提供します:

  • プロキシサーバ間の相互通信による負荷分散

  • プロキシにアクセスする全てのクライアントに対して適用できる、厳密なアクセス制御リスト

  • 他のアプリケーションを併用することで実現できる、特定の Web ページへのアクセス許可やアクセスの禁止

  • Web アクセスの傾向を確認するための Web ページ統計情報機能

squid は汎用のプロキシサーバではありません。通常は HTTP 接続のみを取り扱います。 FTP, Gopher, SSL, WAIS などのプロトコルにも対応していますが、 news プロトコルやビデオ会議プロトコルなどの他のインターネットプロトコルには対応していません。また squid では、 UDP プロトコルへの対応はプロキシキャッシュ間の通信にのみ対応しているため、ほとんどのマルチメディアプログラムにも対応していません。

26.1 プロキシサーバに関するいくつかの事実 Edit source

squid はキャッシュ機能付きプロキシサーバとして、様々な用途に使用することができます。たとえばファイアウオールと併用すると、セキュリティを高めることができます。また、プロキシは複数を組み合わせて使用することもできます。また、キャッシュ対象とするオブジェクトの種類を指定したり、どれだけの期間保存しておくのかを指定したりすることもできます。

26.1.1 squid とセキュリティ Edit source

squid とファイアウオールを併用することで、外部の攻撃から内部ネットワークを保護することができるようになります。ファイアウオールでは、 squid を除いて全てのクライアントからの外部サービスアクセスを拒否するように設定することで、全ての Web 接続をプロキシ経由で行わせることができます。これにより、 squid で Web アクセスの全てを制御できるようになります。

ファイアウオールの設定内に DMZ の構成が含まれる場合、プロキシは DMZ 内で動作させるべきです。 26.6項 「透過型プロキシの設定」 では、 透過型 プロキシを実装するための手順を説明しています。この透過型プロキシの構成により、クライアント側ではプロキシに関する設定を行う必要がなくなりますので、設定をより簡単に済ませることができます。

26.1.2 複数のキャッシュ Edit source

複数の squid インスタンスを動作させて、お互いにオブジェクトを交換できるように設定することもできます。これによりシステム全体の負荷を軽減し、ローカルネットワーク内でオブジェクトの取得を完了させる機会を増やすことができます。また、キャッシュには階層構造を設定することもできます。これにより、オブジェクトへの要求を兄弟関係にあるキャッシュに転送したり、親キャッシュに転送したりすることができるようになります。これにより、ローカルネットワーク内の他のキャッシュからオブジェクトを提供するか、直接情報源から取得するかを効率的に選択することができるようになります。

キャッシュの階層構造を構築するにあたっては、適切なトポロジ選択が重要です。なぜなら、ネットワーク内のトラフィック量を減らすことが、プロキシキャッシュの目的の 1 つであるからです。非常に巨大なネットワークの場合、それぞれのサブネット内にそれぞれプロキシサーバを設置して、それらは親プロキシサーバに接続して、親プロキシサーバからインターネットに直接アクセスするような構成が良いでしょう。

ここで行われる通信は、 UDP プロトコル上で動作する ICP (Internet Cache Protocol) で行われます。キャッシュ間のデータ転送は、 TCP をベースにした HTTP (HyperText Transmission Protocol) で行われます。

特定のオブジェクトを要求するにあたって、最も適切なサーバを選択する目的で、キャッシュは全ての兄弟関係のプロキシに対して、 ICP リクエストを送信します。 ICP リクエストを受け取ったプロキシは、 ICP レスポンスとしてそれらの要求に応答します。オブジェクトが見つかった場合は HIT を、見つからなかった場合は MISS を使用して応答します。

複数の HIT 応答が届いた場合、プロキシサーバは最も高速に応答したサーバや、最も近いサーバなどの判断基準で、特定のサーバを選択します。逆に、必要な応答が届かなかった場合、要求はそのまま親キャッシュに送信されます。

注記
注記: squid でのオブジェクト重複の回避方法について

ネットワーク内の複数のキャッシュ間でオブジェクトの重複を防ぐため、 CARP (Cache Array Routing Protocol) や HTCP (HyperText Cache Protocol) などの他の ICP プロトコルを使用します。ネットワーク内で保持されるオブジェクトが増えれば増えるほど、必要なオブジェクトを見つける機会が増えることになります。

26.1.3 インターネットオブジェクトのキャッシュ Edit source

動的に生成されるページや TLS/SSL で暗号化されたコンテンツなど、ネットワーク内にある多くのオブジェクトは静的なものではありません。これらのオブジェクトは、アクセスが行われるたびに変化するものであることから、キャッシュが行われません。

また、キャッシュ内にオブジェクトを保持する期間を判断する目的で、オブジェクトには状態が割り当てられます。 Web やプロキシサーバでは、 最終更新日時期限切れ日時 などの仕組みを用意することで、これらのオブジェクトに対して状態を付与できるようになっています。なお、オブジェクトに含まれるその他のヘッダ情報については、そのままキャッシュ内に保持されます。

キャッシュ内のオブジェクトは、ディスク領域の不足などを理由として置き換えられるのが一般的です。この処理を行うにあたっては、 LRU (Least Recently Used) などのアルゴリズムを使用します。これにより、最も長い時間使われていないオブジェクトは、キャッシュから消滅することを意味します。

26.2 システム要件 Edit source

システムに対する要件は、システムが耐えられるべき最大のネットワーク負荷に大きく依存して決まります。ネットワークの負荷は、最大では日々の平均の 4 倍を超えるようなことも珍しくありません。また、心配な場合は、システムの要件よりも少し多めに見積もっておくとよいでしょう。これは、 squid は性能の限界まで使用されてしまうと、サービス品質の観点で多大な損失が発生してしまうためです。下記には、システム要件の要素として重要な順序を示しています:

  1. メモリサイズ

  2. CPU の速度/物理 CPU コア数

  3. ディスクキャッシュのサイズ

  4. ハードディスクか SSD か、およびその構造

26.2.1 メモリ Edit source

squid で必要とされるメモリ量は、キャッシュ内のオブジェクトの数に依存して決まります。メモリはハードディスクや SSD より高速に動作するものであるため、 squid プロセスに対しては十分なメモリの割り当てが重要となります。メモリが不足してスワップディスクを使用してしまうと、システムの性能が劇的に下がる結果になります。

squid では、データの取得を高速化する目的で、キャッシュオブジェクトの参照と頻繁に要求されるオブジェクトについては、メインメモリ内に保持するようになっています。これに加えて、処理した全ての IP アドレスの一覧やドメイン名の正確なキャッシュ、そして最もよく要求されるオブジェクトやアクセス制御リスト、バッファなどについても、 squid はメモリ内に保持する必要があります。

26.2.2 CPU Edit source

squid はプロセッサのコア数の少ない (物理コア数で 4 〜 8 コア程度) 環境でも十分に動作するようチューニングされています。また、ハイパースレッディングなどの仮想的なコアでは、性能が十分に引き出せない場合があります。

複数の CPU コアを効率的に使用するため、異なるキャッシュデバイスに書き込むワーカースレッド数を多くする必要があります。既定では、マルチコアサポートのほとんどが無効化されています。

26.2.3 ディスクキャッシュのサイズ Edit source

小さなキャッシュの場合は、 HIT (つまり、オブジェクトが既に取得済みのものである) の確率が小さくなります。なぜなら、小さなキャッシュではすぐにオブジェクトで埋め尽くされてしまうため、頻繁に使用されるものであっても容易に廃棄されてしまうからです。たとえばキャッシュに 1 GB を割り当てていて、ユーザが 1 日あたり 10 MB 程度のアクセスしかしない環境であれば、キャッシュを埋め尽くすのに 100 日程度かかることになります。

キャッシュとして必要なサイズを判断するのに最も簡単な方法は、インターネット接続の最大転送速度から見積もる方法です。たとえば 1 Mbit/s のインターネット接続の場合、最大転送速度は 128 KB/s になります。キャッシュ内を 1 時間で埋め尽くすと仮定すると、必要なサイズは 460 MB になります。また、業務時間を 8 時間と仮定すると、 1 日あたり 3.6 GB になります。インターネット接続は一般に、最大まで使用することはありませんので、キャッシュとして使用するのはおおよそ 2 GB 程度で十分ということになります。そのため、この例では squid に対して 2 GB 程度のキャッシュを設定することで、 1 日分に相当するデータをキャッシュできることになります。

26.2.4 ハードディスク/SSD の構成 Edit source

キャッシュ処理においては、速度が重要となります。そのため、この要素に対しては特別に配慮しておくことをお勧めします。ハードディスクや SSD の場合、このパラメータは ランダムシークタイムランダムリードパフォーマンス などとして示され、多くはミリ秒で示されます。 squid からハードディスクや SSD に書き込んだり、それらから読み込んだりするデータは小さいものであるため、データのスループットよりはシークタイムや読み込み性能のほうがより重要となります。

プロキシとして使用する場合、高速回転のハードディスクや SSD を使用しておくことが最適な選択となります。ハードディスクを使用する場合、複数の小さなハードディスクを使用して、それぞれにキャッシュディレクトリを設定することで、読み込み時間を削減することができます。

RAID システムを使用すると、速度を犠牲にして信頼性を増すことができますが、性能上の理由から、 (ソフトウエア) RAID5 やそれに類似の設定は避けておくことをお勧めします。

ほとんどの場合において、ファイルシステムの選択はそれほど重要ではありません。ただし、マウントオプションに noatime を指定することで、性能を改善することができます。これは、 squid では独自のタイムスタンプを保持しているため、ファイルシステム側でアクセス日時を管理する必要が無いためです。

26.3 squid の基本的な使い方 Edit source

openSUSE® Leap では squid は既定でインストールされませんので、まずはお使いのシステムにインストールを行ってください。

squid は openSUSE Leap 側であらかじめ設定済みであるため、インストール直後からすぐに起動することができます。なお、起動時の問題を回避するため、あらかじめインターネットに接続しておき、少なくとも 1 つ以上のネームサーバを設定しておいてください。また、動的な DNS 設定でダイヤルアップ接続を行っている場合は、起動時に問題が発生する場合があります。これは、 squid では、 /var/run/netconfig/resolv.conf 内に DNS サーバの設定が存在しないと、開始することができないことによるもので、この場合は少なくとも 1 つ以上のネームサーバを固定で設定しておいてください。

26.3.1 squid の開始 Edit source

squid を起動するには、下記のコマンドを実行します:

> sudo systemctl start squid

システムの起動時に squid を開始するように設定したい場合は、 systemctl enable squid のように実行して、サービスを有効化します。

26.3.2 squid が動作しているかどうかの確認 Edit source

squid が動作しているかどうかを確認するには、下記のコマンドを実行します:

  • systemctl を使用する場合:

    > systemctl status squid

    上記のコマンドの出力に loadedactive (running) が含まれていれば、 squid が動作していることになります。

  • また、 squid 自身でも確認することができます:

    > sudo squid -k check | echo $?

    このコマンドの出力は 0 であるべきですが、追加の警告やメッセージが含まれることもあります。

ローカルシステム内で squid の機能をテストするには、下記のいずれかの方法を使用します:

  • テストを行うには、 squidclient と呼ばれるコマンドラインツールをお使いください。これは Web リクエストを送信して出力を表示することのできるツールで、 wgetcurl に似た仕組みです。

    なお、 wgetcurl 等のツールとは異なり、 squidclient はローカルの squid (localhost:3128) に対して接続を行います。 squid 側の設定でポートを変更している場合は、 squidclient のコマンドラインオプションを指定して、プロキシを指定する必要があります。詳しくは squidclient --help をお読みください。

    例 26.1: squidclient によるリクエスト送信
    > squidclient http://www.example.org
    HTTP/1.1 200 OK
    Cache-Control: max-age=604800
    Content-Type: text/html
    Date: Fri, 22 Jun 2016 12:00:00 GMT
    Expires: Fri, 29 Jun 2016 12:00:00 GMT
    Last-Modified: Fri, 09 Aug 2013 23:54:35 GMT
    Server: ECS (iad/182A)
    Vary: Accept-Encoding
    X-Cache: HIT
    x-ec-custom-error: 1
    Content-Length: 1270
    X-Cache: MISS from moon1
    X-Cache-Lookup: MISS from moon:3128
    Via: 1.1 moon (squid/3.5.16)2
    Connection: close
    
    <!doctype html>
    <html>
    <head>
        <title>Example domain</title>
    [...]
    </body>
    </html>

    例26.1「squidclient によるリクエスト送信」 に示されている出力は、 2 つのパートから構成されています:

    1. 応答のプロトコルヘッダ: 1 行分の空き (空行) より前の部分がそれにあたります。

    2. 応答の本体: 空行より後ろの部分がそれにあたります。

    squid を使用していることを確認するため、下記のヘッダ行をご確認ください:

    1

    X-Cache ヘッダの値には、要求した文書がコンピュータ moon 内の squid キャッシュ内に存在していなかった ( MISS ) ことが示されています。

    上記の例には、 2 つの X-Cache ヘッダが存在しています。ですが、最初の X-Cache ヘッダについては、無視してかまいません。これは、相手側の Web サーバのキャッシュソフトウエアで生成されたヘッダであるためです。

    2

    Via の値には、 HTTP のバージョンとコンピュータの名前、そして使用している squid のバージョンが示されています。

  • 次にブラウザを利用して確認します: プロキシサーバに localhost を、プロキシサーバのポートに 3128 を指定してブラウザを設定します。この状態から何らかの Web ページを開いて、ブラウザの インスペクタ開発者ツール 内にある ネットワーク パネルから、応答ヘッダを確認してください。 例26.1「squidclient によるリクエスト送信」 と同様のヘッダが存在しているはずです。

ローカルシステムや他のシステムから squid 経由でインターネットにアクセスできるようにするには、設定ファイル /etc/squid/squid.conf 内にある http_access deny allhttp_access allow all に変更してください。ただし、この設定を実施すると、 squid は誰からもアクセスできるようになってしまうことに注意してください。アクセスできるユーザを制限したい場合は、 ACL (Access Control List; アクセス制御リスト) を設定して行います。また、設定ファイルを変更した場合は、 squid を再読み込みさせるか、再起動しなければなりません。 ACL について、詳しくは 26.5.2項 「アクセス制御用オプション」 をお読みください。

squid が正しく開始できているにもかかわらず、しばらくして squid が停止してしまうような場合は、ネームサーバの設定が正しく行われていないか、 /var/run/netconfig/resolv.conf ファイルがそもそも存在していないことが考えられます。 squid では、開始時の問題を /var/log/squid/cache.log ファイル内に記録します。

26.3.3 squid の停止/再読み込み/再起動 Edit source

squid を再読み込みさせるには、下記のいずれかを実施します:

  • systemctl を使用する場合:

    > sudo systemctl reload squid

    もしくは、下記のように実行してもかまいません:

    > sudo systemctl restart squid
  • YaST を使用する場合は、下記のようにします:

    squid モジュールを起動して 設定を保存して squid を再起動する ボタンを押します。

squid を停止するには、下記のいずれかを実施します:

  • systemctl を使用する場合:

    > sudo systemctl stop squid
  • YaST を使用する場合:

    squid モジュールを起動して squid を停止する ボタンを押します。

squid は、その停止時にクライアントとの接続を切断し、データをディスクに書き込む処理を行うため、最大で 30 秒程度の時間がかかります (/etc/squid/squid.conf 内の shutdown_lifetime オプションで設定することができます) 。

警告
警告: squid の停止について

squid を停止させる際は、 killkillall コマンドで停止させてはなりません。これを行ってしまうと、キャッシュデータを壊してしまう可能性があります。この場合、 squid を再度開始できるようにするには、キャッシュデータを削除しなければならなくなります。

26.3.4 squid の削除 Edit source

システムから squid を削除しても、キャッシュ構造やログファイルについては削除が行われません。これらを削除するには、 /var/cache/squid ディレクトリを手作業で削除してください。

26.3.5 ローカル DNS サーバ Edit source

たとえ自分自身でドメインを所有していなくても、ローカルで DNS サーバを構築しておくことには意味があります。ローカルの DNS サーバは、キャッシュ専用のネームサーバとして動作させることで、特別な設定を行わなくてもルートネームサーバへの DNS 要求ができるようになります (詳しくは 19.4項 「BIND ネームサーバの起動」 をお読みください) 。このようなローカルの DNS サーバは、インターネットの接続にあたって動的に DNS サーバの設定を取得しているのか、静的に取得しているのかによって、やるべき作業が異なる点にも注意してください。

動的に DNS 設定を取得している場合

動的に DNS 設定を取得している場合、 DNS サーバの情報はインターネットの接続時にプロバイダ側から提供され、それにあわせてローカルの /var/run/netconfig/resolv.conf が自動的に調整されるようになっています。この動作は、 /etc/sysconfig/network/config 内の NETCONFIG_DNS_POLICY という sysconfig 変数で変更することができます。 YaST sysconfig エディタなどを利用して、 NETCONFIG_DNS_POLICY"" に設定してください。

その後、 /var/run/netconfig/resolv.conf 内にローカルの DNS サーバを設定します。具体的には、 localhost を意味する 127.0.0.1 の IP アドレスを設定します。これにより、 squid は開始時にローカルのネームサーバを常に見つけられるようになります。

また、プロバイダのネームサーバにアクセスできるようにするため、 /etc/named.conf 内の forwarders 以下に、 プロバイダのネームサーバを IP アドレスで指定します。動的に取得する環境の場合は、 sysconfig 変数の NETCONFIG_DNS_POLICYauto にすることで、自動的に調整させることができるようになります。

静的に DNS 設定を行っている場合

静的な DNS 設定の場合、接続を行っても自動的に DNS の設定が更新されることはありません。そのため、 sysconfig 変数についても、特に変更を行う必要はありません。しかしながら、 動的に DNS 設定を取得している場合 で説明しているとおり、 /var/run/netconfig/resolv.conf ファイルでローカルの DNS サーバを指定しておかなければなりません。これに加えて、 /etc/named.conf ファイル内の forwarders 以下に、 IP アドレスでプロバイダのネームサーバを指定してください。

ヒント
ヒント: DNS とファイアウオールについて

ファイアウオールを動作させている場合は、 DNS の要求を通すことができるように設定してください。

26.4 YaST squid モジュール Edit source

YaST の squid モジュールには、それぞれ下記のタブが用意されています:

起動

squid の起動方法や、どのインターフェイスに対してファイアウオールのポートを開くかなどの設定を行います。

HTTP ポート

squid がクライアントからの HTTP リクエストを待ち受けるポートを指定します。

更新パターン

squid でのキャッシュ内オブジェクトの取り扱い方法を設定します。

キャッシュ設定

最大オブジェクトサイズや最小オブジェクトサイズなど、キャッシュメモリに関する設定を行います。

キャッシュディレクトリ

squid が全てのキャッシュスワップファイルを保存するディレクトリを設定します。

アクセス制御

ACL グループを介した squid サーバへのアクセス制御を行います。

ログとタイムアウト

接続タイムアウトやクライアントの生存時間に加えて、アクセスログ、キャッシュログ、キャッシュ保存ログの保存先を設定します。

その他

言語や管理者のメールアドレスの設定を行います。

26.5 squid の設定ファイル Edit source

squid プロキシサーバの設定は、 /etc/squid/squid.conf ファイルで行います。 squid を初めて起動した場合は、このファイルを修正する必要はありませんが、初期状態では外部からのアクセスが全て拒否されるようになっています。そのため、プロキシは localhost 専用のものとなります。また、既定のポートは 3128 です。あらかじめ用意されている /etc/squid/squid.conf には、オプションに関する様々な説明や設定例が示されています。

多くの項目は # というコメント文字でコメントアウトされていて、その後ろに様々な設定が書かれています。記述されている値は、通常は既定値が書かれているものであるため、コメントアウトを外しても squid の動作は変わりません。また、可能であればコメントアウトされた行は変更せず、その下に行を挿入して必要な設定と値を記述してください。これにより、何らかの設定を間違ってしまっていても、すぐに元に戻すことができるためです。

ヒント
ヒント: 更新後の設定ファイルの調整について

古いバージョンの squid から更新する場合は、設定ファイルをそのままコピーせず、新しい /etc/squid/squid.conf から必要に応じて変更していく方法で実施することをお勧めします。

squid では、バージョンが変わるごとにオプションが追加/削除/変更されます。そのため、古いバージョンに対応した squid.conf を新しいバージョンで使用すると、正しく動作しないことがあります。

26.5.1 一般的な設定オプション Edit source

下記には、 squid の設定オプションのうち主なものを一覧で示しています。下記は全ての設定を網羅しているわけではありません。 squid パッケージ内には、全てのオプションを簡易に説明した文書が用意されています。詳しくは /etc/squid/squid.conf.documented ファイルをお読みください。

http_port ポート

squid がクライアントからの要求を待ち受けるポートを指定します。既定値は 3128 ですが、一般的には 8080 を使用することもあります。

cache_peer ホスト名 種類 プロキシポート ICP_ポート

このオプションは、相互に通信を行うキャッシュネットワークを作成するためのオプションです。 cache_peer で指定する相手は、この squid と同じくネットワークキャッシュを提供するコンピュータで、相互に関係性を持たせるためのものです。関係性の種類は 種類 で指定します。ここには parent (親) もしくは sibling (兄弟) のいずれかを指定します。

ホスト名 には対向のプロキシをホスト名または IP アドレスで指定します。 プロキシポート には一般的なブラウザからアクセスする際のポート (通常は 8080) を設定します。また、 ICP_ポート には 7 を指定するか、もしくは ICP ポートが分からない場合や、この相手に対しては使用しない場合、 0 を指定します。

また、 squid をプロキシではなく Web ブラウザのように動作させたい場合は、 default および no-query のオプションを追加して、 ICP プロトコルの使用を禁止してください。

cache_mem サイズ

このオプションには、 squid が最もよく使用するオブジェクトに対して使用するメモリ量を設定します。既定値は 8 MB です。ただし、ここで指定した値は squid 全体のメモリ使用を制限するものではありません。そのため、ここで指定した値を超えてメモリを使用することがあります。

cache_dir ストレージの種類 キャッシュディレクトリ キャッシュサイズ レベル_1_ディレクトリ レベル_2_ディレクトリ

cache_dir オプションは、ディスクキャッシュのディレクトリを指定するためのオプションです。 openSUSE Leap の既定の設定では、 squid はディスクキャッシュを作成しません。

ストレージの種類 では、下記のいずれかを指定することができます:

  • ディレクトリのストレージ: ufs , aufs (既定値), diskd のいずれかを指定します。 3 種類はいずれも ufs という形式のストレージを使用しますが、 ufs を指定すると squid の中枢スレッド内で、 aufs を指定すると別途のスレッドとして、 diskd を指定すると別途のプロセスとしてそれぞれストレージが動作するようになります。後者 2 種類については、ディスクの I/O による squid の一時的な処理停止を防ぐことができます。

  • データベースのストレージ: rock を指定します。このストレージ形式は単一のデータベースファイルから構成される仕組みで、それぞれのオブジェクトが固定長のメモリユニットを 1 つもしくは複数確保することで動作します。

なお、下記はストレージの種類に ufs を選択した場合の説明になります。 rock を選択した場合は異なる設定になります。

キャッシュディレクトリ には、ディスクキャッシュを配置するディレクトリを指定します。既定では /var/cache/squid が指定されています。 キャッシュサイズ はディレクトリに対する最大のサイズを指定します。既定では 100 MB に設定されています。利用可能なディスク領域のうち、 50% から 80% 程度までの範囲で指定してください。

レベル_1_ディレクトリレベル_2_ディレクトリ には、 キャッシュディレクトリ 内に作成するサブディレクトリの数を設定します。既定では レベル_1_ディレクトリ が 16 に、 レベル_2_ディレクトリ が 256 に設定されています。 レベル_2_ディレクトリ は、 レベル_1_ディレクトリ 内のサブディレクトリとなります。なお、これらの値を増やす場合は注意して設定してください。ディレクトリ数が多すぎると、性能面で問題を引き起こす場合があります。

キャッシュを複数のディスクにまたがって設定したい場合は、 cache_dir を複数個指定してください。

cache_access_log ログファイル, cache_log ログファイル, cache_store_log ログファイル

これら 3 種類のオプションは、 squid が様々な動作に対してログ記録を残すためのファイルを指定するためのものです。通常は特に変更する必要はありません。ただし、 squid 側の負荷が高い場合は、キャッシュとログファイルを複数のディスクに分割して設定するとよいでしょう。

client_netmask ネットマスク

このオプションは、ログファイル内でサブネットマスクを適用することによって、クライアントの IP アドレスをマスクする処理を行います。たとえば IP アドレスの末尾を 0 に設定したい場合は、 255.255.255.0 を指定します。

ftp_user 電子メールアドレス

このオプションは、匿名 FTP ログイン時に入力するパスワードを指定します。 FTP サーバによっては、電子メールアドレスが正しいかどうかを検証することがありますので、通常は正しい電子メールアドレスを指定します。

cache_mgr 電子メールアドレス

何らかの問題で squid がクラッシュしてしまった場合、 squid はここで指定した電子メールアドレスに対して、メッセージを送信します。既定値は webmaster です。

logfile_rotate

squid   -k rotate を実行すると、 squid はログファイルをローテーションします (切り替えます) 。ログファイルの末尾には番号が付けられて保存されるほか、古いものから順に上書きされるようになります。既定値は 10 で、この場合は末尾に 0 から 9 までの番号が付くことになります。

なお、 openSUSE Leap ではログファイルの切り替えは logrotate/etc/logrotate.d/squid を使用して自動的に実施しています。

append_domain ドメイン名

append_domain は、何もドメインを指定しない場合に自動的に追加するドメイン名を指定します。通常はご利用のドメインを指定しますが、このように設定すると、ブラウザで www とだけ入力すると、ご利用のドメインの Web サーバを表示させることができます。

forwarded_for 状態

このオプションを on に設定した場合、下記のようなヘッダが追加されます:

X-Forwarded-For: 192.168.0.1

このオプションを off に設定した場合、 squid は HTTP リクエスト内にある IP アドレスとシステム名の情報を削除します。

negative_ttl 時間, negative_dns_ttl 時間

これらのオプションを設定すると、 squid は 404 応答などを含むいくつかの種類の失敗をキャッシュするようになります。失敗をキャッシュした場合は、元のリソースが利用可能な状態になっても、新しい要求を拒否するようになります。

既定では negative_ttl0 に、 negative_dns_ttl 1 minutes (1 分) に設定されています。 これらの設定値では、 Web リクエストに対する否定応答はキャッシュされないものの、 DNS リクエストに対する否定応答は 1 分間だけキャッシュされるようになります。

never_direct allow ACL_名

squid がインターネットに対して直接接続することを防ぐには、 never_direct を指定して他のプロキシへの接続を強制することをお勧めします。この場合、接続先のプロキシは cache_peer で指定したものを使用します。 ACL_名all を指定すると、全ての要求を 宛に転送するようになります。これはたとえば、プロバイダ側でプロキシの使用を求めていて、インターネットへの直接アクセスを拒否しているような場合に必要な設定となります。

26.5.2 アクセス制御用オプション Edit source

squid では アクセス制御リスト (ACL; Access Control List) を利用してプロキシサーバへのアクセスを制御します。 ACL は上から順に処理されるルールを一覧で指定する形を取るほか、指定する前に定義を行う必要もあります。また、既定の ACL である alllocalhost については、定義せずに利用することができます。しかしながら、 ACL の設定だけでは何も効果がありません。対応する http_access ルールなどを設定することではじめて効果があります。

acl オプションの書式は下記のとおりです:

acl ACL_名 種類 データ

それぞれの項目の意味は下記のとおりです:

  • ACL_名 には任意の名前を指定します。

  • 種類 には様々な値を指定することができます。詳しくは /etc/squid/squid.conf ファイル内の ACCESS CONTROLS セクションをお読みください。

  • データ は ACL の種類ごとに異なるデータを指定する箇所で、たとえばホスト名や IP アドレス、 URL などを指定します。

YaST の squid モジュールでルールを追加する場合は、モジュールを開いて アクセス制御 タブを選択します。あとは ACL グループの一覧から 追加 ボタンを押して、ルールの名前と種類、パラメータを指定します。

ACL ルールに関するより詳しい説明については、 http://www.squid-cache.org/Versions/v3/3.5/cfgman/acl.html にある squid のドキュメンテーションをお読みください。

例 26.2: ACL ルールの設定
acl mysurfers srcdomain .example.com 1
acl teachers src 192.168.1.0/255.255.255.0 2
acl students src 192.168.7.0-192.168.9.0/255.255.255.0 3
acl lunch time MTWHF 12:00-15:00 4

1

この ACL は mysurfers という名前で、 .example.com というドメインからの全ての利用者を意味しています (ドメインの確認は、 IP アドレスから逆引きして行います) 。

2

この ACL は teachers という名前で、 192.168.1. で始まる IP アドレスを持つ全てのコンピュータを意味しています。

3

この ACL は students という名前で、 192.168.7. , 192.168.8. , 192.168.9. のいずれかで始まる IP アドレスを持つ全てのコンピュータを意味しています。

4

この ACL は lunch という名前で、月曜日から金曜日までの正午から午後 3 時までの時間帯を意味しています。

http_access allow ACL_名

http_access では、プロキシを使用できるユーザと、そのユーザがどのサイトにアクセスできるのかをそれぞれ設定します。ここでは ACL_名 を指定しますので、対応する ACL をあらかじめ定義しておく必要があります。なお、上述のとおり localhostall は最初から定義されているため、 denyallow で禁止や許可を設定することができます。また http_access は必要な数だけ記述することができ、それぞれ上から順に解釈されます。そのため、どちらが最初に現れるのかによって、許可と拒否が入れ替わることもあります。また、末尾には http_access deny all を指定しておくと良いでしょう。下記の例は、 localhost からのアクセスであれば、どのサイトに対しても自由にアクセスすることができますが、その他のホストからのアクセスは拒否する設定です:

http_access allow localhost
http_access deny all

もう 1 つの例では、下記のようなルールになっています。グループ teachers は常にインターネットへのアクセスが許可されます。グループ students については、月曜日から金曜日までのランチタイムにのみアクセスが許可されます。

http_access deny localhost
http_access allow teachers
http_access allow students lunch time
http_access deny all

可読性を高めるため、 http_access/etc/squid/squid.conf ファイル内の一カ所に集めておくことをお勧めします。

url_rewrite_program パス

このオプションを使用すると、 URL の書き換えプログラムを指定することができます。

auth_param basic program パス

利用者に対してプロキシへのアクセスに際して認証を求める場合、ここでプログラムを指定します。たとえば /usr/sbin/pam_auth のように指定します。 pam_auth では、はじめてアクセスすると、ユーザに対してユーザ名とパスワードの入力を求めます。この設定に加えて ACL を定義することで、インターネットへのアクセス時に正しい認証情報を求めるようにすることができます:

acl password proxy_auth REQUIRED

http_access allow password
http_access deny all

acl proxy_auth では REQUIRED と指定していますが、これはユーザ名とパスワードが適合していれば、どのユーザに対してもアクセスを許可する意味になります。 REQUIRED の代わりに、許可するユーザの一覧を記述してもかまいません。

ident_lookup_access allow ACL_名

このオプションを指定すると、 src の種類の ACL で定義される全てのクライアントに対して、ユーザの識別情報を取得するために ident 要求を実行します。全てのクライアントに対して処理を行いたい場合は、 ACL_名 にあらかじめ設定されている ACL 名である all を指定してください。

なお、 ident_lookup_access を指定した全てのクライアントでは、 ident デーモンを動作させなければならなくなります。 Linux の場合、 ident デーモンとして pidentd (pidentd パッケージ) を使用することができます。 ident 要求に対して正常に応答したクライアントだけにアクセスを許可したい場合は、下記のような ACL を設定します:

acl identhosts ident REQUIRED

http_access allow identhosts
http_access deny all

acl identhosts ident オプションに書かれている REQUIRED は、正しくユーザ名が設定されていれば全てのユーザを受け入れる意味になります。 REQUIRED の箇所を許可するユーザの一覧に変更すれば、そのユーザに対してのみ許可することができるようになります。

なお、 ident オプションを指定すると、 squid への要求が発生するたびに ident の参照が発生するため、アクセスに時間がかかるようになりますので、あらかじめご注意ください。

26.6 透過型プロキシの設定 Edit source

透過型プロキシの場合は、プロキシサーバが Web ブラウザの要求を仲介して処理を行います。そのため、 Web ブラウザはプロキシの存在に気付くことがありませんし、名前のとおりユーザに対しても透明な存在になります。

プロキシサーバは一般に、プロキシ内のキャッシュに存在するかどうかに関わらず、 Web ブラウザからの要求を受け取ってインターネットへのアクセスを代行する処理を行いますが、それ以外にも透過型プロキシと呼ばれる形態で動作させることもできます。たとえば下記のような用途が考えられます:

  • セキュリティ上の理由から、インターネットにアクセスするにあたって全てのクライアントがプロキシを使用することが推奨される場合。

  • 全てのクライアントに対して、プロキシの存在に気付くことなく使用させたい場合。

  • ネットワーク内のプロキシを移設したいが、既存のクライアント側の設定をいちいち変更させたくない場合。

手順 26.1: squid による透過型プロキシの設定 (コマンドライン)
  1. まずは /etc/squid/squid.conf 内で、 http_porttransparent というパラメータを指定したものを追加します。たとえば下記のようになります:

    http_port 3128⎄
    http_port 3128 transparent
  2. squid を再起動します:

    > sudo systemctl restart squid
  3. あとはファイアウオールを設定して、 HTTP のトラフィックを http_proxy で指定したポート (上記の例では 3128) に転送するようにします。設定後はファイアウオールの設定を再読み込みします。なお、お使いの LAN インターフェイスが internal ゾーン内に存在している必要があります。

    > sudo firewall-cmd --permanent --zone=internal \
        --add-forward-port=port=80:proto=tcp:toport=3128:toaddr=LAN_IP
    > sudo firewall-cmd --permanent --zone=internal --add-port=3128/tcp
    > sudo firewall-cmd --reload

    なお、 LAN_IP の箇所には、お使いの LAN インターフェイスか squid が待ち受けているインターフェイスの IP アドレスを入力してください。

  4. 全てが正しく動作していることを確認したい場合は、 /var/log/squid/access.log にある squid のログファイルを確認してください。

26.7 squid キャッシュマネージャ CGI インターフェイスの使用 ( cachemgr.cgi ) Edit source

squid キャッシュマネージャ CGI インターフェイス ( cachemgr.cgi ) は、動作中の squid プロセスに対して、メモリの使用状況の統計を表示するための CGI ユーティリティです。サーバにログインすることなく、キャッシュを管理したり統計情報を表示したりすることができます。

手順 26.2: cachemgr.cgi の設定
  1. まずはお使いのシステムで Apache Web サーバを動作させます。 Apache の設定方法について、詳しくは 第24章 「Apache HTTP サーバ をお読みください。特に 24.5項 「CGI スクリプトの有効化」 をよくお読みください。 Apache が動作していることを確認するには、下記のコマンドを実行します:

    > sudo systemctl status apache2

    inactive (動作していない) と表示されてしまった場合は、 openSUSE Leap の既定の設定では下記のようにして Apache を開始します:

    > sudo systemctl start apache2
  2. これで cachemgr.cgi を使用する準備が整いました。あとは ScriptAlias に対する設定ファイルを作成します。

    /etc/apache2/conf.d ディレクトリ内に cachemgr.conf というファイルを作成し、下記の内容を記述します:

    ScriptAlias /squid/cgi-bin/ /usr/lib64/squid/
    
    <Directory "/usr/lib64/squid/">
    Options +ExecCGI
    AddHandler cgi-script .cgi
    Require host ホスト名
    </Directory>

    なお ホスト名 の箇所は、 cachemgr.cgi へのアクセスを許可するコンピュータのホスト名を指定します。これにより、 cachemgr.cgi へのアクセスを制限することができます。どのコンピュータからもアクセスできるように設定したい場合は、代わりに Require all granted を指定してください。

    • なお、 squid と Apache Web サーバが同じコンピュータで動作している場合は、 /etc/squid/squid.conf を変更する必要はありません。ただし、 /etc/squid/squid.conf 内に下記の内容が含まれていることをご確認ください:

      http_access allow manager localhost
      http_access deny manager

      これらの行は、マネージャインターフェイスに対して、そのコンピュータ自身 ( localhost ) からのみアクセスを許可する設定になります。

    • squid と Apache Web サーバが別々のコンピュータで動作している場合は、 squid に対して特定のコンピュータからキャッシュマネージャにアクセスできるように設定する必要があります。この場合は、下記のような ACL になります (Web_サーバの_IP には、 Web サーバの IP アドレスを指定します):

      acl webserver src Web_サーバの_IP/255.255.255.255

      あとは設定ファイル内に下記のルールを記述します。順序を間違えないように注意してください。

      http_access allow manager localhost
      http_access allow manager webserver
      http_access deny manager
  3. また、必要であれば cachemgr.cgi に対して 1 つもしくは複数のパスワードを設定することもできます。この設定では、キャッシュをリモートから閉じたり、キャッシュに対する詳細情報を取得したりする際にパスワードを求めたりすることもできます。この場合は、 cache_mgrcachemgr_passwd のオプションに対して複数のパスワードを設定して、そのパスワードを入力した際に許可するアクションを指定します。

    たとえばトップページ (メニュー) と 60 分間の平均値の表示についてはパスワード入力を求めず、オフラインモードへの移行にはパスワード入力 secretpassword を求め、それ以外の全ては無効化したい場合、下記のような設定になります:

    cache_mgr user
    cachemgr_passwd none index menu 60min
    cachemgr_passwd secretpassword offline_toggle
    cachemgr_passwd disable all

    cache_mgr ではユーザ名を指定します。 cachemgr_passwd では、パスワードと許可するアクションをそれぞれ指定します。

    なお、 nonedisable は特別な意味を持つキーワードです。 none はパスワードの入力を求めず、 disable はその機能を無効化する意味になります。

    アクションの一覧については、 cachemgr.cgi にログインしてご確認ください。また、設定ファイル内でのキーワードについては、それぞれのアクションページ内の &operation= 内に書かれています。なお、アクションで all を指定すると、全てのアクションを意味することになります。

  4. squid と apache の設定を変更した場合は、それぞれ再読み込みを行います:

    > sudo systemctl reload squid
  5. 統計情報を表示するには、ここまでで設定した cachemgr.cgi のページを表示させてください。たとえば http://webserver.example.org/squid/cgi-bin/cachemgr.cgi のような URL になるはずです。

    サーバ名の指定のほか、ユーザ名とパスワードを設定していれば、それらも正しく入力してください。あとは Continue を押すと、異なる統計情報を表示することができます。

26.8 Calamaris によるキャッシュレポートの生成 Edit source

Calamaris は ASCII や HTML の出力形式に対応した、 squid のアクセスログファイルを読み込んでキャッシュ動作のレポート生成を行う Perl スクリプトです。このツールは openSUSE Leap の既定ではインストールが行われません。必要な場合は calamaris パッケージをインストールしてお使いください。なお、 Calamaris の Web ページは https://cord.de/calamaris-english (英語) にあります。

まずは root でログインして、下記のように入力します:

# cat access1.log [access2.log access3.log] | calamaris オプション > レポートファイル

複数のログファイルを指定する場合は、それらを時系列で古いものから順に並べて指定してください。上記のように複数のファイルを順に指定してもかまいませんし、 access{1..3}.log のように指定してもかまいません。

calamaris では下記のようなオプションを指定することができます:

-a

利用可能な全てのレポートを出力します。

-w

HTML 形式で出力します。

-l

レポートヘッダ内にメッセージやロゴを含めます。

上記以外のオプションについては、マニュアルページ内に説明があります。詳しくは man   calamaris を実行してください。

一般的な使用方法は下記のとおりです:

# cat access.log.{10..1} access.log | calamaris -a -w \
> /usr/local/httpd/htdocs/Squid/squidreport.html

上記のように実行すると、 Web サーバのディレクトリ内にレポートを出力します。レポートを表示するには、 Apache を動作させる必要があります。

26.9 さらなる情報 Edit source

squid の Web ページは http://www.squid-cache.org/ にあります。ここには Squid User Guide (squid ユーザガイド) としてマニュアルが用意されているほか、 squid の FAQ なども用意されています。

squid のメーリングリストもあります。詳しくは http://www.squid-cache.org/Support/mailing-lists.html をお読みください。

このページを印刷