Назад | Перейти на главную страницу

Высокая загрузка процессора на веб-сервере Apache mod_php

Мой веб-сервер (Ubuntu, Apache и Redis-server) загружает 100% ЦП в часы пик. После перенаправления всего трафика на HTTPS загрузка ЦП быстро увеличивается. Мы используем PHP 5.6, Apache 2.2, сервер Redis и GeoIP на сервере.

На сервере достаточно памяти, и он использует очень мало памяти.

Можно ли что-нибудь сделать, чтобы снизить загрузку процессора?

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 support@domain.com
        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 использует больше ЦП, в пиковое время работает более 1200 процессов apache, и, похоже, он достигает предела. Сервер MySQL тоже нагружается.

Решит ли проблему установка SSL на ELB? Или любые другие передовые методы или изменение значений поворота решат мою проблему?

Чтобы уменьшить количество обращений к вашему серверу, если у вас много статических изображений и они не меняются часто, вы можете добавить это в свой Apache:

ExpiresActive On
ExpiresDefault "access plus 1 week"

Или используйте ExpiresByType в зависимости от ваших потребностей. Там, где я работаю, из умирающего сервера стало тихо.

Кроме того, MaxConnectionsPerChild до 1000 немного мал, если у вас сайт с высоким трафиком. Это означает, что каждые 1000 обработанных запросов клиент умирает и перезапускается родителем. Если ваш Apache в остальном стабилен, вы можете пойти намного выше и избежать постоянного перезапуска процессов.

Да, выгрузка SSL на Amazon Load Balancer - хорошая идея. Шифрование / дешифрование требует интенсивной работы ЦП. К тому же ваши SSL-сертификаты бесплатны и автоматически продлеваются.

Взгляните на файлы журнала Apache и просмотрите трафик своего веб-сайта. Если вы видите нормальный трафик, возможно, потребуется разгрузка SSL или увеличение размера вашего экземпляра (или и то, и другое). Однако, если вы видите много плохого трафика (хакеров), подумайте о добавлении балансировщика нагрузки и брандмауэра (Amazon WAF). Я всегда устанавливаю ALB или NLB плюс WAF для всех веб-сайтов.

Если вы добавляете балансировщик нагрузки, убедитесь, что клиенты не могут получить доступ к вашему веб-сайту через его IP-адрес, в противном случае хакеры обойдут ваш балансировщик нагрузки (не специально, поскольку они просто сканируют IP-адреса). Это можно сделать, поместив ваш веб-сайт в частную подсеть VPC (рекомендуется) или указав запись группы безопасности, разрешающую трафик только от вашего балансировщика нагрузки.

Если трафик вашего веб-сайта нормальный, но имеет тенденцию к увеличению в определенные периоды времени часто (ежедневно), рассмотрите возможность добавления ASG (группы автоматического масштабирования) для обработки увеличения трафика в эти часы наибольшей нагрузки. Это также повысит доступность вашего веб-сайта.

Я рекомендую просмотреть ваши группы безопасности, чтобы убедиться, что все ненужные порты заблокированы. Если вы разрешаете RDP или SSH, разрешайте доступ к этим портам только через ваш IP-адрес, а не через 0.0.0.0/0. Вы можете изменить этот IP-адрес через консоль при изменении вашего IP-адреса.