squid[11201]: Could not determine fully qualified hostname. Please set 'visible_hostname'
假如squid不能识别它自己的完整可验证域名,就会报这个错。如下是squid使用的算法:
- 1)
假如你将squid的HTTP端口绑定在指定的接口地址上,squid试图对该地址执行反向DNS查询。假如成功,查询答案就被用上。
- 2) Squid调用gethostname( )函数,然后使用 gethostbyname( )函数,试着解析其IP地址。假如成功,squid使用后者函数返回的官方主机名串。
cache_effective_group squid
visible_hostname ctc2380-137
重新初始化,ok。
在网上查到一些其他squid的其他错误:
"Failed to make swap directory"
Failed to make swap directory /var/spool/cache: (13) Permission denied
这点发生在你运行squid -z,并且squid的用户ID没有对/var/spool目录的写权限的时候。记住假如以root来启动squid,并且没有增加 cache_effective_user行,那么squid默认以nobody用户运行。解决方法很简单:
# chown nobody:nobody /var/spool
"Address already in use"
commBind: Cannot bind socket FD 10 to *:3128: Address already in use这个消息出现在bind()系统调用失败时,因为请求端口已经被其他应用程序所打开。通常,若已有一个squid在运行,而又试图启 动第2个squid实例,就会发生这种情况。假如你见到这个错误消息,请使用ps来观察是否squid已经在运行。
Squid使用 SO_REUSEADDR socket选项,以便bind()调用总能成功,即使仍有一些残余的socket位于TIME_WAIT状态。若该消息出现,尽管squid没有在运 行,但你的操作系统可能在处理这个问题上有bug。重启操作系统是解决问题的一个方法。
另一个可能性是端口(例如3128)当前已被其他应 用程序使用。假如你怀疑这点,就可使用lsof程序来发现哪个应用正在该端口上侦听。FreeBSD用户能使用sockstat代替。
"DNS name lookup tests failed"
默认情况下,squid在启动前执行一些DNS查询。这点确保你的DNS服务器可到达,并且运行正确。假如测试失败,可在 cache.log或syslog里见到如下消息:
FATAL: ipcache_init: DNS name lookup tests failed
假如你在内网里使用squid,squid可能不能查询到它的标准主机名列表。可使用dns_testnames指令来指定你自己的 主机名。只要接受到响应,squid就会认为DNS测试成功。
假如你想完全跳过DNS测试,简单的在启动squid时,使用-D命令行选 项:
% squid -D ...
"Illegal character in hostname"
urlParse: Illegal character in hostname 'super_bikes.tripod.com'默认情况下,squid检查URL的主机名部分的字符,假如它发现了非标准的字符,squid会抱怨。参考RFC 1034和1035,名字必须由字母A-Z,数字0-9,以及短横线(-)组成。下划线(_)是最有问题的字符之一。
Squid 验证主机名是因为,在某些情形下,DNS对畸形字符的解析会很困难。例如:
% host super_bikes.tripod.com super_bikes.tripod.com has address 209.202.196.70 % ping super_bikes.tripod.com ping: cannot resolve super_bikes.tripod.com: Unknown server errorSquid事先检查主机名,这好过于以后返回Unknown server error消息。然后它会告诉用户主机名包含畸形字符。
某些DNS解析器确实能处理下划线和其他非标准字 符。假如你想让squid不检查主机名,请在运行./configure时,使用—disable-hostname-checks选项。假如你允许下划 线作为唯一的例外,那么使用—enable-underscores选项。
"Running out of filedescriptors"
WARNING! Your cache is running out of filedescriptors
上述消息出现在squid用完了所有可用文件描述符时。假如这点发生在正常条件下,就有必要增加内核的文件描述符限制,并且重新编译 squid。请见3.3.1章。
假如squid成为了拒绝服务攻击的目标,那也会见到这条消息。某些人可能有意或无意的,同时对squid 发送成百上千条请求。在这种情形下,可以增加一条包过滤规则,阻止来自恶意地址的TCP进入连接。假如攻击是分布式的,或使用假冒源地址,就很难阻止它 们。
转发循环(见10.2章)也可能耗尽squid的所有文件描述符,但仅仅发生在squid不能检测到死循环时。Via头部包含了某个请 求遍历过的所有代理的主机名。squid在头部里查找它自己的主机名,假如发现了,就报告这个循环。假如因为某些理由,Via头部从外出或进入HTTP请 求里过滤掉了,squid就不能检测到循环。在该情形下,所有文件描述符被循环遍历squid的同一请求迅速耗完。
"icmpRecv: Connection refused"
假如pinger程序没有正确的安装,可见到下列消息:
icmpRecv: recv: (61) Connection refused
不过看起来更象是因为没有打开ICMP socket的权限,pinger立刻退出了。因为该进程未在运行,当squid试图与它会话时,会接受到I/O错误。为了解决该问题,请到源代码目录以 root运行:
# make install-pinger
假如成功,你可见到pinger程序有下列文件属主和许可设置:
# ls -l /usr/local/squid/libexec/pinger
-rws--x--x 1 root squid 140728 Sep 16 19:58 /usr/local/squid/libexec/pinger