您的位置:首页 > 运维架构 > Apache

Apache服务器故障排除全攻略

2007-09-28 17:25 302 查看
随着网络技术的普及、应用和Web技术的不断完善,Web服务已经成为互联网上重要的服务形式之一。原有的客户端/服务器模式正在逐渐被浏览器/服务器模式所取代。本文将重点Apache 服务器的故障排除的技巧。

一、检查配置文件的错误

Apache服务器的设置文件位于/etc/httpd/conf/目录下,传统上使用三个配置文件httpd.conf,access.conf和srm.conf,来配置Apache服务器的行为。在新版本的Apache中,所有的设置都被放在了httpd.conf中,因此只需要调整这个文件中的设置。其中99% Apache服务器错误是配置文件有误。

1 使用apachectl configtest命令

如果配置文件有错误,可以使用apachectl configtest命令,apachectl configtest命令可以检查出所有语法错误和逻辑错误。

实例1

下面是一个配置文件样例片断:


<Location /server-status>

SetHandler server-status

Order deny,allow

Deny from all

Allow from 192.168.149.

</Location>

如果黑体部分的错误写成了“<Location /server-status”少写了一个 >。
apachectl configtest命令会检查到这个问题,输出如下:


apachectl configtest

Syntax error on line 918 of /etc/httpd/conf/httpd.conf:

<Location> directive missing closing '>'

2 使用服务管理工具

如果配置文件有错误,也可以使用GUI工具来查看。下面是实例1在GUI工具“服务配置“中的体现,如图1 。



图1 使用GUI工具检查错误

二、 学会使用错误日志

错误日志是最重要的日志文件,其文件名和位置取决于ErrorLog指令。Apache httpd将在这个文件中存放诊断信息和处理请求中出现的错误,由于这里经常包含了出错细节以及如何解决,如果服务器启动或运行中有问题,首先就应该查看这个错误日志。错误日志是你的朋友。任何错误都会在错误日志中有所记载,所以你应该首先查看它。如果你的网站空间提供者不允许访问错误日志,那么你应该考虑换一个空间提供者。学会阅读错误日志,可以快速找出问题并快速解决。

1 错误日志格式

Apache 默认的错误日志配置如下:
ErrorLog logs/error_log
LogLevel warn
配置错误日志相对简单,只要说明日志文件的存放路径和日志记录等级即可。格式为:
日期和时间 错误等级 错误消息

2 日志记录等级

下面着重说说日志记录等级,包括八个级别。
1 级英文名称emerg ,出现紧急情况使得该系统不可用,如系统宕机等
2 级alert 英文名称,需要立即引起注意的情况
3 级 英文名称crit ,危险情况的警告
4级 英文名称error ,除了emerg 、alert、crit 的其他错误
5级英文名称 warn。 警告信息
6级英文名称 notice ,需要引起注意的情况,但不如error、warn 重要
7级英文名称 info ,值得报告的一般消息
8级英文名称 debug, 由运行于debug 模式的程序所产生的消息

错误日志文件举例

错误日志的格式相对灵活,并可以附加文字描述。某些信息会出现在绝大多数记录中,一个典型的例子是:

[Wed Oct 11 14:32:52 2007] [error] [client 127.0.0.1] client denied by server configuration: /export/home/live/ap/htdocs/test
其中,第一项是错误发生的日期和时间;第二项是错误的严重性,LogLevel指令使只有高于指定严重性级别的错误才会被记录;第三项是导致错误的IP地址;此后是信息本身,在此例中,服务器拒绝了这个客户的访问。服务器在记录被访问文件时,用的是文件系统路径,而不是Web路径。错误日志中会包含类似上述例子的多种类型的信息。此外,CGI脚本中任何输出到stderr的信息会作为调试信息原封不动地记录到错误日志中。用户可以增加或删除错误日志的项。但是对某些特殊请求,在访问日志(access log)中也会有相应的记录,比如上述例子在访问日志中也会有相应的记录,其状态码是403,因为访问日志也可以定制,所以可以从访问日志中得到错误事件的更多信息。

了解错误代码和错误提示

 常用的错误响应代码如下:
301 :告知用户请求的URL 已经永久的移动到新的URL,用户可以记住新的URL,以便日后直接使用新的URL 进行访问。
302 :告知用户请求的URL 临时的移动到新的URL,用户无需记住新的URL,如果省略错误响应代码,默认就是此值。
303 :告知用户页面已经被替换,用户应该记住新的URL。
401 :授权失败,即密码错误。
403 :Access denied 存取错误,即不可以读取该文件。
404 :File not found 找不到文件。
410 :告知用户请求的页面已经不再存在,使用此代码时不应该使用重定向的URL 参数。
500 :服务器内部错误,可能是Web服务器本身存在问题,也可能是编写的程序出错。

 错误消息提示说明

