Apache 便捷指令集

用于命令行的Apache相关实用命令集合。

文法检查

httpd -t
Syntax OK

检查 conf 文件中是否存在语法错误的命令。
在重新启动之前一定要确认。
service httpd configtest 或者 apachectl configtest 基本上也可以,但上述命令的键入次数更少。

重启

httpd -k graceful

缓慢地重新启动。
前面的语法检查会自动运行,如果有语法错误,将不会重新启动。
虽然 service httpd graceful 和 apachectl graceful 也是相同的作用,但上述的方法按键次数较少。systemctl graceful httpd 无效。
在验证了 graceful 的文章1中也有报道称其无法正常工作,所以在 CentOS 7 中使用 systemctl reload httpd 可能更好一些。

错误日志

tailf /var/log/httpd/error_log
[Sun Jan 01 09:00:00.054284 2017] [cgi:error] [pid 18504] [client 127.0.0.1:59490] script not found or unable to stat: /var/www/cgi-bin/php.ini
[Sun Jan 01 09:00:00.064974 2017] [autoindex:error] [pid 18504] [client 127.0.0.1:59490] AH01276: Cannot serve directory /var/www/html/: No matching DirectoryIndex (index.html) found, and server-generated directory index forbidden by Options directive
[Sun Jan 01 09:00:00.303906 2017] [core:error] [pid 18501] [client 127.0.0.1:59494] AH00126: Invalid URI in request GET /sdk/%2E%2E/%2E%2E/%2E%2E/%2E%2E/%2E%2E/%2E%2E/etc/vmware/hostd/vmInventory.xml HTTP/1.1
[Sun Jan 01 09:00:00.304917 2017] [core:error] [pid 18501] [client 127.0.0.1:59496] AH00135: Invalid method in request <script>alert(1)</script> / HTTP/1.1
[Sun Jan 01 09:00:00.311338 2017] [cgi:error] [pid 18501] [client 127.0.0.1:59498] script not found or unable to stat: /var/www/cgi-bin/awstats.pl
[Sun Jan 01 09:00:00.312637 2017] [cgi:error] [pid 18501] [client 127.0.0.1:59498] script not found or unable to stat: /var/www/cgi-bin/awredir.pl
[Sun Jan 01 09:00:00.445709 2017] [core:error] [pid 18501] [client 127.0.0.1:59500] AH00126: Invalid URI in request GET /../../windows/dvr2.ini HTTP/1.1
[Sun Jan 01 09:00:00.446445 2017] [core:error] [pid 18501] [client 127.0.0.1:59502] AH00126: Invalid URI in request GET /htdocs/../../../../../../../../../../../etc/passwd HTTP/1.1
[Sun Jan 01 09:00:00.447084 2017] [autoindex:error] [pid 18501] [client 127.0.0.1:59504] AH01276: Cannot serve directory /var/www/html/: No matching DirectoryIndex (index.html) found, and server-generated directory index forbidden by Options directive
[Sun Jan 01 09:00:00.460959 2017] [core:error] [pid 18501] [client 127.0.0.1:59504] AH00126: Invalid URI in request GET /help/../../../../../../../../../../../../../../../../etc/shadow HTTP/1.1

util-linux 包中的 tailf 命令用于显示文件的最后10行,并继续等待文件添加的行。tailf 类似于 tail -f,但是只有在文件有新的添加时才会访问文件。因此,文件的访问时间不会更新,并且在没有与日志相关的操作时,也不会发生定期的文件系统刷新。

好像现在 tailf 不再推荐使用了,并且据说会在2017年3月从 util-linux 中删除。

有些人建议使用 less +F /var/log/httpd/error_log。

命令历史搜索

在命令行中按下Ctrl + r,提示符将变为以下形式,进入命令历史记录的搜索模式。

(reverse-i-search)`':

当您处于这种状态时,只需输入要过滤的字符串,而无需连续按↑键,就可以轻松地找到过去的命令。

(reverse-i-search)`gra': httpd -k graceful

用评论进行标记

在命令的结尾输入 #,后面的内容将被忽略视为注释。我们可以将其作为标签使用,在搜索不易记忆的命令历史时可以使用。

