Comment obliger Apache2 à attendre l'initialisation du réseau?

2

Le serveur vient de passer de Squeeze à Wheezy. Après le redémarrage, j'ai constaté qu'apache2 ne démarrait pas. J'ai donc installé bootlogd pour inspecter la sortie des scripts d'initialisation.

La sortie d'erreur d'apache start était,

Tue Feb  3 08:49:55 2015: [....] Starting web server: apache2(99)Cannot assign requested address: make_sock: could not bind to address [0123:4567:890:abc::d]:80
Tue Feb  3 08:49:55 2015: no listening sockets available, shutting down
Tue Feb  3 08:49:55 2015: Unable to open logs
Tue Feb  3 08:49:55 2015: Action 'start' failed.
Tue Feb  3 08:49:55 2015: The Apache error log may have more information.

Les horodatages dans la sortie de démarrage indiquent 4 s entre "Configuration des interfaces réseau" (08:49:51) et le démarrage d'apache.

J'ai travaillé autour de cela en insérant un sleep 5 dans /etc/init.d/apache2 après quoi apache2 démarre correctement, je le lis donc comme une initialisation réseau lente (éventuellement propre au réseau IPv6). Le serveur fonctionne sur VMWare et je n’ai accès qu’à la machine virtuelle.

  • Quelles meilleures méthodes puis-je utiliser pour faire en sorte qu'Apache attende quelques secondes et vérifie que ses adresses sont actives avant de commencer?
  • Ou pour que le script d'initialisation réseau ne se ferme pas tant que les adresses ne sont pas prêtes?
Chris Burgess
la source
«Le serveur vient de passer de Squeeze à Wheezy.» J'ai l’impression drôle que c’est le problème. Peut-être qu'une ancienne installation d'Apache se bat pour obtenir la connexion réseau? Cela signifie deux ensembles de configuration Apache? L’initialisation du réseau pourrait être un «détournement» puisque vous vous connectez à la boîte et je suppose que c’est via le réseau?
JakeGould
Network init car la sortie init d'Apache se plaint de l'incapacité de saisir l'adresse ... sauf si retardé de quelques secondes. Une seule installation Apache est présente via les paquets Debian courants, aucun autre service sur le port 80/443.
Chris Burgess
Sensationnel. Cela semble toujours étrange. Vous ne devriez pas avoir à faire quoi que ce soit pour y faire face. Mais j’utilise un outil de surveillance autonome qui, à mon avis, constituerait une alternative intéressante à la init.d pirater. Je viens de poster une réponse complète. J'espère que ça aide!
JakeGould

Réponses:

0

Quelles meilleures méthodes puis-je utiliser pour faire attendre Apache quelques secondes et   vérifie-t-il que ses adresses sont opérationnelles avant de commencer?

Eh bien, la méthode que je décris ne résout évidemment pas le problème sous-jacent. Mais je crois qu’en utilisant un outil de surveillance autonome capable de gérer la tâche consistant à «remettre Apache au service» sans avoir à pirater init.d Le script est une solution plus stable. La clé est d'utiliser monit qui se décrit comme:

Monit est un petit utilitaire Open Source permettant de gérer et de surveiller Unix.   systèmes. Monit effectue la maintenance et la réparation automatiques et peut   exécuter des actions causales significatives dans des situations d'erreur.

Pour l'installer dans Ubuntu, faites ceci: j'utilise aptitude et c'est sur Ubuntu 12.04 FWIW:

sudo aptitude install monit

Une fois installé, j'aime bien configurer le serveur de messagerie par défaut pour l'envoi d'alertes. Cela suppose que vous avez postfix ou sendmail actif sur votre serveur. Ouvrez le monit fichier de contrôle avec votre éditeur de texte préféré; J'aime utiliser nano:

sudo nano /etc/monit/monitrc

Cherchez le set mailserver lignes et définir cette ligne et enregistrer le monit fichier de contrôle:

set mailserver localhost

Maintenant, vérifiez et assurez-vous qu'il y a un monit conf.d configuration du répertoire; c'est là individuel monit les tâches sont configurées:

ls -la /etc/monit/conf.d

Si en quelque sorte ça /etc/monit/conf.d n'a pas été configuré, créez-le comme ceci:

sudo mkdir /etc/monit/conf.d

Maintenant que cela est fait, créons un monit Règles Apache. Tout d'abord, trouver où l'Apache .pid Le fichier est défini et vérifiez qu'il est défini. C’est généralement là où il est défini sur Ubuntu 12.04 à l’aide de l’installation par défaut du paquet Apache:

ls -la /var/run/apache2.pid

Si ce .pid chemin du fichier est correct, créons le monit Règles Apache avec nano comme ça:

sudo nano /etc/monit/conf.d/apache2.conf

Et placez ce code dans ce fichier et enregistrez-le:

check process apache with pidfile /var/run/apache2.pid
        start "/etc/init.d/apache2 start"
        stop  "/etc/init.d/apache2 stop"
        if failed host 127.0.0.1 port 80
                with timeout 15 seconds
        then restart
        alert [email protected] only on { timeout, nonexist }

La logique du script est assez simple: le monit Apache ruleset vérifiera la /var/run/apache2.pid fichier et il sait utiliser spécifique init.d directives pour start et stop logique. La magie vient du if / then bloquer qui surveille essentiellement le port Apache 80 sur localhost 127.0.0.1 et prendra des mesures pour récupérer Apache s’il ya un délai d’attente de 15 secondes ou plus. Et le alert Cette ligne enverra des alertes par e-mail à une adresse e-mail spécifiée si les conditions du timeout ou nonexist sont remplies; C’est une option, alors n'hésitez pas à la commenter si vous n’avez pas besoin d’être inondé par des alertes par e-mail.

Maintenant redémarrer monit:

sudo service monit restart

Et vous pouvez suivre le monit connectez-vous ici pour le voir faire le travail et le déboguer si quelque chose ne fonctionne pas comme prévu:

sudo tail -f -n 200 /var/log/monit.log

Alors, quand la poussière s’installera sur ce serveur, vous aurez monit configuration pour vous assurer qu'Apache est en cours d'exécution. Très utile comme outil général «Gardez le serveur Web Apache actif», mais dans votre cas monit peut s’assurer que Apache est lancé au redémarrage / au démarrage afin que vous n’ayez pas à vous perdre avec le noyau Apache init.d script qui est vraiment un peu en désordre et est facilement oublié à l'avenir lors d'une mise à niveau.

Notez également que je lie Apache explicitement à IPv6, mais ce script de surveillance suppose que s’il ne parvient pas à 127.0.0.1 alors il faut agir. Peut-être devez-vous changer l'adresse IPv4 localhost de 127.0.0.1 en équivalent IPv6 d'adresse de ::1. Expérimentez et voyez ce qui fonctionne.

JakeGould
la source