通过VirtualHost跟踪Apache

我有一个Apache Web服务器运行许多VirtualHosts。

最近它一直陷入困境,变得反应迟钝,我想知道如何确定哪些VirtualHosts导致了大部分问题。 过去我们曾经有过个别站点的代码中的一个bug被整个服务器取下的场合。 我的目标是能够快速诊断这些实例。

我正在监视与munin的服务器,并注意到apache进程的数量,内存使用情况和负载往往是非常高的问题期间。 问题是,这些统计数据是针对整个networking服务器的,而不是单个的虚拟主机

我已经写了一个脚本来parsing每个VirtualHost的stream量的博客,但显示这是不够的。 我可能需要确定每个VirtualHost负责多less个apache进程 ,或者每个进程打开多长时间 ,或者每个进程负责多less内存使用。

我在哪里可以find这些信息? 我不介意写一个脚本来跟踪这些数据,但我不知道从哪里提取它。

我明白,并不总是适合有mod_status和所有的时间,但它和apachetop是诊断这些问题的最佳方法。 然而,有很多方法来剥皮猫。

这个技巧在很多情况下都是有用的,不仅仅是Apache特有的。 但是,这取决于许多因素,而且你需要知道它在做什么来了解它的局限性。

for pid in `pgrep -u www-data`; do find /proc/${pid}/cwd -printf "%l\n" ; done 

让我们来分解一下:

  • pgrep -u www-data给你在用户www-data下运行的pid列表。 这是Debian / Ubuntu上的默认设置,可以根据自己的系统进行更改(基于RedHat的系统倾向于使用httpd ,例如用户)。 对于没有pgrep的系统,可以使用ps axuwww | grep用户| awk'{print $ 2}'
  • *为; 做; … done *循环意味着我们循环在循环的do部分内运行命令的每个条目。
  • find / proc / $ {pid} / cwd -printf“%l \ n”只是search/ proc中的每个PID,并为当前工作目录吐出该进程。 当从VirtualHost提供文件时,Apache将chdir()默认为VirtualHost。 / proc / PID / cwd是运行apache进程的目录的符号链接。printf“%l \ n”将端点打印到该链接。 有关更多信息,请参阅find(1)。

这个技巧有两个主要的注意事项:

1)如果在Apache进程的相同上下文中运行的某个chdir()在VirtualHost目录之外,那么你将很难被发现。

例如在mod_php下运行的PHP脚本(CGI将会与Apache fork不同,因为它假设CGI不是问题,或者你可以更容易地跟踪它们)。

2)如果你有非常快速的服务页面的Apache实例(例如一个小的静态HTML页面)。 这通常不是问题,但它可能是可能的。 如果你得到很多“没有这样的文件或目录”的错误,这基本上是一个performance。 我会期待一些,但不是大多数,除非他们适合这个特定的情况。 基本上这是因为用ps扫描过的Apache进程已经在检查/ proc的时候退出了。 显然这意味着他们正在非常迅速地提供页面。

关于内存绑定的Apache进程,我使用ps_mem.py来计算我的Web服务器上的内存使用情况。 如果你拥有庞大的阿帕奇(按照常驻内存大小)进程,并且他们正在快速退出,这大致相当于要求一个大胖子继续跑100米冲刺。 如果你的networking服务器不是共享的,那么通常把那些“没有这样的文件或目录”错误的内容移动到一个较小的轻量级web服务器上(例如nginx / lighttpd)或者开始大量caching内容(例如varnish / squid)。

我想你想要apachetop,或者mod_status (带有ExtendedStatus On )。 我还没有在Apache中的性能问题,没有被mod_status照亮,apachetop看起来像一个整洁的工具(在日志布局有一些令人讨厌的限制)。