Як я можу зупинити nginx від повторного повторного запиту PUT або POST на час очікування сервера?


11

Ми використовуємо 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;        
    }
}

Відповіді:


9

Це стало поведінкою за замовчуванням, починаючи з версії 1.9.13

Щоб змінити його назад вручну, ви можете скористатися:

proxy_next_upstream error timeout non_idempotent;

6

Я знаю, що я запізнююся з грою, але для мене це найкращий результат при пошуку цієї проблеми, тому я хотів поділитися своїм рішенням.

Для цього використовується директива if (з одним з небагатьох дійсних випадків використання ) у поєднанні з користувацьким обробником помилок :

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

4

Будь ласка, дивіться тут для doc: proxy_next_upstream

Зверніть увагу, це неперевірена суть

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


Насправді це не спрацювало: Nginx каже, що "proxy_next_upstream тут заборонено". Я спробував перемістити блоки if на місце і отримав таку ж помилку. Використання "помилки proxy_next_upstream" в будь-якому місці на власних роботах.
Девід Тінкер

це дуже дивно, оскільки там документація чітко говорить про те, що вона працює в контексті розташування
WojonsTech

здається, що якщо (...) {} навколо proxy_next_upstream, що nginx не подобається
Девід Тінкер

Хтось тестував це? 4 оновлення, але, схоже, не дотримуються дійсних випадків використання тут: nginx.com/resources/wiki/start/topics/depth/ifisevil
EoghanM

0

використовувати proxy_methodдирективу

зверніться до: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_method


2
Як правило, рекомендується включати у відповідь корисну інформацію від посилання, щоб вона не
посилалась на

1
Ласкаво просимо до помилки сервера! Хоча це теоретично може відповісти на питання, бажано було б сюди включити істотні частини відповіді та надати посилання для довідки.
Марк Хендерсон

-1

У мене така ж проблема в моєму сервері 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
Це зовсім не відповідає на питання. Ваші проблеми нічим не схожі.
Свен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.