Apache mod_php 网络服务器 CPU 负载过高

Apache mod_php 网络服务器 CPU 负载过高

我的 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 比较稳定,您可以将设置提高很多,并避免一直重新启动进程。

相关内容