通过 VirtualHost 跟踪 Apache

Bre*_*nt 7 analysis metrics virtualhost apache-2.2

我有一个运行许多 VirtualHosts 的 apache 网络服务器。

最近它一直停滞不前并且没有响应,我想知道如何确定哪些 VirtualHosts 导致了大部分问题。过去,我们曾遇到过个别站点代码中的错误导致整个服务器瘫痪的情况。我的目标是能够快速诊断这些实例。

我正在使用munin监视服务器,并注意到 apache 进程的数量、内存使用量和负载在相关期间往往非常高。问题是,这些统计数据是针对整个网络服务器的,而不是针对单个 VirtualHost 的。

我已经编写了一个脚本来解析每个 VirtualHost的网络日志流量,但这似乎还不够。我可能需要确定每个 VirtualHost 负责多少个 apache 进程,或者他们让每个进程打开多长时间- 或者每个进程负责多少内存使用。

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

Phi*_*lds 4

我知道 mod_status 并不总是可用且始终可用,但它和 apachetop 是诊断这些问题的最佳方法。然而,给猫剥皮的方法有很多种。

这个技巧在许多情况下都很有用,并且不仅仅是 Apache 特有的。然而,它确实取决于许多因素,您需要知道它在做什么才能知道它的局限性。

for pid in `pgrep -u www-data`; do find /proc/${pid}/cwd -printf "%l\n" ; done
Run Code Online (Sandbox Code Playgroud)

让我们来分解一下:

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

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

1) 如果在与 Apache 进程相同的上下文中运行的某些东西在 VirtualHost 目录之外执行 chdir(),那么您将很难找到它。

例如,在 mod_php 下运行的 PHP 脚本(CGI 会有所不同,因为 Apache fork 是一个单独的进程,但我假设 CGI 不是问题,或者您可以更轻松地跟踪它们)。

2) 如果您有 Apache 实例,它们可以非常快速地提供页面(例如小型静态 HTML 页面)。这通常不是问题,但也有可能。如果您收到很多“没有这样的文件或目录”错误,这基本上就是它的表现。我希望有一些,但不是大多数,除非它们适合这种特殊情况。基本上,这是因为当您检查 /proc 时,您使用 ps 扫描的 Apache 进程已经退出。显然,这意味着他们提供页面的速度非常非常快。

关于内存绑定的 Apache 进程,我使用ps_mem.py来计算网络服务器上的内存使用情况。如果您有大型 Apache(就驻留内存大小而言)进程并且它们快速退出,这大致相当于要求一个大胖子继续运行 100m 冲刺。如果您的网络服务器不是共享的,那么这些“没有这样的文件或目录”错误通常是将某些内容移动到较小的轻量级网络服务器(例如 nginx / lighttpd)或开始大量缓存内容(例如 varnish / squid)的好候选者。