Ale*_*bes 5 linux php patch debian-lenny apache-2.2
我有两个运行 Debian 5 稳定版的 Dell R410 Web 服务器(2 个四核 Xeon E5520 w/ 8gb ram)。他们的修补程序已经被忽视了一段时间,所以最近我们进行了一次修补程序以更新所有内容 - 它运行的应用程序的新版本需要 PHP 5.3.6。内核没有更新,因为它来自 Debian backports 存储库(安装的版本是 2.6.30-bpo.1-amd64)。
自打补丁以来,用户抱怨网站速度缓慢。大多数请求是立即提供的,但它会一次又一次地“卡住”请求。卡住的请求中似乎没有任何可辨别的模式。
这些服务器位于负载平衡器之后,它们同时更新,并且在运行修补程序时都开始出现此问题。他们当时没有重新启动,但从那以后就没有任何效果。
我在服务器上设置了一个脚本来循环time curl localhost:80/alive,其中有一个简单的 index.html 文件,其中只包含“OK”。奇怪的是,这些请求仍然以与实际 php 内容请求相同的频率和持续时间延迟。常见的时间有3秒、9秒、25秒、45秒,有的超过3分钟。45 秒是常见的响应时间,但当然浏览器早在此之前就放弃了,因此实际上没有响应。
apache worker 配置如下:
<IfModule mpm_prefork_module>
StartServers 50
MinSpareServers 10
MaxSpareServers 150
ServerLimit 500
MaxClients 500
MaxRequestsPerChild 5000
</IfModule>
Run Code Online (Sandbox Code Playgroud)
对于具有 8GB 内存的服务器来说,这对我来说似乎是明智的。在实践中,worker 数量很少超过 170,所以我们没有达到这个限制并且有足够的空闲内存。平均负载低,徘徊在 0.5-1.5 左右
内核是一个旧的 backport,所以我尝试将它更新到 lenny 的最新 backport (2.6.32-bpo.5-amd64),但它在启动时出现恐慌,我不得不让我们的主机用旧的重新启动它,所以在我们尝试更新他们的 bioses 并使用 Debian 6 格式化它们之前,我想探索其他选项。
Apache 似乎是罪魁祸首,所以下一步是更新到最新的 apache 向后移植,但该版本从 2.2.9-10+lenny4 到 2.2.9-10+lenny9 是一个相当小的颠簸,所以我没有t 预计会有任何重大变化。
PHP 已安装,来自 dotdeb 的 5.3.6 版。以前的版本是 5.3.0 自定义编译的。此外,我的老板刚刚告诉我,通过 https 的请求不会延迟,但我自己还没有确认。
# apache2 -V
Server version: Apache/2.2.9 (Debian)
Server built: Dec 11 2010 21:34:00
Server's Module Magic Number: 20051115:15
Server loaded: APR 1.2.12, APR-Util 1.2.12
Compiled using: APR 1.2.12, APR-Util 1.2.12
Architecture: 64-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=""
-D SUEXEC_BIN="/usr/lib/apache2/suexec"
-D DEFAULT_PIDLOG="/var/run/apache2.pid"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_LOCKFILE="/var/run/apache2/accept.lock"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="/etc/apache2/mime.types"
-D SERVER_CONFIG_FILE="/etc/apache2/apache2.conf"
# apache2ctl -t -D DUMP_MODULES
Loaded Modules:
core_module (static)
log_config_module (static)
logio_module (static)
mpm_prefork_module (static)
http_module (static)
so_module (static)
alias_module (shared)
auth_basic_module (shared)
authn_file_module (shared)
authz_default_module (shared)
authz_groupfile_module (shared)
authz_host_module (shared)
authz_user_module (shared)
autoindex_module (shared)
cgi_module (shared)
deflate_module (shared)
dir_module (shared)
env_module (shared)
geoip_module (shared)
mime_module (shared)
negotiation_module (shared)
php5_module (shared)
rewrite_module (shared)
setenvif_module (shared)
ssl_module (shared)
status_module (shared)
Syntax OK
Run Code Online (Sandbox Code Playgroud)
非常感谢任何帮助!
我已经在这个问题上撞墙一个星期了,我的老板已经修好了。
一旦我们在日志中查看了 Apache 的响应时间,我们就会发现它的响应速度很快——甚至在请求到达 Apache 之前就发生了延迟。因此,他查看了 tcp 堆栈设置,将它们与另一台运行 Red Hat 5.6 的服务器进行了比较。
长话短说,启用 tcp syn cookies(net.ipv4.tcp_syncookies=1在 /etc/sysctl.conf 中)已经解决了这个问题。此设置旨在防止 SYN 泛滥,并且显然允许更快的响应。我们可能会意外(或故意)被淹。
更多信息在此链接中,所描述的症状正是我们所看到的:http : //baheyeldin.com/technology/linux/detecting-and-preventing-syn-flood-attacks-web-servers-running-linux.html
我正在查看,netstat -alnt绝大多数连接都处于 TIME_WAIT 状态,而不是 SYN_RECV(也许 -l 选项不显示半开连接)。
但是我们现在经常在 dmesg 中看到这个:
possible SYN flooding on port 80. Sending cookies.
Run Code Online (Sandbox Code Playgroud)
我会再挖一些。