“Invalid argument: core_output_filter: writing data to the network” 消息

Apache在可能的平台上使用系统调用sendfile来加速响应的发送。不幸的是,在某些系统上,Apache会在编译时检测sendfile的存在,即使它不能正常工作。这经常发生在使用网络或其他非标准文件系统时。这个问题的表现症状包括上述信息出现在错误日志里及对于非零长度文件请求发送零长度的响应。一般这个问题只发生在静态文件上,因为动态文件通常用不到sendfile 。要修正这个问题,可用EnableSendfile指令关闭服务器所有部分对sendfile的使用即可。同时参看EnableMMAP指令,对相似的问题有帮助。

“Premature end of script headers” 消息

大多数导致这个错误的CGI脚本问题将会向浏览器发送一个"Internal Server Error"错误信息。

“Permission denied” 消息

error_log中的"Permission denied"错误伴随一个发送到客户端的"Forbidden"信息通常表明违反了文件系统的权限,而不是Apache HTTP的配置文件出了错误。检查并确认用于运行子进程的User和Group有访问导致问题的文件的足够权限。同时检查一下导致问题的文件所在的目录及其所有父目录是否具有执行(搜索)权限(也就是 chmod +x)。最近发行的 Fedora Core 和其它Linux发行版使用了SELinux进行额外的访问控制,违反这些限制也会导致"Permission denied"消息。

"POST Method Not Allowed"消息

这说明Apache没有被正确配置以执行CGI程序,重新阅读配置Apache看看遗漏了什么。

"Internal Server Error"消息

查阅Apache错误日志,可以找到CGI程序产生的出错消息"Premature end of script headers"。对此,需要检查下列各项,以找出不能产生正确HTTP头的原因。

3 持续监视错误日志

可以使用命令“tail -f error_log” 对任何问题持续监视。要了解服务器上发生了什么,就必须检查日志文件。虽然日志文件只是记录已经发生的事件,但是它会让你知道服务器遭受的攻击,并帮助你判断是否提达到了必要的安全等级。一些例子:


grep -c "/jsp/source.jsp?/jsp/ /jsp/source.jsp??" access_log

grep "client denied" error_log | tail -n 10

上例会列出试图使用Apache Tomcat Source.JSP Malformed Request Information Disclosure Vulnerability的攻击次数。下例会列出最后十个被拒绝的客户端:


[Thu Jul 11
17:18:39
2002] [error] [client foo.bar.com] client denied by server configuration: /usr/local/apache/htdocs/.htpasswd

可见,日志文件只是记录已经发生的事件,所以,如果客户端可以访问.htpasswd文件,而且在访问日志中发现类似如下的记录:


foo.bar.com -
- [12/Jul/2002:01:59:13
+0200] "GET /.htpasswd HTTP/1.1"

这可能表示服务器配置文件中的下列指令已经被注解了:


<Files ~
"^/.ht">

Order allow,deny

Deny from all

</Files>

4 检查Apache服务器模块问题

如果Apache服务器可以启动,但是某些功能无法实现,比如前面介绍的Webdav 功能,通常是提供这个功能的模块没有加载,此时可以使用命令:“httpd -M”查看模块加载情况。

它会输出一个已经启用的模块列表,包括静态编译在服务器中的模块和作为DSO动态加载的模块。也可以使用浏览器访问http://192.168.1.12/server-info/?list 获取如图2 。



图2 模块加载情况

5查看Red Hat 发布的Apache 2.x 的相关信息

执行如下的步骤可以查看Red Hat 发布的Apache 2.2.3 的一些相关信息。

(1)查看编译配置参数
使用httpd -V 命令,


httpd -V

Server version: Apache/2.2.3

Server built: Nov 29
2006
06:33:19

Server's Module Magic Number: 20051115:3

Server loaded: APR 1.2.7, APR-Util 1.2.7

Compiled using: APR 1.2.7, APR-Util 1.2.7

Architecture: 32-bit

Server MPM: Prefork

threaded: no

forked: yes (variable process count)

Server compiled with....

-D APACHE_MPM_DIR="server/mpm/prefork"

-D APR_HAS_SENDFILE

-D APR_HAS_MMAP

-D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)

-D APR_USE_SYSVSEM_SERIALIZE

