Làm cách nào để tắt thời gian chờ cho nginx?


47

Trên một máy phát triển cục bộ, tôi có một proxy ngược nginx như vậy:

server {
  listen 80;
  server_name myvirtualhost1.local;
  location / {
    proxy_pass http://127.0.0.1:8080;
}

server {
  listen 80;
  server_name myvirtualhost2.local;
  location / {
    proxy_pass http://127.0.0.1:9090;
}

Tuy nhiên, nếu tôi gỡ lỗi ứng dụng của mình, phản hồi có thể bị trì hoãn trong một khoảng thời gian vô hạn, nhưng sau 30 giây tôi nhận được:

504 Gateway Time-out

như một phản ứng.

Làm cách nào tôi có thể vô hiệu hóa thời gian chờ và để proxy ngược của tôi chờ phản hồi mãi mãi? Và tôi thích cài đặt là toàn cầu, do đó tôi không phải đặt nó cho mỗi proxy.


1
Xem xét bắt đầu một công việc nền và để người dùng kiểm tra trạng thái của nó sau này.
Michael Hampton

Câu trả lời:


61

Có thể không thể vô hiệu hóa nó, nhưng một cách giải quyết khả thi là tăng thời gian thực hiện. Trên một trang web hướng dẫn nginx , nó đã được viết:

Nếu bạn muốn tăng giới hạn thời gian cho tất cả các trang web trên máy chủ của mình, bạn có thể chỉnh sửa nginx.conftệp chính :

vim /etc/nginx/nginx.conf

Thêm phần sau vào phần http {..}

http {
     fastcgi_read_timeout 300;
     proxy_read_timeout 300;
}

và tải lại cấu hình nginx ':

sudo service nginx reload

Tôi đã sử dụng một giá trị khá lớn không có khả năng xảy ra, tức là 999999hoặc sử dụng các đơn vị thời gian , đến một ngày qua 1d.

Coi chừng việc đặt giá trị thành 0sẽ gây ra lỗi hết thời gian chờ cổng.


3
Kính gửi downvoter ngẫu nhiên, một nhận xét về những gì xấu về thực hành này sẽ là tốt đẹp.
k0pernikus

7
@kb. Thật buồn cười khi tôi là OP và chỉ đăng một cách giải quyết khả thi nhất như một câu trả lời, trong khi chờ đợi một giải pháp thực sự ^^
k0pernikus

2
Haha, tôi hoàn toàn nhớ rằng bạn là OP. Nhưng câu trả lời của bạn là câu trả lời đúng, bạn có thể làm cho nó rõ ràng hơn nữa (đối với những người làm việc trong tương lai như tôi) rằng không có cách nào để vô hiệu hóa nó. =)
kb.

5
Cảm ơn thông tin về việc 0không làm việc! Lưu ý rằng bạn có thể chỉ định các đơn vị thời gian với các hậu tố có thể đọc được , vì vậy bạn có thể sử dụng một giá trị như 1d.
Tên thật được điều chỉnh lại vào

3
Tôi đã thêm cả proxy_connect_timeout 600;tệp đó và vào tệp nginx.conf, nhưng thời gian chờ vẫn còn trên 60 giây. Bất cứ điều gì khác tôi nên thử?
andreszs

9

Nếu bạn đang sử dụng AWS và Load Balancer, bạn nên chỉnh sửa thời gian chờ. Tôi nghĩ mặc định là 60 giây


Tôi hiểu lý do tại sao điều này đã được bỏ phiếu nhưng có lẽ nếu câu trả lời được cập nhật để giải thích trường hợp sử dụng của nó, nó sẽ hữu ích hơn. Mặc dù điều này không đi đến trả lời OP, nhưng có một điều hữu ích để xem xét nếu bạn đang sử dụng ELB vì có giới hạn về thời gian họ sẽ giữ kết nối mở.
doz87

@ doz87 vâng, đó chỉ là thứ cần xem xét
szeljic

Điều này thực sự đáng để kiểm tra đặc biệt là trong trường hợp của tôi khi làm việc với Magento theo AWS. Điểm tốt @szeljic
vnpnlz

Cảm ơn bạn, điều này hiệu quả với tôi vì tôi sử dụng bộ cân bằng tải AWS để phân phối cho phiên bản EC2 của mình
Vũ Thành Tâm

Điều này xứng đáng với tất cả các ưu đãi - bất kỳ người dùng AWS nào vẫn sẽ bị giới hạn trong 60 giây bất kể cài đặt NGINX của họ mà không có điều này
Aerald

4

Tôi đã chiến đấu với lỗi hết thời gian nginx 502 và không thể giải quyết vấn đề. Tuy nhiên, nó đã xảy ra là gunicorn gây ra lỗi hết thời gian. Vì vậy, bạn cũng có thể cần kiểm tra cài đặt fastcgi của mình.

Đối với gunicorn, đó là:

gunicorn wsgi:application --timeout 300
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.