Оптимизировать 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 с правильными политиками кэширования, ваш сервер может масштабироваться до тысяч читателей (не редактора, администраторов и т. Д.)

Учебник по настройке CDN с WordPress

Другие вопросы по тегам