2017-01-10 7 views
0

Мне сложно настроить nginx, чтобы действовать как прокси-сервер публичной конечной точки S3. В моем случае использования необходимо изменить код состояния ответа S3, сохраняя при этом полезную нагрузку.Как изменить код состояния прокси-сервера в nginx?

Возможные коды состояния, возвращаемые S3 включают 200 и 403. Для моего случая использования, мне нужно сопоставить эти коды статуса для 503.

Я попытался следующие, не работает:

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

Nginx выводит следующее сообщение об ошибке:

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

Вот более полный фрагмент кода:

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; 
    } 
} 

Возможно ли достичь того, что мне нужно с nginx?

ответ

0

Я нашел более или менее подходящее решение. Это немного хаки, но это работает.

Ключ должен был установить индексный документ моего ведра S3 к несуществующему имени файла. Это приводит к тому, что запросы к/на конечной точке ведомости S3 приводят к 403.

Поскольку прокси-сервер nginx отображает все входящие запросы в/в конечной точке ведра S3, результат всегда равен 403, который прокси-сервер nginx может перехватывать. Оттуда директива error_page сообщает ему, чтобы она ответила, запросив конкретный документ (в данном случае error.json) в конечной точке ковша S3 и использовать 503 в качестве кода состояния ответа.

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

Это решение включает в себя два запроса, посылаемого на ведро S3 конечной точки (/, /error.json), но по крайней мере, кэширование кажется должен быть включен для обоих запросов, используя конфигурацию в более полном фрагменте выше.

+0

Просто приведите сервер backend для обслуживания, и вы получите свою ошибку без каких-либо трюков. – AnrDaemon

+0

Но тогда пользователи увидят сообщение 503 по умолчанию балансировки нагрузки по умолчанию. Мне нужно вернуть пользовательское сообщение об ошибке, которое в конечном итоге будет настраиваться нетехническими людьми в команде. – Wenzil

0

Прочитайте, что система сообщает вам. Вы не можете изменить код возврата «success». Это просто не имеет смысла.

+0

Я знаю, что не могу использовать его как есть, но я ищу альтернативный способ его достижения. Подробнее о моем случае использования: я хочу, чтобы код состояния ответа составлял 503 во время обслуживания, но его сообщение было динамическим (считано с S3 и кэшировано). Таким образом, цель состоит в том, чтобы этот сервер набирал обороты во время обслуживания, а производственные серверы были отключены от группы балансировки нагрузки. – Wenzil