Вопрос: Как я могу остановить nginx от повторных запросов PUT или POST на время ожидания сервера?


Мы используем nginx для загрузки запросов баланса в наше приложение. Мы обнаружили, что nginx переключается на другой восходящий сервер, когда запрашивает тайм-аут (хороший). Однако он делает это для запросов PUT и POST, которые могут вызывать нежелательные результаты (данные хранятся дважды). Можно ли настроить nginx только для повторного запроса запросов GET на тайм-аут? Или есть другой способ решить проблему?

Наша конфигурация выглядит следующим образом:

upstream mash {
    ip_hash;
    server 127.0.0.1:8081;
    server 192.168.0.11:8081;
}

server {
    ...
    location / {
        proxy_pass http://mash/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;        
    }
}

10
2017-08-05 07:18


Источник




Ответы:


Это поведение по умолчанию, начиная с версии 1.9.13

Чтобы изменить его вручную, вы можете использовать:

proxy_next_upstream error timeout non_idempotent;

8
2018-05-03 06:46





Я знаю, что довольно поздно в игре, но для меня это главный результат при поиске этой проблемы, поэтому я хотел поделиться своим решением.

Это использует если директива (с одним из немногих действительные варианты использования) в сочетании с настраиваемый обработчик ошибок:

upstream backend {
    server backend1;
    server backend2;
}

server {
    server_name proxy;

    location / {
        error_page 598 = @retry;
        error_page 599 = @no_retry;
        if ($request_method = POST) {
            return 599;
        }
        return 598;
    }

    location @retry {
        proxy_pass http://backend;
    }

    location @no_retry {
        proxy_pass http://backend;
        proxy_next_upstream off;
    }
}

6
2017-08-19 11:34





См. Здесь документ: proxy_next_upstream

Обратите внимание, что это непроверенный

https://gist.github.com/wojons/6154645


4
2017-08-05 09:35



На самом деле это не сработало: Nginx говорит, что «proxy_next_upstream здесь не разрешен». Я попытался переместить блоки if в место и получил ту же ошибку. Использование «proxy_next_upstream error» в любом месте на своих собственных работах. - David Tinker
это очень странно, поскольку в документации четко сказано, что он работает в контексте местоположения - WojonsTech
кажется, что if (...) {} вокруг proxy_next_upstream, что nginx не нравится - David Tinker
Кто-нибудь проверил это? 4 upvotes, но он, похоже, не придерживается действительных вариантов использования здесь: nginx.com/resources/wiki/start/topics/depth/ifisevil - EoghanM


использование proxy_method директива

Ссылаться на: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_method


0
2018-06-17 15:33



Обычно рекомендуется включать полезную информацию из ссылки в вашем ответе, так что она явно не полагается на ссылку, которая будет полезна - BE77Y
Добро пожаловать в Server Fault! Хотя это теоретически может ответить на вопрос, было бы предпочтительнее чтобы включить здесь основные части ответа и предоставить ссылку для справки. - Mark Henderson♦


У меня такая же проблема на моем сервере tomcat. время прокси-сервера при длительном запросе. Я решил проблему, используя proxy_read_timeout. когда увеличивается тайм-аут, тогда моя просьба никогда не выходила и не возникала никаких проблем. по умолчанию - 60 с. Справка 

location / {
    proxy_pass  http://xxxxxxxxxx.com;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_set_header X-Forwarded-Proto https;
            proxy_redirect off;
            proxy_connect_timeout      800;
            proxy_send_timeout         800;
            proxy_read_timeout         240;     
}

-1
2017-11-25 09:27



Это вообще не отвечает на вопрос. Ваши проблемы ничем не похожи. - Sven♦