У меня есть несколько экземпляров ec2, запущенных в AWS, которые масштабируются политикой автомасштабирования, все в порядке, машины масштабируются вверх и вниз довольно хорошо. Однако у нас есть один глюк: когда он масштабируется вниз, запросы, обрабатываемые на (подлежащих завершению) экземплярах, теряются в середине, пока происходит завершение.
Мне бы хотелось перехватить сигнал завершения работы и попросить Apache выполнить корректное завершение работы, а затем позволить процессу завершения работы продолжиться.
решение1
Я нашел это, это своего рода хак, но, похоже, он мне помогает.
Когда система получает сигнал о завершении работы, запускаются скрипты в папке /etc/rc0.d, в том числе скрипты для завершения работы всех служб, включая Apache; если выполнение скрипта займет слишком много времени, AWS выключится, я не знаю, какой срок будет слишком долгим.
В любом случае, вот что я сделал: я отредактировал файл /etc/rc0.d/K09apache2
В функции apache_stop apache_stop() {
if $APACHE2CTL configtest > /dev/null 2>&1; then
# if the config is ok than we just stop normaly
#$APACHE2CTL stop 2>&1 | grep -v 'not running' >&2 || true
echo "stopping the apache gracefully"
$APACHE2CTL -k graceful-stop 2>&1 | grep -v 'not running' >&2 || true
sleep 15
Измените резкую остановку на плавную и дайте системе заснуть на 15 секунд, чтобы убедиться, что она заглохнет плавно.
Обновление — теперь Amazon ELB предоставляет функцию постепенного удаления экземпляров.