37 votes

Comment renvoyer un statut 503 dans Apache sans invoquer des scripts ?

J'ai besoin de renvoyer un code d'état 503 à partir d'un de mes sites pendant qu'il est arrêté pour maintenance, selon la méthode SE_firendly. Je n'arrive pas à trouver comment faire sans invoquer des scripts externes, ce que je préférerais éviter.

Existe-t-il une directive Apache qui me permette de renvoyer un code d'état HTTP arbitraire sans avoir recours à des astuces telles que l'invocation d'un script php script qui définit l'en-tête d'état ?

39voto

Deano Points 691

Chaque demande reçoit une page d'attente statique accompagnée de l'état 503.

RedirectMatch 503 ^/(?!holding\.html)
ErrorDocument 503 /holding.html
Header always set Retry-After "18000"

RedirectMatch est utilisé pour annuler la page d'attente elle-même, qui créerait sinon une boucle infinie.

mod_header est utilisé pour définir un en-tête Retry-After afin d'indiquer à Google/autres robots, etc. que vous devez effectuer une sauvegarde après 18 000 secondes (5 heures) dans cet exemple. Vous pouvez sudo ap2enmod header pour activer mod_header (ce qui est nécessaire pour la directive Header).

11voto

David Pashley Points 22851

Essayer

Redirect 503 / /

En http://httpd.apache.org/docs/2.2/mod/mod_alias.html#redirect :

D'autres codes d'état peuvent être renvoyés en donnant le code d'état numérique comme valeur de status. Si l'état est compris entre 300 et 399, l'argument URL doit être présent, sinon il doit être omis. Notez que le code Apache doit connaître le statut (voir la fonction send_error_response dans http_protocol.c).

Note supplémentaire : Ceci affichera le document d'erreur par défaut/configuré pour l'erreur 503.

7voto

Phil Points 51

Pour rendre votre mode de maintenance plus flexible, définissez 503 lorsqu'un fichier spécial existe, par exemple :

RewriteEngine on
RewriteCond %{DOCUMENT_ROOT}/.maintenance -f
RewriteRule .* - [R=503]

NOTE : L'emplacement de DOCUMENT_ROOT peut différer entre httpd 2.2 et 2.4.

De cette façon, tout ce que vous avez à faire est "touch /path/to/docroot/.maintenance" et votre site commencera instantanément à renvoyer des 503. Ensuite, pour rendre le tout plus pur, créez une page d'erreur html personnalisée et joliment formatée et ajoutez-la au bon fichier de configuration du serveur Apache :

ProxyErrorOverride on
ErrorDocument 503 /error/503.html

Et pour les points bonus, si vous avez plusieurs serveurs web, faites en sorte que l'emplacement de .maintenance soit sur un système de fichiers partagé ou, pour encore plus de points bonus, faites en sorte que l'emplacement de .maintenance soit sur un système de fichiers partagé :

pdsh -w $web1_ip,$web2_ip,$web3_ip "sudo touch /path/to/docroot/.maintenance"

L'avantage de faire reposer le mode de maintenance sur un fichier est qu'il fonctionne lorsque votre application ne fonctionne pas, qu'il est rapide et simple, et qu'il est plus facile pour un proxy de mise en cache frontal de le gérer parce que vous pouvez gérer tous les 503 du backend en une seule fois.

Sources :

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X