最終更新日: 2014年1月13日
Squid Home / FAQトップ

11. トラブルシューティング

11.1 なぜ"Proxy Access Denied?"になるのか

あなたのIPアドレスからアクセスできるように http_access で適切な設定がなされているか確認してください。 「アクセスコントロール」について参照してください。
もしSquidをアクセラレータモードで実行しているなら、普通のHTTPアクセスを受け入れ実際のWebサーバに転送するようになっており、この場合にはプロキシとしては機能しないでしょう。 もしプロキシとしての要求も受け入れたいなら、そのための機能を有効にしなくてはなりません。 

httpd_accel_with_proxy on

まだ原因が判らないなら、ACLの設定をミスしていると思われるので、1つ1つ ACL を squid.conf に設定しながら cache.log をチェックしてしてください。

11.2 local_domain を設定したのにローカルのオブジェクトをキャッシュします。

local_domain ディレクティブは、ローカルのオブジェクトがキャッシュされるのを防ぎません。 これはローカルオブジェクトをとって来る際に兄弟キャッシュの使用を防止します。
もし、オブジェクトのキャッシュを防止したいなら、cache_stoplist または http_stop を使ってください。(バージョンによります)

11.3 兄弟キャッシュにオブジェクトがあるに、私のキャッシュから検索するとConnection Refusedになります。

兄弟キャッシュをアクセスする際、HTTPのポート番号を間違っていてもICPのポート番号が正しく設定されていれば、ICPリクエストは成功(オブジェクトが兄弟キャッシュに存在する事が判る)します。 しかし、実際のオブジェクトを兄弟キャッシュから入手しようとするとHTTPポートが間違っている為に失敗します。 兄弟キャッシュでHTTPの待ち受けポート番号を変えたなら他の兄弟キャッシュで squid.conf の設定を変更してください。

11.4 ファイルディスクリプタ(filedescriptor)を使い果たしました。

もし、"Too many open files" といったエラーメッセージが出たなら、多分あなたのシステムのファイルディスクリプタを使い果たしました。 これはファイルディスクリプタの限界の低いオペレーティングシステムを使っている場合に発生します。
この限界は、OSのカーネル構築の際に設定するか、場合によってはツールで設定できるでしょう。

■ Linux

Henrik の How to get many filedescriptors on Linux 2.2.X ページまたはMichael O'Reilly filehandle patch を参考にしてください。
もし、あなたのカーネルが2.2.x以上なら、以下のファイルハンドラとiノードの最大値を調べ、これを簡単に書き換える方法があります。

/proc/sys/fs/file-max
/proc/sys/fs/inode-max

もしファイルハンドラ(ファイルディスクリプタ)を増やすなら、

echo 3072 > /proc/sys/fs/file-max

カーネルが2.0.35 から 2.1.xの間なら、以下の内容を読み込んで特別なファイルに書き込むことで、それを増やすことができます。

/proc/sys/kernel/file-max/proc/sys/kernel/inode-max

一方、ファイルディスクリプタを増やしたなら、squid の configure において、新しい値にマッチした内容にヘッダーファイル(usr/include/linux/limits.h)のOPEN_MAX を増やして構築し直さないと、設定した内容が反映されません。

■ Solaris

/etc/system の中のプロセス当たりのファイルディスクリプタの設定を変更してください。

set rlim_fd_max = 4096

上記の設定を行ったなら、新しい値が反映されるようトップディレクトリで configure を再度行ってください。  configureが新しい値を見つけられない場合には、include/autoconf.h を直接編集し、

#define DEFAULT_FD_SETSIZE
で定義してある値を直してしださい。 
注意: include/autoconf.h の内容は configureを実行する度に書き直されます。 このため、編集後に configure を実行すると編集した内容を失います。

もしあなたが古いSquid(1.1.x)を使っていて1024以上のファイルディスクリプタが必要なら src/Makefile の

enable $(USE_POLL_OPT)
を書き換えリコンパイルしてください。

Jens-S. Voeckler はデフォルトの soft limit (rlim_fd_cur) を 256以上にすべきではないと勧めます。 256以上にすることで、Sunワークショップコンパイラーに必要なライセンスマネージャなどのプログラムを破壊します。

■ FreeBSD

1. どうやってファイルディスクリプタの数を調べますか?

sysctl -a
を実行してkern.maxfilesperprocを調べてください。

2. どのように数を増やしますか?

sysctl -w kern.maxfiles=XXXX
sysctl -w kern.maxfilesperproc=XXXX

警告: 指定の際には、kern.maxfiles > kern.maxfilesperproc になるようにして下さい。

3. 指定できる上限はありますか?

私には良く判らないが、多分、カーネル内部には上限があると思う。 すべてのデータ構造は動的に割り当てられています。

■ Generic BSD

他のBSD派生なOS(SunOS, 4.4BSD, OpenBSD, FreeBSD, NetBSD, BSD/OS, 386BSD, Ultrix)で数を増やす場合、カーネルの再構築が必要です。

1. どうやってファイルディスクリプタの数を調べますか?

pstat -T
を使い、ファイルの数を探します。 一般的に、currentmaximum/という項目で表されます。

2. どのように数を増やしますか?

カーネルの構成ファイルの中の maxusers の値を増やしてください。 それからカーネルを再構築します。  しかしこの方法は簡単ですが、結果として他のカーネル変数も直さなくてはならない結果が待っているかも知れません。

3. もっと正確に指定できますか。

カーネルの param.c を見つけてここで使われているmaxusersと最大オープン数(maximum number of open file)での式を使ってください。ここを見ることでファイルディスクリプタの正確な数が判ります。

● SunOSの場合

例えばSunの場合、usr/kvm/sys/conf.common/param.c/ttでこのような式になっています。

int nfile = 16 * (NPROC + 16 + MAXUSERS) / 10 + 64;

そしてNPROCは次のように定義されています。

#define NPROC (10 + 16 * MAXUSERS)

● FreeBSD(2.1.6から)の場合

Sunと同じようにusr/src/sys/conf/param.cを見てmaxusersとmaxfilesとmaxfilesperproc変数における関係を変えて下さい。

int maxfiles = NPROC*2;
int maxfilesperproc = NPROC*2;

NPROCは次のように定義されています。

#define NPROC (20 + 16 * MAXUSERS)