httpd -t -D DUMP_CONFIG 2>/dev/null | grep '# In' | awk '{print $4}' #conflist
(reverse-i-search)`#conflist': httpd -t -D DUMP_CONFIG 2>/dev/null | grep '# In' | awk '{print $4}' #conflist

ApacheTop 是一个基于命令行的工具,用于实时监视和分析 Apache HTTP 服务器的活动。

yum -y install epel-release && yum -y install apachetop
apachetop
last hit: 06:12:43         atop runtime:  0 days, 00:00:30             06:12:49
All:            5 reqs (   0.2/sec)        332.3K (   14.4K/sec)      66.5K/req
2xx:       5 ( 100%) 3xx:   0 ( 0.0%) 4xx:     0 ( 0.0%) 5xx:     0 ( 0.0%)
R ( 30s):       5 reqs (   0.2/sec)        332.3K (   11.1K/sec)      66.5K/req
2xx:       5 ( 100%) 3xx:   0 ( 0.0%) 4xx:     0 ( 0.0%) 5xx:     0 ( 0.0%)

 REQS REQ/S    KB KB/S URL
    2  0.22 123.9 13.8*/
    1  0.04  47.6  2.1 /blog
    1  0.08  61.5  5.1 /news
    1  0.06  99.2  5.5 /news/2016/010102

解析日志并实时显示当前访问状态,就像top命令一样。
按下d键可切换到URL、主机和来访者。
使用上下箭头键移动标记*,使用左右箭头键切换列表显示和详细显示。

指定日志文件

apachetop -f /var/www/vhosts/example.jp/log/access.log

如果想指定除默认的/var/log/httpd/access_log之外的文件,请使用-f选项。

安全检查

yum -y install epel-release && yum -y install nikto
nikto -h 127.0.0.1
- ***** RFIURL is not defined in nikto.conf--no RFI tests will run *****
- ***** SSL support not available (see docs for SSL install) *****
- Nikto v2.1.5
---------------------------------------------------------------------------
+ Target IP:          127.0.0.1
+ Target Hostname:    localhost
+ Target Port:        80
+ Start Time:         2017-01-01 09:00:00 (GMT9)
---------------------------------------------------------------------------
+ Server: Apache/2.4.6 (CentOS)
+ Server leaks inodes via ETags, header found with file /, fields: 0x1111 0x5058a1e728280
+ The anti-clickjacking X-Frame-Options header is not present.
+ Allowed HTTP Methods: OPTIONS, GET, HEAD, POST, TRACE
+ OSVDB-877: HTTP TRACE method is active, suggesting the host is vulnerable to XST
+ OSVDB-3268: /icons/: Directory indexing found.
+ OSVDB-3233: /icons/README: Apache default file found.
+ 4197 items checked: 0 error(s) and 6 item(s) reported on remote host
+ End Time:           2017-01-01 09:00:05 (GMT9) (5 seconds)
---------------------------------------------------------------------------
+ 1 host(s) tested

可以通过EPEL软件仓库轻松安装名为Nikto的安全诊断工具。有关详细的处理方法,请参考”Apache安全设置”。

日志分析

grep 01/Jan/2017:12 /var/log/httpd/access_log | awk -F '"' '{print $2}' | awk '{print $2}' | sort | uniq -c | sort -n -r
     69 /
     48 /en/
     35 /css/base.css
     23 /favicon.ico
     23 /img/example.jpg

这是一个示例,用于输出2017年1月1日12点期间按请求分类的访问次数。有关其他模式,请参考“使用awk和uniq统计Apache日志”的文档。

设定文件列表

httpd -t -D DUMP_CONFIG 2>/dev/null | grep '# In' | awk '{print $4}'
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/autoindex.conf
/etc/httpd/conf.d/userdir.conf
/etc/httpd/conf.d/welcome.conf

有关其他信息的获取,请参考“使用命令行获取Apache信息”。

http://www.lesstep.jp/step_on_board/apache/610/ (点击链接)

https://linuxjm.osdn.jp/html/util-linux/man1/tailf.1.html (点击链接)

http://man7.org/linux/man-pages/man1/tailf.1.html (点击链接)

http://b.hatena.ne.jp/entry/www.brianstorti.com/stop-using-tail/ (点击链接)

http://labs.timedia.co.jp/2011/12/improve-reusability-of-shells-command-line-history.html (点击链接)