我有一台运行 Apache 和 MYSQL 的 Ubuntu 服务器。系统和版本信息如下:Linux kernel 3.0.0.-12 Apache/2.2.20 MySQL Ver 14.14.Distrib 5.1.58
我在这个服务器上运行了几个网站,有些是 HTML,有些是 PHP/MySQL。问题是响应时间非常慢,无论是静态网站还是动态网站。有时需要超过 10 秒才能得到响应,这使得网站非常慢,几乎无法使用。
即使从本地网络请求也会出现此问题。我已将所涉及的子域添加到我的 /etc/hosts 文件中,并且使用 IP 号代替 URL 并不能解决所有问题。因此不存在 DNS 查找问题。
我已通过显示响应时间修改了日志格式,有时文件需要 12 秒才能被提供,请参阅示例屏幕截图中的 jquery~.js 文件。
我无法解释这个极长的响应时间,但这甚至不是这里唯一的问题,其他一些文件也需要很长时间才能被提供,但在日志文件中没有显示较长的响应时间。
所以这里可能涉及不同的组织。我到现在都找不到解决方案,有什么建议吗?提前谢谢,Klaas
一些额外的配置信息:
apache2.conf(注释已删除)
LockFile ${APACHE_LOCK_DIR}/accept.lock
PidFile ${APACHE_PID_FILE}
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
</IfModule>
<IfModule mpm_worker_module>
StartServers 2
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxClients 150
MaxRequestsPerChild 0
</IfModule>
<IfModule mpm_event_module>
StartServers 2
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxClients 150
MaxRequestsPerChild 0
</IfModule>
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}
AccessFileName .htaccess
<Files ~ "^\.ht">
Order allow,deny
Deny from all
Satisfy all
</Files>
DefaultType text/plain
HostnameLookups Off
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn
Include mods-enabled/*.load
Include mods-enabled/*.conf
Include httpd.conf
Include ports.conf
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\" %T/%D" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
Include conf.d/
Include sites-enabled/
而对于其中一个速度较慢的站点来说,虚拟主机文件实际上非常简单……
<VirtualHost *:80>
ServerAdmin [email protected]
ServerSignature EMail
ServerName toenjoy.drsklaus.nl
DocumentRoot /var/www/toenjoy.drsklaus.nl
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/toenjoy.drsklaus.nl/>
Options Indexes FollowSymLinks MultiViews
AllowOverride AuthConfig
AuthType Basic
AuthName "To Enjoy"
AuthUserFile /etc/.htpasswd
Require user petraaa
Order allow,deny
allow from all
</Directory>
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
ErrorLog /var/log/apache2/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog /var/log/apache2/access.log combined
Alias /doc/ "/usr/share/doc/"
<Directory "/usr/share/doc/">
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
Allow from 127.0.0.0/255.0.0.0 ::1/128
</Directory>
</VirtualHost>
free -m 的输出如下:
klaas@ubuntu-server:/etc/apache2$ free -m
total used free shared buffers cached
Mem: 1997 1401 595 0 144 1017
-/+ buffers/cache: 238 1758
Swap: 2035 0 2035
我没有发现在网站变慢时发生交换的迹象。我运行了 top,似乎不是 CPU 问题。我的印象是 apache 线程的产生可能是瓶颈,但这只是一个建议。也许这提供了一些额外的信息!
编辑:问题似乎消失了一段时间,但又出现了!不仅使用 Apache,使用 SSH 连接也需要很长时间,有时需要长达 15 秒才能要求输入密钥短语。此外,scp 运行非常慢。行为确实不可预测,使服务器很难使用。有什么想法吗……?
答案1
当您尝试通过lynx
或curl
从本地主机或网络上的机器进行访问时会发生什么?
另外,看看来自 Apache 的这个块:
Alias /doc/ "/usr/share/doc/"
<Directory "/usr/share/doc/">
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
Allow from 127.0.0.0/255.0.0.0 ::1/128
</Directory>
我建议删除整个阻止,重新启动 Apache 并重试。当 Apachedeny
对本地主机或本地 IP 地址执行某些操作时,我也遇到过奇怪的挂起情况。奇怪的 DNS 查找问题可能会根据每个请求挂起 Apache。每页 12 秒的延迟让我认为这就是原因。但从您的配置中无法 100% 确定我指出的阻止是否是罪魁祸首。但请对与 Apache 相关的 DNS 查找相关任务进行某种搜索。
此外,如果不观察网站的实际流量,很难说应该在服务器上进行哪些设置,但我认为您的KeepAlive
设置似乎占用大量资源。我建议按如下方式进行更改:
KeepAlive On
MaxKeepAliveRequests 50
KeepAliveTimeout 2
我还建议您在主要内容中降低MaxClients
和添加ServerLimit
调整,如下所示:MaxRequestsPerChild
apache2.conf
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
ServerLimit 90
MaxClients 90
MaxRequestsPerChild 2000
</IfModule>
<IfModule mpm_worker_module>
StartServers 2
MinSpareThreads 25
MaxSpareThreads 64
ThreadLimit 64
ThreadsPerChild 25
ServerLimit 90
MaxClients 90
MaxRequestsPerChild 2000
</IfModule>
<IfModule mpm_event_module>
StartServers 2
MinSpareThreads 25
MaxSpareThreads 64
ThreadLimit 64
ThreadsPerChild 25
ServerLimit 90
MaxClients 90
MaxRequestsPerChild 2000
</IfModule>
另外,我强烈建议安装穆宁在您的机器上控制资源使用情况。省去了很多麻烦,并提供了良好的宏观视角。
答案2
Apache 是一个复杂的系统,可能是这里的问题……也可能不是。在深入研究这个黑洞之前,我会先调试一般的网络缓慢问题。具体来说:
尝试在端口上以服务器模式运行 netcat,配置为分发本地文件的内容,然后从机器本身连接到该文件。例如:
当为真时;执行 nc -l 80 < index.html ; 完成
这样就消除了 apache、物理网络和 DNS 或 IP 链接问题。请注意,提供的文件是本地的 - 例如没有 NFS 挂载。
- 同样,但从同一子网通过本地网络连接
- 再次,但来自不同的子网
如果您能做到这一点,则说明您的服务器很好,并且您的网络路由也没有问题。
现在清理 DNS,并确保反向查找有效。例如,挖掘 4.3.2.1.in-addr.arpa 来测试 1.2.3.4 地址的查找。如果它很慢,那就是一个问题,您需要使用 /etc/resolv.conf、dnsmasq 或您拥有的任何工具进行操作。在一切稳定之前不要继续。此时也值得尝试使用 SSH/SCP 进入盒子 - 它应该很快。
接下来是 Apache。如果你做到了这一点,你就知道你的网络很好,DNS 工作正常,盒子也正常。所以剩下的就是你的应用程序(即 www 服务器)。尝试将配置精简到最低限度,看看你的情况如何。例如这里就是其中之一。
祝你好运!
答案3
编辑:一次尝试一个!
有几件事很明显:
MaxRequestsPerChild 0
如果你没有理由使用0
(进程永不消亡)然后稍微增加一点(默认值为1000
),然后100
重新启动,看看是否能有所改善。可能会防止内存泄漏。
MaxClients 150
取决于您的服务器有多少内存,如果同时调用所有三个模块,您可能会耗尽内存。例如,如果您的 Apache 进程大小为 20MB,您将拥有 150 个客户端 x 20MB x 3 个模块 = 9000 MB ~ 8.8 GB。即使只调用其中一个,您也会使用 ~ 2.9 GB。
如果您不使用全部三个模块,请从 apache 实例中卸载不需要的模块。
另外,在这种缓慢的性能表现过程中,top
输出情况如何?free -m