Chinaunix首页 | 论坛 | 博客
  • 博客访问: 825315
  • 博文数量: 167
  • 博客积分: 7173
  • 博客等级: 少将
  • 技术积分: 1671
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-04 23:07
文章分类

全部博文(167)

文章存档

2018年(1)

2017年(11)

2012年(2)

2011年(27)

2010年(88)

2009年(38)

分类: 系统运维

2010-06-25 18:33:11

今天我这一边改hostnmame 同一个时候在另一个终端中安装squid;在init过程中出现以下问题:

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使用后者函数返回的官方主机名串。
假如以上2项技术都不能工作,squid以前面提到的致命错误消息退出。在该情形下,必须使visible_hostname属性来告诉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 error

Squid事先检查主机名,这好过于以后返回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




阅读(1792) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~