2017-01-10 2 views
0

J'ai du mal à configurer nginx comme proxy d'un point de terminaison public S3. Mon cas d'utilisation nécessite de modifier le code d'état de la réponse S3, tout en préservant la charge utile de réponse.Comment modifier le code d'état d'une réponse de serveur proxy dans nginx?

Les codes d'état possibles retournés par S3 comprennent 200 et 403. Pour mon cas d'utilisation, je dois cartographier les codes d'état à 503.

J'ai essayé les éléments suivants qui ne fonctionne pas:

location ~* ^/.* { 
    [...] 
    proxy_intercept_errors on; 
    error_page    200 =503 $upstream_http_location 
} 

Nginx génère l'erreur suivante:

nginx: [emerg] value "200" must be between 300 and 599 in /etc/nginx/nginx.conf:xx

Voici un extrait plus complet:

server { 
    listen  80; 

    location ~* ^/.* { 
    proxy_http_version   1.1; 
    proxy_method    GET; 
    proxy_pass     http://my-s3-bucket-endpoint; 
    proxy_pass_request_body off; 

    proxy_set_header  Content-Length ""; 
    proxy_set_header  Connection ""; 
    proxy_set_header  Host my-s3-bucket-endpoint; 
    proxy_set_header  Authorization ''; 

    proxy_hide_header  x-amz-id-2; 
    proxy_hide_header  x-amz-request-id; 
    proxy_hide_header  Set-Cookie; 
    proxy_ignore_headers "Set-Cookie"; 

    proxy_cache   S3_CACHE; 
    proxy_cache_valid  200 403 503 1h; 
    proxy_cache_bypass  $http_cache_purge; 
    add_header    X-Cached $upstream_cache_status; 

    proxy_intercept_errors on; 
    error_page    200 =503 $upstream_http_location; 
    } 
} 

Est-il possible de réaliser ce dont j'ai besoin avec nginx?

Répondre

0

J'ai trouvé une solution plus ou moins adaptée. C'est un peu hackish mais ça marche.

La clé consistait à définir le document d'index de mon compartiment S3 sur un nom de fichier inexistant. Cela provoque des demandes à/sur le point de terminaison de compartiment S3 pour aboutir à 403.

Comme le proxy nginx mappe toutes les demandes entrantes vers/sur le point de fin de compartiment S3, le résultat est toujours 403 que le proxy nginx peut intercepter. À partir de là, la directive error_page lui demande de répondre en demandant un document spécifique (dans ce cas, error.json) dans le noeud final S3 et d'utiliser 503 comme code d'état de réponse.

location ~* ^/. { 
    proxy_intercept_errors on; 
    error_page    403 =503 /error.json; 
} 

Cette solution implique deux demandes envoyées à l'extrémité du godet S3 (/, /error.json), mais au moins la mise en cache semble être activé pour les requêtes en utilisant la configuration dans l'extrait ci-dessus plus complète.

+0

Juste ramener le serveur backend pour la maintenance, et vous obtiendrez votre erreur sans astuces. – AnrDaemon

+0

Toutefois, les utilisateurs verront le message générique 503 par défaut de l'équilibreur de charge. Je dois retourner un message d'erreur personnalisé qui sera éventuellement configurable par des personnes non techniques de l'équipe. – Wenzil

0

Lisez ce que le système vous indique. Vous ne pouvez pas modifier le code de retour "succès". Cela n'a aucun sens.

+0

Je sais que je ne peux pas l'utiliser tel quel, mais je suis à la recherche d'une autre façon d'y parvenir. En savoir plus sur mon cas d'utilisation: je souhaite que le code de statut de réponse soit 503 pendant la maintenance mais que son message soit dynamique (lu à partir de S3 et mis en cache). L'objectif est donc de faire en sorte que ce serveur tombe en panne pendant la maintenance pendant que les serveurs de production sont retirés du groupe d'équilibrage de charge. – Wenzil