-D APR_USE_PTHREAD_SERIALIZE

-D SINGLE_LISTEN_UNSERIALIZED_ACCEPT

-D APR_HAS_OTHER_CHILD

-D AP_HAVE_RELIABLE_PIPED_LOGS

-D DYNAMIC_MODULE_LIMIT=128

-D HTTPD_ROOT="/etc/httpd"

-D SUEXEC_BIN="/usr/sbin/suexec"

-D DEFAULT_PIDLOG="logs/httpd.pid"

-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"

-D DEFAULT_LOCKFILE="logs/accept.lock"

-D DEFAULT_ERRORLOG="logs/error_log"

-D AP_TYPES_CONFIG_FILE="conf/mime.types"

-D SERVER_CONFIG_FILE="conf/httpd.conf"

从以上的输出可以了解Apache 服务器版本和编译的参数。

(2)查看已经被编译的模块

使用httpd -l命令,


httpd -l

Compiled in modules:

core.c

prefork.c

http_core.c

mod_so.c

说明:被编译的模块中包含mod_so.c,表示当前的Apache 支持Dynamic Shared Objects(DSO),即用户可以在不重新编译Apache 的情况下使用APache eXtenSion(apxs)编译Apache 的第三方模块。被编译的模块中包含prefork.c 表示Red Hat 发布的Apache 是使用预派生(Profork)MPM 模式运行的。

三 解决Apache 服务器故障的步骤

1 检查错误日志!

Apache服务器在遇到问题时会尽力做到对你有所帮助。在许多情况下,它会通过在错误日志中写入一条或多条消息来提供一些细节。有时这已经足够让你自己诊断和解决问题了(比如文件权限或类似的问题)。错误日志的默认位置在/usr/local/apache2/logs/error_log ,但是最后还是看看配置文件中的ErrorLog指令以确认错误日志在你服务器上的确切位置。

2 再一次检查语法

Apache 配置文件是httpd.conf 长度通常在80-990行,几乎99%Apache 故障是语法错误引起的。可以手工检查/etc/httpd/conf/httpd.conf,也可以通过浏览器输入:http://192.168.1.12/server-info?config 获取当前配置文件,如图3 。



图3 当前Apache服务器配置文件

说明:此时系统会自动添加行号。

3 察看Apache的FAQ!

最新版本的Apache常见问题列表总是可以从Apache主站点得到,http://httpd.apache.org/docs/2.2/faq/

4 察看Apache bug数据库

大多数报告给Apache项目组的问题都记录在bug数据库中。在你添加一个新bug之前,请务必检查已有的报告(打开的和关闭的)。如果你发现你的问题已经被报告了,请不要添加一个"我也是"那样的报告。如果原始报告还没有关闭,我们建议你经常周期性地来看看它。你也可以考虑与最初的提交者接触,因为有可能会在邮件交流中发现没有记录在数据库中的问题。

5 在某个用户论坛中提问

Apache拥有一个活跃的、愿意共享知识的用户社区。参与这个社区通常是获得解答的最快最好的办法。

Apache用户邮件列表:http://httpd.apache.org/userslist.html

6 提交问题报告到bug数据库

如果做了以上几个合适的步骤而没有得到解答,那么请务必让httpd的开发者了解这个问题,到这里(http://httpd.apache.org/bug_report.html )提交bug报告。

7 获取商业支持

可以从下面的网址获取商业网站服务商的技术支持:
http://www.apache.org/info/support.cgi

8 了解Apache服务器的网络资源的相关文档

Apache 服务器是使用最广泛的web服务器,它的版本很多。从以下的网络资源中可以获取大量有用的提示可以帮助您快速解决故障和建立web服务。
通用Apache文档:http://httpd.apache.org/docs-2.0
Apache FAQ:http://www.apache.org/foundation/faq.html
1.3 版本FAQ:http://httpd.apache.org/docs/misc/FAQ.html
邮件列表:http://httpd.apache.org/userslist.html
红帽企业版 Linux 5 部署指南:
http://www.redhat.com/docs/manuals/enterprise/RHEL-5-manual/zh-CN/Deployment_Guide/index.html

总结:

本文介绍了在Linux下建立Apache 服务器的过程和故障排除的方法。需要说明的是Apache 遭到黑客的攻击是造成其服务器故障的一个主要原因,限于篇幅这里没有完全做到面面俱到,您可以阅读笔者的《Linux 服务器安全策略详解》第六章(http://www4.it168.com/jtzt/shenlan/server/linux02/linux02.htm )其中详细介绍了提高Apache服务器的安全的方法。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: