Я пишу сценарий для корректного перезапуска Apache в приложении AWS Elastic Beanstalk каждый час. Это необходимо для загрузки новых сертификатов SSL. Приложение обслуживает несколько веб-сайтов в нескольких доменах, поэтому каждому нужны свои сертификаты и файл конфигурации. Если новых файлов нет, перезапуск выполняется нормально, и веб-сайты все еще работают. Если есть новые файлы (задание cron загружает файлы из корзины S3), веб-сайты отключаются, и в журналах apache нет ничего о том, почему он не работает.
Это сценарий:
#!/bin/bash
exec 3>&1 1>>/var/log/httpd/cert-sync.log 2>&1
# start
echo "[$(date)]: ----------- Start Sync-----------"
echo "[$(date)]: Syncing certs..."
aws s3 sync s3://s3.bucket/certs /etc/pki/tls/
echo "[$(date)]: Syncing conf..."
aws s3 sync s3://s3.bucket/conf /etc/httpd/conf.d/ssl-vhosts/
echo "[$(date)]: Attempting Apache graceful restart..."
sudo /etc/init.d/httpd graceful
exit 0
Это результат в журнале:
[Sat Jul 6 21:24:01 UTC 2019]: ----------- Start Sync-----------
[Sat Jul 6 21:24:01 UTC 2019]: Syncing certs...
[Sat Jul 6 21:24:01 UTC 2019]: Syncing conf...
[Sat Jul 6 21:24:01 UTC 2019]: Attempting Apache graceful restart...
Equivalent Upstart operations: start httpd, stop httpd, restart httpd, status httpd
Gracefully restarting httpd
[OK]
[Sat Jul 6 21:27:01 UTC 2019]: ----------- Start Sync-----------
[Sat Jul 6 21:27:01 UTC 2019]: Syncing certs...
[Sat Jul 6 21:27:01 UTC 2019]: Syncing conf...
[Sat Jul 6 21:27:01 UTC 2019]: Attempting Apache graceful restart...
Equivalent Upstart operations: start httpd, stop httpd, restart httpd, status httpd
Gracefully restarting httpd
/etc/init.d/httpd: line 60: kill: (10478) - No such process
Stopping httpd
stop: Unknown instance:
Starting httpd
httpd start/running, process 14139
[OK]
Всегда заканчивается сообщением [OK]
. Нет ничего в /var/log/httpd/error_log
. В первый раз, видимо, перезапускается нормально, но это не так. При втором запуске скрипта не удается найти процесс, на котором запущен apache, поэтому он пытается запустить его, но тоже терпит неудачу. Перезапуск серверов приложений из консоли AWS тоже не исправляет.
Это работает под управлением Amazon Linux 2017.03. Если я отправляю новое обновление в приложение, экземпляр сервера перестраивается, загружает все файлы (через .ebextension
который не запускается в cron, но до запуска сервера приложений) и запускает apache, и все работает нормально, поэтому я знаю, что это не ошибка в файлах конфигурации. В его нынешнем виде, всякий раз, когда загружается новый сертификат, единственный способ заставить его работать - это отправить обновление в эластичный beanstalk, но мне нужен только запланированный перезапуск.
Я пробовал эти команды для перезапуска apache:
sudo initctl restart httpd
sudo service httpd restart
Я хотел бежать httpd configtest
перед тем, как запустить плавный перезапуск и записать результат, но я получил следующее:
[Sat Jul 6 21:29:01 UTC 2019]: ----> sudo /etc/init.d/httpd configtest
Equivalent Upstart operations: start httpd, stop httpd, restart httpd, status httpd
Usage: {start|stop|restart|status|graceful}
Это означает, что он не запускался, и файл выскочки не настроен для запуска configtest. Я не нашел способа проверить конфигурацию перед перезапуском, чтобы увидеть, есть ли что-то другое с файлами, когда они синхронизируются с cron или с расширением .ebextension при запуске экземпляра.
Я также нашел это в /var/log/messages
:
Jul 6 19:53:01 ip-172-31-0-244 init: httpd main process ended, respawning
Jul 6 19:53:01 ip-172-31-0-244 init: httpd main process ended, respawning
Jul 6 19:53:01 ip-172-31-0-244 init: httpd main process ended, respawning
Jul 6 19:53:01 ip-172-31-0-244 init: httpd main process ended, respawning
Jul 6 19:53:01 ip-172-31-0-244 init: httpd main process ended, respawning
Jul 6 19:53:01 ip-172-31-0-244 init: httpd main process ended, respawning
Jul 6 19:53:01 ip-172-31-0-244 init: httpd main process ended, respawning
Jul 6 19:53:01 ip-172-31-0-244 init: httpd main process ended, respawning
Jul 6 19:53:01 ip-172-31-0-244 init: httpd main process ended, respawning
Jul 6 19:53:01 ip-172-31-0-244 init: httpd main process ended, respawning
Jul 6 19:53:02 ip-172-31-0-244 init: httpd respawning too fast, stopped
Возможно, Upstart пытается возродить httpd до завершения корректного перезапуска? Понятия не имею, о чем я здесь говорю, но что-то там может быть.
Это файл конфигурации выскочки:
[Sat Jul 6 21:58:01 UTC 2019]: ----> cat /etc/init/httpd.conf
# apache2 - http server
#
# Apache is a web server that responds to HTTP and HTTPS requests.
# Required-Start: $local_fs $remote_fs $network $syslog
# Required-Stop: $local_fs $remote_fs $network $syslog
description "apache2 http server"
start on runlevel [2345]
stop on runlevel [!2345]
# Give up if restart occurs 10 times in 30 seconds.
respawn limit 10 30
script
. /opt/elasticbeanstalk/support/envvars
if [ -f /etc/elasticbeanstalk/set-ulimit.sh ]; then
. /etc/elasticbeanstalk/set-ulimit.sh
fi
# Output to standard out for upstart and to the error_log
/usr/sbin/httpd -D FOREGROUND | tee /var/log/httpd/error_log
end script
respawn
Я новичок в выскочке, поэтому не уверен, что здесь что-то может вызвать проблему.
Я знаю, что это много информации, но я надеюсь, что предоставил достаточно контекста. У кого-нибудь есть идеи, что может происходить?
Вы должны исключить проблему cron. Работает ли сценарий нормально вне cron в интерактивной оболочке bash?
Cron убирает многие вещи: