Оптимизировать Apache для микро-экземпляра EC2
Я использую apache2 на микроэкземпляре EC2 с ~600 МБ ОЗУ. Экземпляр работал почти год без проблем, но в последние недели он просто продолжает падать, потому что сервер достиг MaxClients.
Сервер в основном работает с несколькими веб-сайтами, одним WordPress-блогом (редко используется), веб-сайтом компании (наиболее часто используемым) и двумя небольшими сайтами, которые являются только внутренними.
База данных для блога работает на RDS, поэтому на этом веб-сервере не работает Mysql.
Когда я пришел в компанию, сервер уже был настроен и работает под управлением apache + mod_php + prefork. Мы хотим перенести это в будущем на nginx + php-fpm, но это все еще требует дальнейшего тестирования. Так что сейчас я должен придерживаться старой настройки.
Я также использую DDOS-защиту CloudFlare перед сервером, потому что за последние недели он подвергался атакам пару раз.
В данный момент моя компания не хочет платить деньги за лучший веб-сервер, поэтому я также должен придерживаться микроэкземпляра. Кроме того, код веб-сайта, который мы запускаем, очень плохой и медленный, и иногда загрузка одной страницы может занимать до 15 секунд. Весь сайт динамический и написан на PHP, поэтому кэширование здесь не вариант. Это индивидуальный поиск пользователей.
Я уже отключил KeepAlive, что немного улучшило производительность.
Мой конфиг prefork выглядит следующим образом:
StartServers 2 MinSpareServers 2 MaxSpareServers 5 ServerLimit 10 MaxClients 10 MaxRequestsPerChild 100
Сервер просто перестает отвечать на запросы через некоторое время, и я запустил следующую команду, чтобы увидеть, сколько существует соединений: netstat | grep http | туалет-75
Попытка перезапустить apache помогает на короткое время, но через некоторое время процесс (-ы) apache снова перестают отвечать на запросы.
У меня включены следующие модули (вывод apache2ctl -M)
Загруженные модули: core_module (статический) log_config_module (статический) logio_module (статический) version_module (статический) mpm_prefork_module (статический) http_module (статический) so_module (статический) alias_module (общий доступ) authz_host_module (общий доступ) deflate_module (общий доступ) dir_module (общий доступ) expires_module (общий доступ) mime_module (общий доступ) переговорный_модуль (общий) php5_module (общий доступ) rewrite_module (общий доступ) setenvif_module (общий доступ) ssl_module (общий доступ) status_module (общий) Синтаксис ОК
apache2.conf
# Security
ServerTokens OS
ServerSignature On
TraceEnable On
ServerName "web.example.com"
ServerRoot "/etc/apache2"
PidFile ${APACHE_PID_FILE}
Timeout 30
KeepAlive off
User www-data
Group www-data
AccessFileName .htaccess
<Files ~ "^\.ht">
Order allow,deny
Deny from all
Satisfy all
</Files>
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
DefaultType none
HostnameLookups Off
ErrorLog /var/log/apache2/error.log
LogLevel warn
EnableSendfile On
#Listen 80
Include /etc/apache2/mods-enabled/*.load
Include /etc/apache2/mods-enabled/*.conf
Include /etc/apache2/ports.conf
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
Include /etc/apache2/conf.d/*.conf
Include /etc/apache2/sites-enabled/*.conf
Vhost основного сайта
<VirtualHost *:80>
ServerName www.example.com
## Vhost docroot
DocumentRoot /srv/www/jenkins/Web
## Directories, there should at least be a declaration for /srv/www/jenkins/Web
<Directory /srv/www/jenkins/Web>
AllowOverride All
Order allow,deny
Allow from all
</Directory>
## Load additional static includes
## Logging
ErrorLog /var/log/apache2/www.example.com.error.log
LogLevel warn
ServerSignature Off
CustomLog /var/log/apache2/www.example.com.access.log combined
## Rewrite rules
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www.example.com$
RewriteRule ^.*$ http://www.example.com%{REQUEST_URI} [R=301,L]
## Server aliases
ServerAlias www.example.invalid
ServerAlias example.com
## Custom fragment
<Location /srv/www/jenkins/Web/library>
Order Deny,Allow
Deny from all
</Location>
<Files ~ "^\.(.+)">
Order deny,allow
deny from all
</Files>
</VirtualHost>
2 ответа
Обновите свой сервер
Я знаю, ты не хочешь это слышать. Я знаю, что ваш клиент не хочет это слышать. Но это то, что вам нужно услышать! Если на клиенте запущено 4 веб-сайта (не менее производительных), ему следует раскошелиться на лучший сервер.
Но почему?
Микроэкземпляры НЕ предназначены для производственного использования (сами AWS говорит так), они страдают от конфликтов, не ожидают ничего великого или предсказуемого из ЦП, сети или дискового ввода-вывода.
Если вы должны использовать mirco, рассмотрите t2 вместо t1
T1 = http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/concepts_micro_instances.html
T1.micro является экземпляром предыдущего поколения, и его заменил t2.micro, который имеет гораздо лучший профиль производительности. Мы рекомендуем использовать тип экземпляра t2.micro вместо t1.micro. Для получения дополнительной информации см. Экземпляры T2.
T2 = http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/t2-instances.html
Они предназначены для рабочих нагрузок, которые не используют частоту и частоту использования всего ЦП, но время от времени требуют разрыва. Экземпляры T2 хорошо подходят для рабочих нагрузок общего назначения, таких как веб-серверы, среды разработки и небольшие базы данных.
Быстрый взлом
Иногда вы можете решить проблемы конкуренции (кража процессора, синдром плохого соседа и т. Д.) С вашим хостом, остановив EC2 и запустив его снова. Это приведет к изменению основного хоста, на котором сидит ваш EC2.
Ответы на некоторые другие ваши вопросы...
Экземпляр работал почти год без проблем, но в последние недели он просто продолжает падать, потому что сервер достиг MaxClients.
Как вы думаете, почему сервер достиг MaxClients? Больше трафика? Вы можете увеличить это число, однако я подозреваю, что микроэкземпляр не может обработать слишком много одновременных соединений.
База данных для блога работает на RDS, поэтому на этом веб-сервере не работает Mysql.
Я люблю RDS и рекомендую людям использовать его. Но почему ваша компания тратит деньги на RDS, но не желает обновлять свой экземпляр EC2? Почему бы просто не сбросить RDS и обновить EC2? (В идеальном мире я бы сказал, оставь RDS и обнови EC2).
Весь сайт динамический и написан на PHP, поэтому кэширование здесь не вариант.
Вы уверены, что APC не поможет в этой ситуации? Может быть трудно точно определить, сколько APC может помочь, пока вы не попробуете. http://php.net/manual/en/intro.apc.php
Попытка перезапустить apache помогает на короткое время, но через некоторое время процесс (-ы) apache снова перестают отвечать на запросы.
Похоже, вы (возможно) получаете слишком много трафика?
Уже поздно, но другое решение - уменьшить нагрузку на ec2. Используйте дистрибутив облачного фронта перед этим экземпляром. Уменьшит нагрузку на ваш сервер, если политики кэширования правильные и AFAIK с правильными политиками кэширования, ваш сервер может масштабироваться до тысяч читателей (не редактора, администраторов и т. Д.)