Ngăn nginx 504 Gateway hết thời gian sử dụng PHP set_time_limit ()


116

Tôi nhận được thông báo 504 thời gian chờ từ nginx khi tập lệnh PHP của tôi đang chạy lâu hơn bình thường. set_time_limit(0)dường như không ngăn cản điều đó! Nó không hoạt động khi chạy php5-fpm trên nginx? Nếu vậy, cách thích hợp để thiết lập thời hạn là gì?

Lỗi:

504 Gateway Time-out
nginx/1.2.7

Câu trả lời:


193

Có một số cách để bạn có thể đặt thời gian chờ cho php-fpm. Trong /etc/php5/fpm/pool.d/www.conftôi đã thêm dòng này:

request_terminate_timeout = 180

Ngoài ra, trong /etc/nginx/sites-available/defaulttôi đã thêm dòng sau vào khối vị trí của máy chủ được đề cập:

fastcgi_read_timeout 180;

Toàn bộ khối vị trí trông như thế này:

location ~ \.php$ {
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_read_timeout 180;
    include fastcgi_params;
} 

Bây giờ chỉ cần khởi động lại php-fpm và nginx và sẽ không còn thời gian chờ cho các yêu cầu mất ít hơn 180 giây.


2
ai trong trường hợp khác đang tự hỏi, mặc định cho mỏ (nginx + php5-fpm) là 60 giây, vì vậy nếu bạn thấy "thời gian chờ cửa ngõ" cho một kịch bản @ 60 giây, "fastcgi_read_timeout" thiết lập nên được bổ sung
Michael Nguyễn

1
Tôi đã cố gắng tìm ra điều này trong nhiều ngày, và câu trả lời của @ pymkin là điều phù hợp với tôi. Đối với những người nghiệp dư khác như tôi đang tự hỏi làm thế nào để khởi động lại nginx và php5-fpm, hãy chạy hai lệnh sau: sudo service nginx restart & sudo service php5-fpm restart. Điều duy nhất tôi làm khác là tôi đã áp dụng các cài đặt này cho chỉ một trong số các trang web của tôi thay vì cấu hình cho tất cả các trang web trên máy chủ của tôi.
Pamela

4
Đáng buồn thay, bất kể tôi đã đặt fastcgi_read_timeoutgì trong locationkhối đó, nó vẫn hết thời gian chờ sau 60 giây.
Spencer Williams

đây phải là câu trả lời được chấp nhận. đã thử rất nhiều giải pháp nhưng chỉ cách này hoạt động. Tôi đang sử dụng laravel homestead và gặp lỗi 504 cổng hết thời gian chờ và điều này đã khắc phục được.
Anbu369

Nếu sử dụng Laravel, bạn cần đặt điều này trong locationkhối xử lý tập lệnh php, thay vì docroot.
Ryan DuVal

50

