Мой веб-сервер (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-адреса.