プロセスあたりの上限は、カーネル設定ファイルのoptions OPEN_MAX=128 で設定されているのでこれを調整します。

● BSD/OS (2.1カーネルから)

/usr/src/sys/conf/param.cのmaxfilesを編集してください。

int maxfiles = 3 * (NPROC + MAXUSERS) + 80;

NPROCは次のように定義されています。

#define NPROC (20 + 16 * MAXUSERS)

プロセスあたりの上限は、カーネル設定ファイルのOPEN_MAX で設定されているのでこれを調整します。

変数の設定が終わったなら、カーネルを再構築してください。 再構築後に、こんどはSquidもconfigureし直してください。 そうしないと折角変更したファイルディスクリプタの上限数が反映されません。

例:

cd squid-1.1.x
make realclean
./configure --prefix=/usr/local/squid
make

11.5 ログにremoving objectsって行が表示されます。

例えば以下のような表示がされます。:

97/01/23 22:31:10| Removed 1 of 9 objects from bucket 3913
97/01/23 22:33:10| Removed 1 of 5 objects from bucket 4315
97/01/23 22:35:40| Removed 1 of 14 objects from bucket 6391

これは正常なメッセージです。 これはcache_swap_highに達することなく、オブジェクトが廃棄された事を意味しています。  cachemgr.cgi (キャッシュマネージャ)を使って、以下の情報を調べてください。

Storage LRU Expiration Age: 364.01 days

この時間利用されなかったキャッシュは削除されます。  squidのconfigファイルのreference_age を指定することで、この時間を調整できます。

11.6 WindowsNTのFTPサーバのディレクトリリストをUNIX形式にしたい。

Windowsで次のように操作します:

[スタート] - [プログラム] - [Micrsoft インターネットサーバ] - [インターネットサービスマネージャ]

この中で、ftpに関するフォルダーのようなアイコンがあるのでここを開きます。 そしてFTPサーバのマシンを選び、右ボタンから[プロパティ]を選択します。 プロパティ画面の中に[ディレクトリ]という項目があるのでこれを選択します。 そしてディレクトリ形式として、UNIXとMS-DOSがあるのでUNIXを選択してください。

11.7 "Ignoring MISS from non-peer x.x.x.x?"というメッセージが表示されます。

このアドレスの親または兄弟のキャッシュサーバから、(UDPでの)ICP MISSというメッセージを受け取っています。これは2つの状況が考えられます。

  1. 接続相手がマルチホーム(1台のマシンで複数のIPアドレスを持っている)になっていて、DNSに登録されていないインターフェースを使ってパケットを出している。 これは相手側の問題なので、相手にそのインターフェースをDNSサーバに加えて貰うか、Squidの"udp_outgoing_address" タグで、パケットを出すインターフェースを固定するようにして貰ってください。
    例:
    (親のsquid.conf)
    udp_outgoing_address 自身のアドレス("proxy.parent.com")
    (子(あなたの)のsquid.con)
    cache_peer proxy.parent.com parent 3128 3130
  2. マルチキャストを使ってICPリクエストを送った場合、このメッセージが記録される事があります。 安全上の理由から、Squidはマルチキャストで聞いているサーバの構成を必要とします。 もし構成にあなたのサーバが登録されていなかった場合、未知のキャッシュとして扱われ結果としてあなたのサーバ上には警告メッセージが残ることになります。
    これを避けるには、マルチキャストでの運用を止めるか、構成にあなたのキャッシュを登録してください。

11.8 下線( _ )の付いたDNSサーバ名はエラーになります。

( RFC 952, RFC 1101) によって、下線の付いたホスト名は使ってはならないことになっています。 

「名前」(ネット、ホスト、ゲートウェイ、あるいはドメイン名)は、アルファベット(A-Z)、数字(0-9)、マイナス記号( - )、ピリオド( . )を使い字列最大24文字。

DNS(bind)の最新バージョンのresolver ライブラリでは、ホスト名に下線があるとエラーとなります。 尤も良い解決策は、下線を使っているサイトの管理者に下線を使わないようにお願いしてください。
またcomp.protocols.tcp-ip.domains FAQ. を参考にしても良いでしょう。

ある人は、RFC 1033 にて下線が許されているようだと報告してくるかも知れませんが、ここで述べられている例は、誤った例です。

11.9 Illegal character in hostname; underscores are not allowedというメッセージは?

上の回答を参照してください。下線のついたホスト名は使ってはいけません。  DNSによっては下線の利用を許しているかもしれません。 しかし、Squidでは許していません。 もしSquidでも許したいのなら、Squidをconfigureし直してください。

% ./configure --enable-underscores ...
% make clean; make
# make install

11.10 なぜ兄弟キャッシュからのアクセスを拒否しますか。

The answer to this is somewhat complicated, so please hold on. NOTE: most of this text is taken from ICP and the Squid Web Cache.

An ICP query does not include any parent or sibling designation, so the receiver really has no indication of how the peer cache is configured to use it. This issue becomes important when a cache is willing to serve cache hits to anyone, but only handle cache misses for its paying users or customers. In other words, whether or not to allow the request depends on if the result is a hit or a miss. To accomplish this, Squid acquired the miss_access feature in October of 1996.

The necessity of ``miss access'' makes life a little bit complicated, and not only because it was awkward to implement. Miss access means that the ICP query reply must be an extremely accurate prediction of the result of a subsequent HTTP request. Ascertaining this result is actually very hard, if not impossible to do, since the ICP request cannot convey the full HTTP request. Additionally, there are more types of HTTP request results than there are for ICP. The ICP query reply will either be a hit or miss. However, the HTTP request might result in a ``304 Not Modified'' reply sent from the origin server. Such a reply is not strictly a hit since the peer needed to forward a conditional request to the source. At the same time, its not strictly a miss either since the local object data is still valid, and the Not-Modified reply is quite small.

One serious problem for cache hierarchies is mismatched freshness parameters. Consider a cache C using ``strict'' freshness parameters so its users get maximally current data. C has a sibling S with less strict freshness parameters. When an object is requested at C, C might find that S already has the object via an ICP query and ICP HIT response. C then retrieves the object from S.

