ฉันจะหยุด nginx จากการลองคำขอ PUT หรือ POST อีกครั้งในการหมดเวลาของเซิร์ฟเวอร์ upstream ได้อย่างไร


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

โปรดดูที่นี่สำหรับเอกสาร: proxy_next_upstream

โปรดทราบว่านี่เป็นส่วนสำคัญที่ยังไม่ทดลอง

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


อันที่จริงมันใช้งานไม่ได้: Nginx บอกว่า "proxy_next_upstream ไม่อนุญาตที่นี่" ฉันพยายามย้ายบล็อก if ไปยังตำแหน่งและได้รับข้อผิดพลาดเดียวกัน การใช้ "proxy_next_upstream error" ในสถานที่ทำงานของตนเอง
David Tinker

มันแปลกมากเนื่องจากมีเอกสารระบุอย่างชัดเจนว่ามันใช้งานได้ในบริบทของสถานที่
WojonsTech

มันน่าจะเป็นในกรณีที่ ( ... ) {} รอบ proxy_next_upstream Nginx ที่ไม่ชอบ
เดวิดทิงเกอร์

มีใครทดสอบหรือไม่ 4 upvotes แต่ดูเหมือนจะไม่ปฏิบัติตามกรณีการใช้ที่ถูกต้องที่นี่: 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
โดยทั่วไปเราขอแนะนำให้รวมข้อมูลที่มีประโยชน์จากลิงก์ในคำตอบของคุณเพื่อไม่ให้ลิงก์นั้นมีประโยชน์
BE77Y

1
ยินดีต้อนรับสู่ Server Fault! ในขณะที่สิ่งนี้อาจตอบคำถามในทางทฤษฎีมันก็ควรที่จะรวมส่วนสำคัญของคำตอบที่นี่และให้ลิงค์สำหรับการอ้างอิง
Mark Henderson

-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
นี่ไม่ได้ตอบคำถามเลย ปัญหาของคุณไม่เหมือนกัน
สเวน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.