我目前在 Debian Wheezy 上运行带有 mod_event、php-fpm 和 apc 的 apache2.2。我托管了 3 个正常网站和 1 个非常糟糕的网站,该网站的代码非常糟糕,有时需要 2 分钟才能加载一个页面。数据库已经在 RDS 上运行,应该不是问题,而是代码执行低效的数据库查找。但是,我们不再有 PHP 开发人员,因此无法修复代码。
在访问该站点的某个时候,apache 也会达到 MaxClients 和 FPM。
apache2ctl -M 输出
Loaded Modules:
core_module (static)
log_config_module (static)
logio_module (static)
version_module (static)
mpm_event_module (static)
http_module (static)
so_module (static)
actions_module (shared)
alias_module (shared)
authz_host_module (shared)
deflate_module (shared)
dir_module (shared)
env_module (shared)
expires_module (shared)
fastcgi_module (shared)
mime_module (shared)
negotiation_module (shared)
reqtimeout_module (shared)
rewrite_module (shared)
setenvif_module (shared)
ssl_module (shared)
status_module (shared)
Syntax OK
Mod_Event 配置
<IfModule mpm_event_module>
StartServers 2
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxClients 150
MaxRequestsPerChild 0
</IfModule>
保活设置:
Keepalive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
FPM配置:
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
装甲运兵车:
extension=apc.so
apc.enabled=1
apc.shm_size=128M
apc.ttl=3600
apc.user_ttl=7200
apc.gc_ttl=3600
apc.max_file_size=1M
Fastcgi apache 配置:
<IfModule mod_fastcgi.c>
AddHandler fastcgi-script .fcgi
AddHandler php5-fcgi .php
#FastCgiWrapper /usr/lib/apache2/suexec
FastCgiIpcDir /var/lib/apache2/fastcgi
Action php5-fcgi /php5-fcgi
Alias /php5-fcgi /usr/lib/cgi-bin/php5-fcgi
FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -socket /var/run/php5-fpm.sock -pass- header Authorization -idle-timeout 250
</IfModule>
您能给我一些关于如何优化此设置的建议吗?谢谢您的帮助。
服务器负载非常低(0.00 0.01 0.05 1/169 4823)
内存看起来不错:
total used free shared buffers cached
Mem: 2011 431 1580 0 74 229
-/+ buffers/cache: 126 1885
答案1
事件模块设置应根据您的内存使用情况进行设置。查看您的内存负载,这些设置设置得太低了。您需要使用许多命令之一来估计每个进程的使用情况:
ps aux | grep 'apache2' | awk '{print $6/1024;}' | awk '{avg += ($1 - avg) / NR;} END {print avg " MB";}'
请注意,Google 上有数百万个网站具有类似的命令。
由于您正在运行 PHP-FPM,您可能也必须对其进行测量(只需更改 grep 部分)。最好的方法是在负载下进行测量。您可以使用 ab 测试或其他类似的解决方案来执行此操作。
例如,如果您的内存使用量是每个连接 20mb(这是上述命令的输出)。由于您的总内存为 2011mb,因此您需要减去 Linux 的开销、任何缓存机制等... 建立一些空间,然后取该数字(例如 1800mb)并除以 apache 进程。
例如,如果您的结果是每个进程 20mb,则可以将 MaxClients 设置为 90。如果命令的结果是 1mb,则可以将其设置为 1800 MaxClients。同时,我会确保建立一个缓冲区,因为所有应用程序都不相同。您的一个站点可能使用 1mb,而其他站点使用 40mb。您要确保建立一个合理的缓冲区,否则您的 Apache 服务器将一直崩溃。我通常根据服务器设置 10%-20%。
许多人认为你应该将其设置为 PHP 内存限制。这是一个安全选择,并且可能是一个不错的选择,具体取决于你的设置。需要高级管理员才能调整服务器使其超出该点,并且几乎没有失败的风险。
另外我通常会关闭 KeepAlive,我发现这样做可以获得更好的性能。