In an HTTP/1.0 world, C (and C's client) will receive an object that was never subject to its local freshness rules. Neither HTTP/1.0 nor ICP provides any way to ask only for objects less than a certain age. If the retrieved object is stale by Cs rules, it will be removed from Cs cache, but it will subsequently be fetched from S so long as it remains fresh there. This configuration miscoupling problem is a significant deterrent to establishing both parent and sibling relationships.

HTTP/1.1 provides numerous request headers to specify freshness requirements, which actually introduces a different problem for cache hierarchies: ICP still does not include any age information, neither in query nor reply. So S may return an ICP HIT if its copy of the object is fresh by its configuration parameters, but the subsequent HTTP request may result in a cache miss due to any Cache-control: headers originated by C or by C's client. Situations now emerge where the ICP reply no longer matches the HTTP request result.

In the end, the fundamental problem is that the ICP query does not provide enough information to accurately predict whether the HTTP request will be a hit or miss. In fact, the current ICP Internet Draft is very vague on this subject. What does ICP HIT really mean? Does it mean ``I know a little about that URL and have some copy of the object?'' Or does it mean ``I have a valid copy of that object and you are allowed to get it from me?''

So, what can be done about this problem? We really need to change ICP so that freshness parameters are included. Until that happens, the members of a cache hierarchy have only two options to totally eliminate the ``access denied'' messages from sibling caches:

  1. Make sure all members have the same refresh_rules parameters.
  2. Do not use miss_access at all. Promise your sibling cache administrator that your cache is properly configured and that you will not abuse their generosity. The sibling cache administrator can check his log files to make sure you are keeping your word.

If neither of these is realistic, then the sibling relationship should not exist.

(訳者から: スマン!よく判らん。)
要は、兄弟キャッシュにあるオブジェクトの鮮度がソースサーバの鮮度と同じだとは限らないことが原因になる可能性を指摘しているようです。 ICPにおいては、オブジェクトして兄弟キャッシュに存在するように見え、かつ、最新のような振りをしたオブジェクトが存在する可能性があるようです。

キャッシュサーバ間で、refresh_rulesを同じにすることと、miss_accessを使わないようにすることで、 "access denied"を避けることができそうです。

11.11 Cannot bind socket FD NN to *:8080 (125) Address already in useって?

すでに別のプロセスが、"8080"ポートを使っていることを意味します。 これは別のSquidがすでに動作しているか、あるいは別のプロセスが使っているかも知れません。
確認するには、

netstat -naf inet | grep LISTEN
(linuxでは、netstat -na | grep LISTEN の方が良いかも...)

これは、LISTEN状態のプロセス(サーバプロセス)をすべて表示します。 この替わりに以下のように指定しても良いかも知れません。

netstat -naf inet | grep 8080
(linuxでは、netstat -na | grep 8080 の方が良いかも...)

いくつものプロセスあってどれがポートを押さえているか判らないなら、lsofというすばらしいソフトによってどのプロセスで確かめることができるでしょう。

11.12 icpDetectClientClose: ERROR xxx.xxx.xxx.xxx: (32) Broken pipeって?

Squidがデータを送っている最中にクライアントがソケットをクローズしたことを意味します。 Squidはread(2)関数を使ってこれを発見します。 普通に処理されてソケットがクローズされた場合にはECONNRESETという戻り値を受け取りますが、途中でクローズされた場合にはEPIPEを受け取ります。(EPIPE: Broken pipeとしてログcache.logに記録されます。)

11.13 icpDetectClientClose: FD 135, 255 unexpected bytesって?

Squid1.1では持続性ある接続をする不作法なクライアントからによって引き起こされます。 Squid1.1は持続性ある接続をサポートしません。

11.14 SquidはWindowsのNTLM認証を使えますか

バージョン2.5以降ではマイクロソフトのNTLM認証をサポートします。このサポートには幾つかの限界が存在します。:NTLM認証を使うオリジナルサーバへのプロキシ接続はできません。しかし、WebアクセラレータとNTLMを使ったクライアント接続の認証にはNTLMを使う事ができます。

私たちはWindowsNT,Samba,Windows2000のドメインコントローラをサポートします。詳細についてはwinbind .を参照してください。

プロキシでNTLM認証が使えるにも係わらず、私たちはNTLMを公平には扱いません。 this article:の記事のブラウザ認証に関する要約から:

通常のベーシック認証ではエンドツーエンドが接続された状態を必要としません。 ゆえにプロキシサーバを使ってもそれを使う事ができます。 しかしWindows NTのチャレンジ/レスポンス認証ではエンドツーエンドの接続状態が必要でこれはプロキシを使わない事が必要です。

Squidはクライアントとサーバ間のNTLMリクエストと応答ヘッダーを透過に通します。 NTLMはシングルエンド-エンド(訳者:ピア-ピアと訳した方が良いかも..)を期待しています。 これはプロキシを使ったNTLMを使う場合、プロキシはクライアントとサーバのリンクをしっかりと常に認識しておく必要がある事を意味します。  このような接続が機能するようにはしていますがプロキシの価値を低下させるものであることを私たちは理解しています。

NTLM認証はHTTPプロトコルに含ませて運びますが、しかしこれはHTTPのベーシック認証の方法と多くの点で違います。

  1. NTLM認証はエンド-エンドの接続を期待しており、これはRFC 2616によるプロキシを使ったサーバとクライアントの分離した接続に相反する。
  2. リクエストあたりではなく接続あたりの認証です。 一度認証での接続ができるとそれからすべての認証が相続されるようになっています。 RFC 2616はで接続の度に、再度の認証が必要になっておりNTLMの方法はこの方式と衝突します。

多分、NetscapeでNTLM認証がサポートされることは無いでしょう:

11.15 親キャッシュへのdefaultオプションが機能しません。

以下のような親キャッシュの指定をしたとします:

cache_peer xxxx parent 3128 3130 no-query default

しかし、UDPでもTCPでも親にはなにも送られません。

default を単純に加えてもすべてのリクエストが親に送られることを強いる事は無いでしょう。 default という意味は最後の手段としてこれで指定されたものを使うという意味で、すべてのリクエストのデフォルトという意味ではありません。 キャッシュは直接接続できるならdefault よりも優先されることでしょう。 もしあなたが親キャッシュを常に使うようにしたいならnever_direct オプションも使うようにしてください。

acl all src 0.0.0.0/0.0.0.0
never_direct allow all

11.16 "HotMail"に接続すると、Loginで失敗したとログされます。

"HotMail"は同じIPアドレスから要求されるようになっている必要があり、階層のキャッシュを使うと接続に失敗します。以下のようにsquid.confを指定してください。

hierarchy_stoplist hotmail.com

また、利用しているsquidのバージョンによっては、ダイレクトに接続するように設定すると良いかも知れません。

11.17 Squidを動かして有る程度時間が経過するとSquidが遅くなります。

これは多分、あなたのシステムのメモリより多くのメモリをSquidが使っているからです。 Squidのプロセスで使うメモリが大きくなるとそれは多くのページングを行うことになり、急速にSquidのスピードを落とす結果につながります。 メモリの使い方は複雑な問題で多くの考慮すべき事項があります。

1つは、キャッシュマネージャを使い次の2つの情報を入手してください。

        Number of HTTP requests received:  121104
        Page faults with physical i/o:      16720

注意:もしあなたのシステムがgetrusage() 関数を持っていないなら、Page faultsの行を入手出来ないでしょう。

"Page faults with physical i/o"の数を"Number of HTTP requests received"で割ってください。 (このケースでは、167200/121104=0.14) 理想的にはこの値は0.0~0.1の範囲になるべきです。 もし値が0.1~0.2の範囲であっても耐えられるかも知れません。 しかしこれ以上の値であるなら、あなたは多分Squidを遅く感じることでしょう。

もし比率が高いようなら、あなたは「Squidのメモリの使い方を削減するにはどうしますか?」を見てメモリの使用率を変える必要があるでしょう。

私のSquidはどのくらいメモリを必要とするのでしょう?」も参照してください。

11.18 WARNING: Failed to start 'dnsserver' が出ます。

アクセス権の問題かも知れません。 Squidを実行しているUseridはdnsserver を実行する権限を有してますか?コマンドラインから次のように試してみると良いでしょう。

$ echo oceana.nlanr.net | ./dnsserver

うまくいけば次のように表示される筈です。

$name oceana.nlanr.net
$h_name oceana.nlanr.net
$h_len 4
$ipcount 1
132.249.40.200
$aliascount 0
$ttl 82067
$end

11.19 Squidのバグレポートを送りたいのですが

バグデータベースでSquidのバグレポートを登録できるようになっています。 報告の際には以下の情報を含んでください。

バグレポートを送る前に、最新の安定版(STABLE)と開発版(development versions)のSquidで問題が解決するか確認してください。

■ クラッシュとコアダンプ

Squidが異常終了してコアダンプを出力するであろう2つの条件があります。第1はSIGSEGV か SIGBUS シグナルによってSquidを終了させた場合です。 第2は整合性チェックを含んでおり、そのチェックにかかった場合Squidの中でabort() を呼び出すことでコアダンプを出力します。

多くの人がコアダンプが出ないと報告してきますが、それは以下の原因かも知れません。

# sysctl -w kern.sugid_coredump=1
■ リソースの限界
リソースの限界はシェルから大抵は変更できます。 変更するコマンドは、大抵はlimit limits です。 FreeBSDやBSDライクのOSなら、/etc/login.conf でリソースの限界を変更できると思います。

コアダンプのサイズの制限を変更するコマンド:
limit coredumpsize unlimited
あるいは
limits coredump unlimited
■ デバックシンボル
Squidのバイナリがデバックシンボルをもっているかは以下のコマンドで確認してください。
% nm /usr/local/squid/bin/squid | head

次のような情報が表示されるならあなたのSquidはデバックシンボルをもっています。

0812abec B AS_tree_head
080a7540 D AclMatchedName
080a73fc D ActionTable
080908a4 r B_BYTES_STR
080908bc r B_GBYTES_STR
080908ac r B_KBYTES_STR
080908b4 r B_MBYTES_STR
080a7550 D Biggest_FD
08097c0c R CacheDigestHashFuncCount
08098f00 r CcAttrs

シンボルがない時は、
/usr/local/squid/bin/squid: no symbols

と表示されます。

■ コアダンプの場所
コアダンプは以下のどこかに残されるでしょう。

Squidの最近のバージョンでは、開始時にカレントディレクトリを報告してきます。 ここを最初に探してください。

2000/03/14 00:12:36| Set Current Directory to /usr/local/squid/cache

もしカレントディレクトリにあるはずのコアダンプがないなら、Squidの起動ユーザのアクセス権がないかシェルでの限界になっている可能性があります。 シェルでリミットを指定するなら

% limit core un
% /usr/local/squid/bin/squid -NCd1

コアダンプを採取できたらな、dbx gdb といったデバッカーを使ってスタックトレースを生成します。:

tirana-wessels squid/src 270% gdb squid /T2/Cache/core
GDB is free software and you are welcome to distribute copies of it
under certain conditions; type "show copying" to see the conditions.
There is absolutely no warranty for GDB; type "show warranty" for details.
GDB 4.15.1 (hppa1.0-hp-hpux10.10), Copyright 1995 Free Software Foundation, Inc...
Core was generated by `squid'.
Program terminated with signal 6, Aborted.

[...]

(gdb) where
#0 0xc01277a8 in _kill ()
#1 0xc00b2944 in _raise ()
#2 0xc007bb08 in abort ()
#3 0x53f5c in __eprintf (string=0x7b037048 "", expression=0x5f <Address 0x5f out of bounds>, line=8, filename=0x6b <Address 0x6b out of bounds>)
#4 0x29828 in fd_open (fd=10918, type=3221514150, desc=0x95e4 "HTTP Request") at fd.c:71
#5 0x24f40 in comm_accept (fd=2063838200, peer=0x7b0390b0, me=0x6b) at comm.c:574
#6 0x23874 in httpAccept (sock=33, notused=0xc00467a6) at client_side.c:1691
#7 0x25510 in comm_select_incoming () at comm.c:784
#8 0x25954 in comm_select (sec=29) at comm.c:1052
#9 0x3b04c in main (argc=1073745368, argv=0x40000dd8) at main.c:671

可能なら1~2日間のコアダンプを保持すると良いでしょう。 このとき、複数のコアダンプは同じバイナリで作成されたものになるようにしてください。別の構成で作成されたバイナリのコアダンプを使った場合にはコアダンプの解析は混乱します。

11.20 Squidのデバッキング

もし、あなたが致命的でないバグ(例えば不適切なHTTP処理)を見つけたなら、どうか私たちに問題を説明するデバッッキングの為の cache.log を送ってください。
cache.logはとても大きくなりますが、FTPまたはHTTPサーバを使ってサーバにコピーを送ってください。
Squidでデバッキング情報を有効にするのはとても簡単で、コマンドラインオプションで"-k debug"を付けて実行するだけです。

# squid -k debug

これにより、ソースコードに仕込まれたあらゆるdebug()文によってその情報がcache.logファイルに書き込まれます。 デバックをやめる場合は、オプションを元に戻すだけです。
選択的なデバックを行う場合(例えば1つのソースファイルだけ)には、Squid.confの debug_option の部分を編集してください。
Squidのソースファイルでは、あらゆる異なるデバックのセクションが割り当てられています。  
デバックのセクションは各ソースの最初に割り当ててあり見ることができます。 または ソースファイルに付属する doc/debug-levels.txt で見ることができます。(Squid-2からは、このファイルの名前は debug-sections.txt になっています。) もしあなたが、デバッキング情報量を制御するならばデバックレベルを指定します。
最高レベルでは、多くのデバック情報が入手できます。 例えば、アクセス制御機能に関するすべてのデバック情報を取るなら、

debug_options ALL, 1 28,9

として、Squidを再起動するかリコンフィグしてください。
一度、あなたはデバック情報をcache.logに取ってみてください。 そしてその振る舞いを確認し問題を理解すると良いでしょう。 難しいと感じたなら、どうぞsquid-users か squid-bugs (訳者注:メーリングリスト?)にログを送ってください。

11.21 FATAL: ipcache_init: DNS name lookup tests failed が出ます。 

Squidは起動時にDNSによって自身の名前を取得しようと試みます。 もしこのメッセージが出るならその意味することは、

起動時のDNS検索を無効にするならSquidの起動時に-D オプションを使って起動してください。
また、squid.conf中で「visible_hostname」ディレクティブによって明示的にSquidの動作しているマシン名を定義しておく事で、このエラーを避けることができると思います。

注意: -D オプションは起動に際してのDNS検索を行わないだけで、Squidは内部的にDNSを利用しています。

11.22 FATAL: Failed to make swap directory /var/spool/cache: (13) Permission denied が出ます。 

バージョン1.1.15までは、最初に

# squid -z

を実行してSquidのスワップディレクトリを作っておく必要がありました。 もし、このときcache_effective_user を指定しているならSquidは指定したユーザIDでキャッシュディレクトリを作成しようとします。 その際、キャッシュディレクトリ(ex./var/spool/cache)は存在しないため、これを作成しようとしますが、これを作るアクセス権限を持っていないと"permission denied"となってエラーになります。 これを避けるには、単純で

# mkdir /var/spool/cache
# chown <userid> <groupid> /var/spool/cache
# squid -z

とすれば良いでしょう。 (<userid> <groupid>は、cache_effective_usercache_effective_group で指定したものかデフォルトのもの)

11.23 FATAL: Cannot open HTTP Port が出ます。 

Squidがポートを開くためのアクセス権がないか、別のプロセスによってSquidの開くポートが使われているかのどちらかでしょう。 1024より小さいポートを開くためには、rootの権限が必要です。 もしSquidを開始するときにrootの権限を持っていないユーザで開始したならこのメッセージが表示されます。
また、既に別のプロセスがSquidが必要とするポートを使っている場合にもこの表示がされます。(例えばSquidをアクセラレータモードで起動する為、80のポートで開こうとしたが、すでに別のWebサーバが80を使っている場合など)
lsof ユーティリティを使うことで、だれがポートを使っているかを調べる事ができます。

11.24 FATAL: All redirectors have exited! が出ます。 

この件は、リダイレクターの項目で述べています。

11.25 FATAL: file_map_allocate: Exceeded filemap limit が出ます。 

つぎの質問を参照してください。

11.26 FATAL: You've run out of swap file numbers. が出ます。 

Note:この情報はバージョン2.2以前のものに適用します。

Squidは利用できるディスクファイルの内容をビットマップとして持っています。 このビットマップのサイズは、2つのものによって確定します。1つはキャッシュのサイズ、もう一つはキャッシュオブジェクトの平均サイズです。

キャッシュのサイズは、squid.confのcache_dir で指定しています。 オブジェクトの平均サイズは、squid.confの'store_avg_object_size' ディレクティブで指定できます。 デフォルトでは13Kbyteになっています。

squidはビットマップとして以下のサイズを割り当てます。

2 * cache_size / store_avg_object_size

したがってもし正確にキャッシュオブジェクトの平均サイズを知っているなら、ビットマップファイルを50%になるように指定すると良いでしょう。 現在、どれだけビットマップ(ファイルマップ: Filemap)に使っているかは、キャッシュマネージャの'storedir' で知る事ができます。それは以下のように表示されます。

Store Directory #0: /usr/local/squid/cache
First level subdirectories: 4
Second level subdirectories: 4
Maximum Size: 1024000 KB
Current Size: 924837 KB
Percent Used: 90.32%
Filemap bits in use: 77308 of 157538 (49%)
Flags:

もし、"You've run out of swap file numbers"メッセージが表示されたなら、それは以下の2つの事を表しています。

  1. あなたはSquidのバグを見つけました。
  2. あなたのキャッシュの平均ファイルサイズは'store_avg_object_size' のサイズよりはるかに小さいです。

あなたのキャッシュの平均サイズは、キャッシュマネージャの 'info' ページで知ることができます。

Mean Object Size: 11.96 KB

このワーニングメッセージがでたなら、'store_avg_object_size' 値を下げてSquidを再起動してください。

11.27 ファイルマップ ビットを95%以上使い果たしている?

Note:この情報はバージョン2.3以上のものに適用します。

冷静になってください。これは正常です。 Squidは動的にオブジェクトの数を基にしてファイルマップ ビットを割り当てます。動作中にファイルビットマップを使い果たさないことを私たちは約束します。 

11.28 FATAL: Cannot open /usr/local/squid/logs/access.log: (13) Permission denied が出ます。

Unix(ライクのOS)では、プロセスとファイルには所有者が存在します。 プロセスの所有者は起動の際のユーザとなるため、常に変わる可能性があります。 もし、あなたがsquid.confでeffective_user でユーザを述べているなら、Squidはそのユーザで起動されるようになります。 このとき、ログファイルも同じユーザが所有者になっていないといけません。
これらのことはSquidではなくUnixのことを理解する必要があるので、もしこれだけで判らない場合にはUnixのリファレンスマニュアルを参照してください。

11.29 ユーザIDとパスワードを使ったファイルアクセスに失敗します。

テストで次のようにアクセスしたとき

ftp://username:password@ftpserver/somewhere/foo.tar.gz

次のようなメッセージが表示されたなら

somewhere/foo.tar.gz: Not a directory.

替わりに次のような指定をしてみてください。

ftp://username:password@ftpserver/%2fsomewhere/foo.tar.gz

11.30 pingerOpen: icmp_sock: (13) Permission denied がでます。

これの意味するところは、あなたのpinger プログラムがroot特権を持っていないことを意味します。次のようにしてみてください。

% su
# make install-pinger

または

# chown root /usr/local/squid/bin/pinger
# chmod 4755 /usr/local/squid/bin/pinger

11.31 フォワーディングがループしている?

フォワーディングループが発生するのは、同じプロキシにもう一度リクエストが要求されるからです。 これは

フォワーディングループは、リクエストヘッダのVia を調べることで見つけられます。 各キャッシュでは、リクエストのVia ヘッダに"touches"としてホスト名を加えます。 もしキャッシュがリクエストされてきたヘッダに自分の名前を見つければフォワードループがおきている事に気付くでしょう。

NOTE: ループを見つけられるように、キャッシュのホスト名にはそれぞれ別の名前を与えるようにしてください。 もし、squid.confでvisible_hostname として複数のキャッシュに同じ名前を与えているなら、unique_hostname でそれぞれにユニークな名前を与えなくてはいけません。

Squidがフォワーディングループを見つけたなら、cache.log ファイルにVia ヘッダとともに記録されます。 この情報からどのキャッシュがフォワードしてきたかを調べることができるでしょう。

ループを解消するには、親子(parent)から兄弟関係(ibling)に関係を変更することです。 

別の方法としては、cache_peer_access を使ったルールを作ることです。 例として、

# Our parent caches
cache_peer A.example.com parent 3128 3130
cache_peer B.example.com parent 3128 3130
cache_peer C.example.com parent 3128 3130

# An ACL list
acl PEERS src A.example.com
acl PEERS src B.example.com
acl PEERS src C.example.com

# Prevent forwarding loops
cache_peer_access A.example.com allow !PEERS
cache_peer_access B.example.com allow !PEERS
cache_peer_access C.example.com allow !PEERS

上記の構成は、フォワードリクエストでないリクエストのみをA,B,Cのいずれかの親にリクエストするようになります。

11.32 accept failure: (71) Protocol error が出ます。

このエラーはたいがいSolarisシステムで見られます。 Mark Kennedy は重要な報告を行っています。

Error 71 [EPROTO] はサーバが受け入れられるようになる前にクライアントからTCPの接続がキューに入ってきたときに発生します。 ファイル記述子(ファイルディスクリプタ)を使い果たしたとき、これが発生するのを確認しました。 

11.33 storeSwapInFileOpened: ... Size mismatch が出ます。

cacheログでこれらのメッセージが記録されました。 わたしはディスク上のインデックスコンテンツとコンテンツがマッチしないのだと推測しています。

1998/09/23 09:31:30| storeSwapInFileOpened: /var/cache/00/00/00000015: Size mismatch: 776(fstat) != 3785(object)
1998/09/23 09:31:31| storeSwapInFileOpened: /var/cache/00/00/00000017: Size mismatch: 2571(fstat) != 4159(object)

Squidはどうなっているのですか?

注意:これはSquid-2に特有です。キャッシュにヒットしたオブジェクトをディスクから読み込むとき、そのサイズが期待したもので無いとき、このメッセージが記録されます。 この場合Squidはディスクにあったオブジェクトはクライアントには送らず、再びソースサーバからオブジェクトを入手きます。

11.34 fwdDispatch: Cannot retrieve 'https://www.buy.com/corp/ordertracking.asp といったようになります。

これらのメッセージはバギー(バグだらけな)クライアント、主としてNetscape Navigator(ネットスケープ)によって引き起こされます。Netscapeの持続性のあるHTTPS/SSLリクエストを送るときにこれは発生します。普通、SquidはSSLの接続要求としてつぎのようなものを受け付けます。

CONNECT www.buy.com:443 HTTP/1.0

このときSquidは受け取ったリクエストによって、相手先のホストとポートへ暗号化されたそのままの接続要求を送ります。 このポイントはSSLの要求はすべて暗号化されたそのままで送られることです。バグのあるクライアントからは次ぎような接続がきます。

GET https://www.buy.com/corp/ordertracking.asp HTTP/1.0
Accept: */*
User-agent: Netscape ... ...

このとき、ヘッダーとメッセージボディは暗号化されておらずに送られてきました。 SquidにはこれをSSL要求として変える如何なる方法もありません。我々にできることはエラーメッセージを返すことだけです。 

Note: このバグはブラウザが暗号化せずにデータをおくってくるので本当に危険なバグです。

11.35 URLでhttp://3626046468/ab2/cybercards/moreinfo.html といったアクセスができません。

Dave J Woolley による:

これらは、不法のサイトによって使われた不法のURLです。この目的は、

いくつかのブラウザとプロキシでは機能するため、セキュリティリスクを良く考慮してください。

11.36 "URI has whitespace"というエラーがcacheログに残ります。

URIとURLには余白キャラクター(スペース、タブ、newline、改行キー)の使用が許されていません。 残念ながら多くのWebサイトで空白をもつURLを使っています。 もちろんあなたのお気に入りのブラウザが静かにこれらの悪URLを正しく適用させています。 これらの空白キャラクタはインターネット標準に違反するので符号化されるべきです。

Squidでは空白キャラクタの取り扱いをuri_whitespace で決定できます。これには4つの指定が可能です。

  1. DENY: "Invalid Request"としてリクエストは拒否されます。
  2. ALLOW: そのまま許可されます。
  3. ENCODE: 空白キャラクタは、RFC 1738. によって符号化されます。 
  4. CHOP: URLの最初の空白キャラクタを切り取り、以後は正常なものとして処理します。

11.37 commBind: Cannot bind socket FD 5 to 127.0.0.1:0: (49) Can't assign requested address と出ます。

これは、多分あなたのシステムがloopbackネットワーク・デバイスを持たない、またはデバイスが適切に構成されないということを意味します。すべてのUnixシステムは、lo0と呼ばれるネットワーク・デバイスを持っているべきです。そして、それは、アドレス127.0.0.1で構成されます。構成を以下のコマンドで調べてください。

% ifconfig lo0

結果は以下のようになる筈です。

lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
inet 127.0.0.1 netmask 0xff000000

FreeBSDを使っているならここを見てください。

11.38 Unknown cache_dir type '/var/squid/cache' と出ます。

cache_dir のがバージョン2.3から変わりました。 それは現在、type 引数を必要になりました。すべての使えるように以下のように指定してください。

cache_dir ufs /var/squid/cache ...

11.39 unrecognized: 'cache_dns_program /usr/local/squid/bin/dnsserver' と出ます。

Squid2.3現在では、デフォルトでDNS検索に内蔵コードを使います。 この場合、squid.conf でcache_dns_program dns_children オプションで明示的に指定する必要はありません。 通常はコメントアウトにしておいて構いません。 あなたが外部のDNSサーバが持っているDNS検索プログラムを使いたい場合、configureを実行する際に次のようにしてください。

--disable-internal-dns

11.40 Squid2.3以上でdns_defnames が壊れています。

Squid2.3以降、デフォルトでは内蔵のDNS検索が使われます。 dns_defnames は外部のdnsserverプロセスの為に使われます。 もしdns_defnames を指定するならその前に、3つの選択をしておきます:

  1. append_domain を指定してください。
  2. configureの際に、--disable-internal-dns として内蔵のDNS検索を無効にしてください。
  3. ソースファイルのsrc/dns_internal.c を改造してsearch domain が /etc/resolb.conf から取り出せるようにしてください。

11.41 sslReadClient: FD 14: read failure: (104) Connection reset by peer meanとは?

"Connection reset by peer"はUnixオペレーティングシステムで、read, write, connect,およびその他のシステムコールで時々戻されるエラーコードです。
他のホスト・仲間と接続中に仲間がTCP接続でリセットパケットを送ったことを意味します。 これは実在しない接続において思いがけないパケットを受けたときなどに発生します。 
これらのログがSquidのログに残るということは、オリジナルサーバや親サーバが壊れたことを意味します。 一方、これはいたってあり得る事で、適切な終了をせずに処理を強制終了することはあり得ることです。

このメッセージはあまり心配する必要はありません。 

11.42 Connection refusedの意味は?

接続を試みようとしたサーバがいないときに、接続しようとしたポートへの接続に対するオペレーティングシステムから返されるエラーメッセージです。
このメッセージを簡単に再現する方法として、適当なポート番号を指定したtelnetとして以下のような接続を行うと再現できるでしょう。

% telnet localhost 12345
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused

ポート12345で待ち受けているサーバがいない限り上記のようなエラーが再現できます。
このエラーが表示されるということは、サーバが存在しないか、一時的に接続できない状態のどちらかです。

11.43 squid: ERROR: no running copy とは?

# squid -krotate
といったようなコマンドを実行した時にこのメッセージが出るかもしれません。
このメッセージはsquid.pidの使い方が間違っている場合に表示されることでしょう。 Squidが動作しているとき、大概はsquid.pidが存在している筈です。 もしあなたが偶然squid.pidを削除したなら、Squidは走り続けますが、どんなシグナルも与えることができなくなります。 これを削除してしまった場合取り戻す2つの方法があります。
  1. 実行中のSquidのプロセス番号を確認してください。
    % ps ax | grep squid
    83617 ?? Ss 0:00.00 squid -s
    83619 ?? S 0:00.48 (squid) -s (squid)
    そして第2のプロセス番号を使ってsquid.pidを作成します。
    echo 83619 > /usr/local/squid/logs/squid.pid
  2. 第1の方法と同じくプロセスの番号を調べてください。 そして見つけ出したSquidのプロセスに"HUP"シグナルを送ってください。
    kill -HUP 83619
    この方法で、Squidは再度設定ファイルを読み込むともにsquid.pidを作成します。
    

11.44 FATAL: getgrnam failed to find groupid for effective group 'nogroup' となります

多分あなたはrootでSquidを起動したと思います。 Squidは特別な特権を持たないグループIDで起動しようとします。 通常これにはグループIDのnogroupが使われます。 しかし、あなたのシステムにはnogroupというグループIDが登録されてなかもしれません。この場合このようなエラーメッセージが表示されます。 cache_effective_group を使って/etc/groupに登録されてい実際のグループIDを指定してください。

11.45 HTTPSのURLで"Unsupported Request Method and Protoco"となります。

Note:これはバージョン2.3以上に適用できます。 

これは正しい動作です。 SquidはHTTPSのURLが指定されたとき、SSLのパケットを話す必要がありますが出来なかった事を意味します。 
これは2つのパターンで起こります。

  1. ブラウザが直接、SSLでソースサーバに接続した場合。
  2. ブラウザが CONNECT リクエストを使ってトンネルをしようとした場合。

11.46 SquidがCPUを100%使います。

数多くの原因が考えられます。

Andrew Doroshenko のレポートでは、/dev/nullの削除・nodev オプションをを使ったファイルシステムのマウントでSquidがCUPを100%使い切ることを報告しています。 彼の示唆では、"/dev/null"を触ることに何か問題がありそうです。

11.47 Webminのcachemgr.cgi がオペレーティングシステムを破壊します。

Mikael Andersson のレポートでは、Webminのcachemgr.cgi をクリックするとcachemgr.cgi の多数のインスタンスが作成され利用できるメモリを消費してシステムを破壊します。

Joe Cooper のレポートでは、これは幾つかのブラウザ(主としてNetscape6、Mozilla)のSSLの問題で引き起こされることを報告しています。Netscape4やMicrosoft IEといった別のブラウザで試みるかSSL暗号化を無効にしてください。

11.48 スタートアップ直後の最初のリクエストでSegment Violation を起こします。

幾つかのGCCのバージョン(特に2.95.1から2.95.4まで)にはコンパイラーの最適化の部分にバグがあります。 これらのバグはSquidにおいてNULLポインタを指すバグを起こします。結果として、"FATAL: Received Segment Violation...dying'' を引き起こし、コアダンプをはき出して死んでしまいます。

これらのバグを避けるには、コンパイルで最適化を行わないようにしてください。 尤もよい方法はソースのコンパイルの際に明確にCCのオプションを指定することです。

% cd squid-x.y
% make distclean
% setenv CFLAGS='-g -Wall'
% ./configure ...

このconfigureが正しく作成できたか調べるには、AC_CFLAGS をsrc/Makefile から検索して以下の行を求めてください。

% grep AC_CFLAGS src/Makefile
AC_CFLAGS = -g -Wall

この後、再コンパイルすることで最適化しないでコンパイルが実行されます。

% make Making all in lib...
gcc -g -Wall -I../include -I../include -c rfc1123.c
...etc...

Note:最適化せずにコンパイルすることでSquidのパフォーマンスを心配する人がいますが、これによるSquidへのインパクトは殆ど影響ないか、全く影響内定度軽微です。 

11.49 urlParse: Illegal character in hostname 'proxy.mydomain.com:8080proxy.mydomain.com' となります。

fnac.net のYomler によると、

良くない設定のInternet Explorerと、cydoor DLLを使う幾つかのアプリケーションを組み合わせると、このメッセージがログに記録されます。詳しくは、cydoor.com の修正リストを見てください。
良くない設定のIEとは、動的な構成スクリプト(proxy.pac)と一緒に、普通のプロキシ指定もする設定です。 この時、IEがproxy.pacを使うように設定されいても、Cydoor ASPでは両方の設定を使うようになって、エラーを生み出します。

IEのプロキシの設定を無効にするだけではなく、設定フィールドの中を完全にクリアし、かつproxy.pacだけを使うようにしてください。

11.50 国際化ドメイン名が働きません。

国際化ドメイン名はHTTP標準化グループによってまた一致した見解が出ていません。 完全に一致した見解がでたならSquidでもサポートします。
国際的なドメイン名のための標準化プロセスの進歩に興味があればIETF IDNワーキング・グループのページを見てください。

11.51 まれに"Zero Sized Reply'"を受け取ります。

Squidがソースサーバに接続するときに、これが発生することがあります。 推理すると、Squidがデータを読もうとしたときに接続を絶たれてしまうのだと思います。 様々な要因によって、Squidはリトライを継続することができません。  もし、”Zero Sized Reply'' となったなら、Squidが再接続することができなかったか、リトライの試みを失敗したことを意味します。

何が原因として考えられるか:

  1. ソースサーバが高負荷に陥っている。
  2. TCPの実装/相互運用におけるバグ
  3. 持続性ある接続状態における通信状態
  4. バグだらけまたは設定ミスなNAT、ファイヤーウォール、ロードバランサーなど。
  5. サービス拒否攻撃(DoS)

問題を観測するためには、tcpdump を使うのも効果的です。

何人かの人は、問題がとても大きなクッキー(cookie)によって引き起こされていると信じています。 ある人は彼のIEからサードパーティのクッキーを受け入れないようにした結果この問題が解決したといっています。

Zero Sized Reply エラーをなくすためにあなたが試すことができる幾つかの事柄があります。

  1. ブラウザーからクッキーをすべて削除し、クッキーを受け入れる際にかならず入力を促すようにしてください。
  2. server_persistent_connections client_persistent_connections をSquidで指定して、持続性ある接続を無効にしてください。
  3. TCPの拡張機能をSquidシステム上では無効にしてください。 LinuxではECNを無効にしてください。

    # echo 0 > /proc/sys/net/ipv4/tcp_ecn
  4. Squid-2.5.STABLE4 以上にアップデートと、HOSTヘッダーに関連するCisco PIX HTTP inspectionのバグに対応します。 Cisco PIX firewall はHOSTヘッダーがリクエストの最初にあると間違った仮定をしています。

これらで解決できず、Zero Sized エラーがあなたにとって深刻なら、Squid開発陣はあなたの問題解決を助けることができます。 そのためには、あなたからHTTPヘッダーを含んだtcpdumpの情報やサーバのIPアドレス、オペレーティングシステムのバージョン、access_logなど多くの情報が必要です。

もしオンデマンドでZero Sized エラーをSquidに与えたければ、以下の小さなプログラムを作成してポート80が動いていないマシン上で実行させることで偽のサーバとして機能させることができます。これを使ってSquidから接続を試みると良いでしょう。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <assert.h>

int
main(int a, char **b)
{
        struct sockaddr_in S;
        int s,t,x;
        s = socket(PF_INET, SOCK_STREAM, 0);
        assert(s > 0);
        memset(&S, '\0', sizeof(S));
        S.sin_family = AF_INET;
        S.sin_port = htons(80);
        x = bind(s, (struct sockaddr *) &S, sizeof(S));
        assert(x == 0);
        x = listen(s, 10);
        assert(x == 0);
        while (1) {
                struct sockaddr_in F;
                int fl = sizeof(F);
                t = accept(s, (struct sockaddr *) &F, &fl);
                fprintf(stderr, "accpeted FD %d from %s:%d\n",
                        t, inet_ntoa(F.sin_addr), (int)ntohs(F.sin_port));
                close(t);
                fprintf(stderr, "closed FD %d\n", t);
        }
        return 0;
}

11.52 Squid Parent: child process xxxx exited due to signal 25で起動できません

カーネルが認識できる1ファイルあたりの最大ファイルサイズを確認してください。(Linux2.2では2GBまでです) このサイズの上限にログファイルが達してませんか? ログは通常は/var/log/squidディレクトリ以下に作成されます。
もし上限に達しているならば、ログのローテーションの設定を行って、1ファイルのサイズが小さくなるようにしてください。

11.53 WindowsXPで、WindowsUpdateができません。

WindowsXPにSP2を適用以後、WindowsUpdateができなくなる場合があります。 これは、SP2にてWindowsUpdateが使っている転送プログラム(BITS)が更新され、これがIEで指定されているプロキシの情報を使っていないために、直接、インターネットにアクセスしようとするために発生します。
BITSにプロキシを認識させるためには、IEの設定を引き継ぐために

C:\>proxycfg -u
とするか、または直接設定として
C:\>proxycfg -d -p PTOXY-SERVER1:PORT BYPASS-ADDRESS
(例、proxycfg -d -p proxy.robata.org:8080 127.0.0.1,*.robata.org)

を実行すると良いでしょう。

Squid Home / FAQトップ

参考: