我的 Web 服务器(Ubuntu、Apache 和 Redis 服务器)在高峰时段 CPU 占用率达到 100%。将所有流量重定向到 HTTPS 后,CPU 使用率迅速增加。我们在服务器上使用 PHP 5.6、Apache 2.2、Redis 服务器和 GeoIP。
服务器有足够的内存并且它只使用很少的内存。
有什么办法可以减少 CPU 的使用率吗?
top - 11:30:01 up 115 days, 2:48, 1 user, load average: 190.86, 270.08, 159.08
Tasks: 1612 total, 155 running, 1456 sleeping, 0 stopped, 1 zombie
%Cpu(s): 75.5 us, 19.3 sy, 0.0 ni, 2.1 id, 1.8 wa, 0.0 hi, 1.2 si, 0.0 st
KiB Mem: 61836576 total, 58087948 used, 3748628 free, 1391660 buffers
KiB Swap: 0 total, 0 used, 0 free. 36999240 cached Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
106731 www-data 20 0 534768 34936 16644 S 27.5 0.1 0:11.64 /usr/sbin/apache2 -k start
105089 www-data 20 0 536356 36036 16148 S 27.2 0.1 0:06.96 /usr/sbin/apache2 -k start
105942 www-data 20 0 534580 38780 20696 R 22.3 0.1 0:14.38 /usr/sbin/apache2 -k start
106552 www-data 20 0 534516 38404 20364 S 20.3 0.1 0:09.20 /usr/sbin/apache2 -k start
104105 www-data 20 0 538160 40876 19756 R 20.0 0.1 0:16.93 /usr/sbin/apache2 -k start
102426 www-data 20 0 534728 40544 22268 S 19.7 0.1 0:14.81 /usr/sbin/apache2 -k start
106733 www-data 20 0 537724 39960 19292 R 19.7 0.1 0:11.38 /usr/sbin/apache2 -k start
我的 SSL 配置是:
<VirtualHost *:443>
ServerAdmin [email protected]
ServerName domain.com
ServerAlias www.domain.com
DocumentRoot /home/domain/public_html
<Directory /home/domain/public_html/>
Options -Includes -ExecCGI +FollowSymLinks
SSLRequireSSL
AllowOverride All
Order allow,deny
allow from all
Require all granted
</Directory>
SSLEngine on
SSLVerifyClient none
SSLCertificateFile /etc/apache2/ssl/ssl.cert
SSLCertificateKeyFile /etc/apache2/ssl/ssl.key
SSLCertificateChainFile /etc/apache2/ssl/sslIntermediate.crt
SSLHonorCipherOrder On
SSLCipherSuite ECDHE-RSA-AES128-SHA256:AES128-GCM-SHA256:!RC4:HIGH:!MD5:!aNULL:!EDH:!3DES:!DES:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!MEDIUM
SSLProtocol -ALL +TLSv1.1 +TLSv1.2
SSLCompression Off
ErrorLog ${APACHE_LOG_DIR}/domain-error.log
LogLevel error
CustomLog ${APACHE_LOG_DIR}/domain-access.log combined
</VirtualHost>
mpm_prefork.conf:
<IfModule mpm_prefork_module>
StartServers 50
MinSpareServers 20
MaxSpareServers 20
ServerLimit 1200
MaxClients 1200
#MaxRequestWorkers 800
MaxConnectionsPerChild 1000
</IfModule>
监控系统显示 Apache 占用了较多的 CPU,高峰时有超过 1200 个 Apache 进程在运行,似乎已经达到极限。MySQL 服务器也负载过大。
在 ELB 上安装 SSL 能解决问题吗?或者任何其他最佳实践或转变值更改都能解决我的问题?
答案1
是的,将 SSL 卸载到 Amazon Load Balancer 是个好主意。加密/解密需要大量 CPU。此外,您的 SSL 证书是免费的,并且会自动续订。
查看您的 Apache 日志文件并检查您的网站流量。如果您看到的是正常流量,则可能需要 SSL 卸载或增加您的实例大小(或两者兼而有之)。但是,如果您看到大量不良流量(黑客),请考虑添加负载平衡器和防火墙(Amazon WAF)。我总是为所有网站设置 ALB 或 NLB 加 WAF。
如果您确实添加了负载均衡器,请确保客户无法通过其 IP 地址访问您的网站,否则黑客将绕过您的负载均衡器(不是故意的,因为他们只是扫描 IP 地址)。这可以通过将您的网站放在私有 VPC 子网内(推荐)或指定仅允许来自负载均衡器的流量的安全组条目来实现。
如果您的网站流量正常,但在某些时间段(每天)流量往往会增加,请考虑添加 ASG(自动扩展组)来处理这些繁忙时段的流量增加。这还将为您的网站设置增加更高的可用性。
我建议检查您的安全组,以确保所有非必需端口均被阻止。如果您允许 RDP 或 SSH,则仅允许通过您的 IP 地址访问这些端口,而不是 0.0.0.0/0。每当您的 IP 地址发生变化时,您都可以通过控制台更改此 IP 地址。
答案2
为了减少对服务器的调用次数,如果您有许多静态图像并且它们不经常更改,您可以将其添加到 Apache:
ExpiresActive On
ExpiresDefault "access plus 1 week"
或者根据需要使用 ExpiresByType。在我工作的地方,它从死机服务器变为安静的服务器。
此外,如果您的网站流量很大,将 MaxConnectionsPerChild 设置为 1000 有点小。这意味着每处理 1000 个请求,客户端就会死机并由父级重新启动。如果您的 Apache 比较稳定,您可以将设置提高很多,并避免一直重新启动进程。