Hãy thử liên kết này , nó có một giải pháp tốt hơn về cách sửa lỗi này. Vì vậy, các bước là:

  1. Mở nginx.conftệp của bạn nằm trong /etc/nginxthư mục.
  2. Thêm đoạn mã dưới đây vào http {phần:

    client_header_timeout 3000;
    client_body_timeout 3000;
    fastcgi_read_timeout 3000;
    client_max_body_size 32m;
    fastcgi_buffers 8 128k;
    fastcgi_buffer_size 128k;

    Lưu ý: Nếu nó đã có, hãy thay đổi các giá trị theo.

  3. Tải lại Nginx và php5-fpm.

    $ service nginx reload
    $ service php5-fpm reload

    Nếu lỗi vẫn còn, hãy xem xét việc tăng các giá trị.


1
Điều này không giúp tìm ra nguyên nhân, nó chỉ tăng lần cho đến khi lỗi. Nhưng tốt hơn là nên tìm giải pháp tại sao nó tải quá lâu. Khi ở trên localhost, tôi là khách hàng duy nhất và nó tải quá lâu, điều đó không tốt chút nào khi phải chờ trong khi phát triển.
Darius.V

16
Câu hỏi không phải là hỏi nguyên nhân của script chậm, mà là hỏi một cách để khiến máy chủ đợi lâu hơn. Đôi khi bạn cần chạy các tập lệnh đặc biệt thực hiện các tác vụ mất nhiều thời gian, và đó không phải là một điều xấu.
orrd

Cập nhật (ở trên) liên kết: codetweet.com/nginx/…
nadavkav

2
Đối với những người có thể đang tự hỏi điều gì sẽ mất quá nhiều thời gian một cách hợp pháp, đó có thể là một tập lệnh cài đặt từ giao diện web cố gắng tạo kết nối với cơ sở dữ liệu và sau đó tạo nhiều bảng ban đầu và điền vào nó bằng dữ liệu .. đó có thể mất khá nhiều thời gian trước khi có phản hồi.
Tất cả lập

Hãy nhớ rằng các cài đặt chung này sẽ bị ghi đè bởi cài đặt từng trang web trong /etc/nginx/sites-available/mysite.com.
Mac

11

Bạn không thể sử dụng PHP để ngăn thời gian chờ do nginx cấp.

Để cấu hình nginx để có thêm thời gian, hãy xem proxy_read_timeoutchỉ thị .


Điều này đã giải quyết vấn đề mà tôi đang gặp phải trong đó 504s sẽ bắt đầu hiển thị trên hộp vagrant của tôi (sử dụng vaprobash).
Andy Fleming

2
Tôi tin rằng câu trả lời này chỉ áp dụng nếu bạn chỉ sử dụng Nginx làm máy chủ proxy. Điều này sẽ không hoạt động nếu bạn đang sử dụng Nginx làm máy chủ web chính của mình (với PHP-FPM).
thứ ba

10

Câu trả lời đúng là tăng fastcgi_read_timeout trong cấu hình Nginx của bạn.
Đơn giản như vậy!


7
 sudo nano /etc/nginx/nginx.conf

Thêm các biến này vào tệp nginx.conf:

http {  
  # .....
  proxy_connect_timeout       600;
  proxy_send_timeout          600;
  proxy_read_timeout          600;
  send_timeout                600;
}

Và sau đó khởi động lại:

service nginx reload

4

Có ba loại thời gian chờ có thể xảy ra trong trường hợp này. Có thể thấy rằng mỗi câu trả lời chỉ tập trung vào một khía cạnh của những khả năng này. Vì vậy, tôi nghĩ phải viết nó ra để ai đó ghé thăm nơi đây trong tương lai không cần phải kiểm tra ngẫu nhiên từng câu trả lời và nhận được thành công mà không cần biết câu trả lời nào hiệu quả.

  1. Hết thời gian chờ yêu cầu từ người yêu cầu - Cần đặt tiêu đề thời gian chờ (xem cấu hình tiêu đề trong thư viện yêu cầu)
  2. Hết thời gian chờ nginx trong khi thực hiện yêu cầu (trước khi chuyển tiếp đến máy chủ được ủy quyền), ví dụ: Tệp lớn đang được tải lên
  3. Hết thời gian chờ sau khi chuyển tiếp đến máy chủ được ủy quyền , máy chủ không trả lời lại nginx kịp thời. ví dụ: Các tập lệnh tốn thời gian chạy tại máy chủ

Vì vậy, các bản sửa lỗi cho từng vấn đề như sau.

  1. đặt tiêu đề thời gian chờ ví dụ: trong ajax

$.ajax({
    url: "test.html",
    error: function(){
        // will fire when timeout is reached
    },
    success: function(){
        //do something
    },
    timeout: 3000 // sets timeout to 3 seconds
});

  1. nginx Client timeout

    http{
         #in seconds
        fastcgi_read_timeout 600;
        client_header_timeout 600;
        client_body_timeout 600;
     }
  2. thời gian chờ của máy chủ ủy quyền nginx

    http{
      #Time to wait for the replying server
       proxy_read_timeout 600s;
    
    }

Vì vậy, hãy sử dụng cái mà bạn cần. Có thể trong một số trường hợp, bạn cần tất cả các cấu hình này. Tôi cần.


1

Bạn cần thêm chỉ thị nginx bổ sung (cho ngx_http_proxy_module) vào nginx.conf, ví dụ:

proxy_read_timeout 300;

Về cơ bản, lệnh nginx proxy_read_timeoutthay đổi thời gian chờ proxy, FcgidIOTimeoutdành cho các tập lệnh không hoạt động quá lâu vàFcgidBusyTimeout dành cho các tập lệnh mất quá nhiều thời gian để thực thi.

Ngoài ra, nếu bạn đang sử dụng ứng dụng FastCGI, hãy tăng các tùy chọn sau:

FcgidBusyTimeout 300
FcgidIOTimeout 250

Sau đó tải lại nginx và PHP5-FPM.

Plesk

Trong Plesk, bạn có thể thêm nó vào Cài đặt Máy chủ Web dưới Chỉ thị nginx Bổ sung .

Đối với FastCGI, hãy kiểm tra Cài đặt Máy chủ Web trong Chỉ thị bổ sung cho HTTP .

Xem: Làm thế nào để khắc phục sự cố hết thời gian FastCGI trong Plesk?


Không phải FcgidBusyTimeoutbiến chỉ tồn tại cho Apache?
Slavik

0

Vì bạn đang sử dụng php-fpm, bạn nên tận dụng fastcgi_finish_request () để xử lý các yêu cầu mà bạn biết có thể mất nhiều thời gian hơn.


-1

Việc sử dụng set_time_limit(0)vô ích khi sử dụng php-fpm hoặc trình quản lý quy trình tương tự.

Điểm mấu chốt là không nên sử dụng set_time_limitkhi sử dụng php-fpm, để tăng thời gian chờ thực thi của bạn, hãy xem hướng dẫn này .


8
có thể cung cấp một số giải thích về câu trả lời ở đây cũng như câu trả lời này có thể trở nên khó hiểu nếu liên kết hết hạn.
Lakshmi

-7

Tôi giải quyết vấn đề này với cấu hình APACHE! Tất cả các phương pháp (trong chủ đề này) đều không chính xác đối với tôi ... Sau đó, tôi thử cấu hình chanche apache:

Timeout 3600

Sau đó, kịch bản của tôi đã hoạt động!


5
Câu hỏi nêu rõ nginx, nếu bạn gặp sự cố với apache, bạn nên tìm kiếm nó.
hogan

Câu hỏi nằm trên Nginx và php-fpm không phải Apache.
Kevin Kaburu
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.