ฉันจะป้องกันการหมดเวลาของเกตเวย์ด้วย FastCGI บน Nginx ได้อย่างไร


203

ฉันใช้ Django, FastCGI และ Nginx ฉันกำลังสร้าง api แปลก ๆ ที่ที่ใครบางคนสามารถส่งข้อมูลบางอย่างผ่านทาง XML ซึ่งฉันจะประมวลผลแล้วส่งคืนรหัสสถานะบางอย่างสำหรับแต่ละโหนดที่ถูกส่งไป

ปัญหาคือ Nginx จะใช้เวลาในการผ่านเกตเวย์ 504 ครั้งหากฉันใช้เวลานานเกินไปในการประมวลผล XML - ฉันคิดว่านานกว่า 60 วินาที

ดังนั้นฉันต้องการตั้งค่า Nginx เพื่อให้หากคำขอใด ๆ ที่ตรงกับตำแหน่ง / api จะไม่หมดเวลาเป็นเวลา 120 วินาที การตั้งค่าอะไรที่จะทำให้สำเร็จ

สิ่งที่ฉันมีอยู่คือ:

    # Handles all api calls
    location ^~ /api/ {
        proxy_read_timeout 120;
        proxy_connect_timeout 120;
        fastcgi_pass 127.0.0.1:8080;
    }

แก้ไข: สิ่งที่ฉันไม่ทำงาน :)


7
คุณสามารถตั้งค่าการหมดเวลาเป็น "2m" แทน "120"
Cenk Alti

1
ดูเหมือนว่าข้อมูลจะไม่ถูกสตรีม ... นั่นคือสำหรับเซิร์ฟเวอร์ที่จะเริ่มตอบกลับใน 60 วินาทีหรือมากกว่านั้นดูเหมือนจะไม่สามารถยอมรับได้
Adam Gent

คำตอบ:


245

หมดเวลาพร็อกซีเป็นอย่างดีสำหรับผู้รับมอบฉันทะไม่ใช่สำหรับ FastCGI ...

คำสั่งที่มีผลต่อการหมดเวลา FastCGI มีclient_header_timeout, และclient_body_timeoutsend_timeout

แก้ไข : พิจารณาสิ่งที่พบใน nginx wiki คำสั่ง send_timeoutรับผิดชอบการตั้งค่าการหมดเวลาการตอบกลับทั่วไป (ซึ่งเป็นการทำให้เข้าใจผิดเล็กน้อย) สำหรับ FastCGI มีfastcgi_read_timeoutสิ่งใดบ้างที่มีผลต่อการหมดเวลาตอบสนองของกระบวนการ fastcgi

HTH


8
สำหรับทุกคนที่ใช้ uwsgi และมีข้อผิดพลาดนี้ uwsgi_read_timeout 600; แก้ไขปัญหาของฉัน
Homer6

2
คำถามของฉันที่นี่จะเป็น (ในฐานะผู้ดูแลระบบเซิร์ฟเวอร์มือสมัครเล่น) ฉันจะเปลี่ยนสิ่งนี้ได้ที่ไหน ไฟล์ httpd.conf
jeffkee

2
หากช่วยได้ฉันจะอยู่ที่ / etc / nginx / ที่ระบบ DV ของ Media Temple
jeffkee

Abdo เป็นวิธีที่ดีในการแก้ไขข้อบกพร่อง หากคุณยังคงมีปัญหาคุณอาจต้องเพิ่มขนาดข้อความสูงสุดของไคลเอ็นต์เป็น nginx.conf (client_max_body_size ** M;)
Sam Grondahl

2
การเพิ่มการหมดเวลาใช้งานไม่ใช่วิธีการแก้ไขที่เหมาะสม
JazzCat

24

สำหรับผู้ที่ใช้ nginx กับยูนิคอร์นและรางส่วนใหญ่หมดเวลาที่อยู่ในunicorn.rbไฟล์ของคุณ

ใส่การหมดเวลาเป็นจำนวนมากใน unicorn.rb

timeout 500

หากคุณยังคงประสบปัญหาอยู่ให้ลอง fail_timeout = 0 ที่ upstream ใน nginx แล้วดูว่าวิธีนี้ช่วยแก้ไขปัญหาของคุณได้ไหม นี่คือจุดประสงค์ในการตรวจแก้จุดบกพร่องและอาจเป็นอันตรายในสภาพแวดล้อมการผลิต

upstream foo_server {
        server 127.0.0.1:3000 fail_timeout=0;
}

3
ฉันคิดว่าผู้คนลงคะแนนเพราะนี่เป็นเรื่องเกี่ยวกับ Django แต่คำตอบของคุณแก้ไขปัญหาการหมดเวลาเกตเวย์ของฉันกับ Rails + Unicorn :)
ZiggyTheHamster

4

ในhttpส่วน nginx (/etc/nginx/nginx.conf) เพิ่มหรือแก้ไข:

keepalive_timeout 300s

ในserverส่วน nginx (/etc/nginx/sites-available/your-config-file.com) เพิ่มบรรทัดเหล่านี้:

client_max_body_size 50M;
fastcgi_buffers 8 1600k;
fastcgi_buffer_size 3200k;
fastcgi_connect_timeout 300s;
fastcgi_send_timeout 300s;
fastcgi_read_timeout 300s;

ในphpไฟล์ในกรณีที่ 127.0.0.1:9000 (/etc/php/7.X/fpm/pool.d/www.conf) แก้ไข:

request_terminate_timeout = 300

ฉันหวังว่าจะช่วยคุณ


จะมีอะไร "เลวร้าย" เกิดขึ้นไหมถ้าฉันเปลี่ยนเวลาเป็น 10,000 วินาที?
utdev

ไม่เกิดอะไรขึ้น แต่บริการของคุณต้องใช้เวลามากขึ้น คุณสามารถเปลี่ยนค่าได้ตามที่คุณต้องการ
Jose Carlos Ramos Carmenates

1

ถ้าคุณใช้ยูนิคอร์น

ดูที่topเซิร์ฟเวอร์ของคุณ ยูนิคอร์นน่าจะใช้ CPU 100% ในขณะนี้ มีสาเหตุหลายประการของปัญหานี้

  • คุณควรตรวจสอบคำขอ HTTP ของคุณบางคำขออาจยากมาก

  • ตรวจสอบเวอร์ชั่นของยูนิคอร์น อาจเป็นคุณได้อัปเดตเมื่อเร็ว ๆ นี้และมีบางอย่างขาดหายไป


0

ในพร็อกซีเซิร์ฟเวอร์ตั้งค่าเช่นนั้น

location / {

                proxy_pass http://ip:80;                

                proxy_connect_timeout   90;
                proxy_send_timeout      90;
                proxy_read_timeout      90;

            }

ในเซิร์ฟเวอร์ php ตั้งค่าเช่นนั้น

server {
        client_body_timeout 120;
        location = /index.php {

                #include fastcgi.conf; //example
                #fastcgi_pass unix:/run/php/php7.3-fpm.sock;//example veriosn

                fastcgi_read_timeout 120s;
       }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.