Làm cách nào để ngăn chặn Hết thời gian chờ với FastCGI trên Nginx


203

Tôi đang chạy Django, FastCGI và Nginx. Tôi đang tạo ra một loại api mà ở đó ai đó có thể gửi một số dữ liệu qua XML mà tôi sẽ xử lý và sau đó trả lại một số mã trạng thái cho mỗi nút được gửi qua.

Vấn đề là Nginx sẽ ném Hết 504 Cổng nếu tôi mất quá nhiều thời gian để xử lý XML - Tôi nghĩ lâu hơn 60 giây.

Vì vậy, tôi muốn thiết lập Nginx để nếu bất kỳ yêu cầu nào khớp với vị trí / api sẽ không hết thời gian trong 120 giây. Những gì thiết lập sẽ thực hiện điều đó.

Những gì tôi có cho đến nay là:

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

Chỉnh sửa: Những gì tôi có không hoạt động :)


7
Bạn có thể đặt giá trị thời gian chờ thành "2m" thay vì "120".
Cenk Alti

1
Có vẻ như dữ liệu không được truyền phát ... tức là để một máy chủ bắt đầu phản hồi lại sau 60 giây trở lên dường như không thể chấp nhận được.
Adam Gent

Câu trả lời:


245

Thời gian chờ proxy là tốt, đối với proxy, không phải cho FastCGI ...

Các chỉ thị ảnh hưởng đến thời gian chờ FastCGI là client_header_timeout, client_body_timeoutsend_timeout.

Chỉnh sửa : Xem xét những gì tìm thấy trên nginx wiki, chỉ thị send_timeout chịu trách nhiệm thiết lập thời gian chờ phản hồi chung (có chút sai lệch). Đối với FastCGI, fastcgi_read_timeoutđiều đó đang ảnh hưởng đến thời gian chờ phản hồi của quá trình fastcgi .

HTH.


8
Đối với bất kỳ ai sử dụng uwsgi và gặp lỗi này, uwsgi_read_timeout 600; đã khắc phục sự cố của tôi.
Homer6

2
Câu hỏi của tôi ở đây sẽ là (với tư cách là một quản trị viên máy chủ nghiệp dư) tôi phải đi đâu để thay đổi điều này? tập tin httpd.conf?
jeffkee

2
Nếu nó giúp, tôi đã ở / etc / nginx / tại hệ thống DV của Media Temple.
jeffkee

Abdo đưa ra một cách tốt đẹp để gỡ lỗi. Nếu bạn vẫn gặp sự cố, bạn có thể cần tăng kích thước thư khách hàng tối đa trong nginx.conf (client_max_body_size ** M;)
Sam Grondahl

2
Tăng thời gian chờ imho không phải là một giải pháp thích hợp.
JazzCat

24

Đối với những người sử dụng nginx với kỳ lân và đường ray, rất có thể thời gian chờ là trong unicorn.rb tệp

đặt thời gian chờ lớn trong unicorn.rb

timeout 500

nếu bạn vẫn gặp phải sự cố, hãy thử có fail_timeout = 0 trong dòng ngược của bạn trong nginx và xem điều này có khắc phục được sự cố của bạn không. Điều này là cho mục đích gỡ lỗi và có thể nguy hiểm trong môi trường sản xuất.

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

3
Tôi nghĩ rằng mọi người đã đánh giá thấp nó bởi vì đây là về Django, tuy nhiên câu trả lời của bạn đã khắc phục vấn đề hết thời gian chờ cổng của tôi với Rails + Unicorn :)
ZiggyTheroulette

4

Trong httpphần nginx (/etc/nginx/nginx.conf) thêm hoặc sửa đổi:

keepalive_timeout 300s

Trong serverphần nginx (/etc/nginx/sites-av Available / your-config-file.com) thêm các dòng sau:

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;

Trong phptệp trong trường hợp 127.0.0.1:9000 (/etc/php/7.X/fpm/pool.d/www.conf) sửa đổi:

request_terminate_timeout = 300

Tôi hy vọng giúp bạn.


Có điều gì "xấu" xảy ra nếu tôi thay đổi thời gian thành 10000 giây không?
utdev

Không xảy ra không có gì xấu, nhưng dịch vụ của bạn chờ thêm thời gian. Bạn có thể thay đổi giá trị như bạn muốn.
Jose Carlos Ramos Carmenates

1

Nếu bạn sử dụng kỳ lân.

Nhìn topvào máy chủ của bạn. Unicorn có khả năng đang sử dụng 100% CPU ngay bây giờ. Có một số lý do của vấn đề này.

  • Bạn nên kiểm tra các yêu cầu HTTP của bạn, một số yêu cầu có thể rất khó.

  • Kiểm tra phiên bản kỳ lân. Có thể bạn đã cập nhật nó gần đây và một cái gì đó đã bị hỏng.


0

Trong proxy máy chủ được đặt như thế

location / {

                proxy_pass http://ip:80;                

                proxy_connect_timeout   90;
                proxy_send_timeout      90;
                proxy_read_timeout      90;

            }

Trong máy chủ php đặt như thế

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;
       }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.