NGINX: hết thời gian ngược dòng (110: Đã hết thời gian kết nối) trong khi đọc tiêu đề phản hồi từ thượng nguồn


130

Tôi có Puma chạy với tư cách là máy chủ ứng dụng ngược dòng và Rịa là cụm db nền của tôi. Khi tôi gửi yêu cầu giảm bản đồ dữ liệu cho khoảng 25K người dùng và trả lại từ Rịa cho ứng dụng, tôi gặp lỗi trong nhật ký Nginx:

hết thời gian ngược dòng (110: Đã hết thời gian kết nối) trong khi đọc tiêu đề phản hồi từ thượng nguồn

Nếu tôi truy vấn trực tiếp ngược dòng mà không có nginx proxy, với cùng một yêu cầu, tôi nhận được dữ liệu cần thiết.

Thời gian chờ Nginx xảy ra khi proxy được đặt.

**nginx.conf**

http {
    keepalive_timeout 10m;
    proxy_connect_timeout  600s;
    proxy_send_timeout  600s;
    proxy_read_timeout  600s;
    fastcgi_send_timeout 600s;
    fastcgi_read_timeout 600s;
    include /etc/nginx/sites-enabled/*.conf;
}

**virtual host conf**

upstream ss_api {
  server 127.0.0.1:3000 max_fails=0  fail_timeout=600;
}

server {
  listen 81;
  server_name xxxxx.com; # change to match your URL

  location / {
    # match the name of upstream directive which is defined above
    proxy_pass http://ss_api; 
    proxy_set_header  Host $http_host;
    proxy_set_header  X-Real-IP  $remote_addr;
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_cache cloud;
    proxy_cache_valid  200 302  60m;
    proxy_cache_valid  404      1m;
    proxy_cache_bypass $http_authorization;
    proxy_cache_bypass http://ss_api/account/;
    add_header X-Cache-Status $upstream_cache_status;
  }
}

Nginx có một loạt các chỉ thị hết thời gian. Tôi không biết nếu tôi thiếu một cái gì đó quan trọng. Bất cứ sự giúp đỡ nào cũng được đánh giá cao....


Nó chỉ nên hết thời gian sau 600s phải không? Bạn có thể giả mạo nó theo thời gian bằng cách thiết lập máy chủ tcp trên 127.0.0.1:3000 chỉ chấp nhận kết nối và không làm gì với chúng, để xem mất bao lâu. Nó sẽ là 600
giây

Câu trả lời:


46

Điều này xảy ra vì ngược dòng của bạn mất quá nhiều để trả lời yêu cầu và NGINX nghĩ rằng ngược dòng đã thất bại trong việc xử lý yêu cầu, do đó, nó phản hồi với một lỗi. Chỉ cần bao gồm và tăng proxy_read_timeout trong locationkhối cấu hình. Điều tương tự cũng xảy ra với tôi và tôi đã sử dụng thời gian chờ 1 giờ cho một ứng dụng nội bộ tại nơi làm việc:

proxy_read_timeout 3600;

Với điều này, NGINX sẽ đợi trong một giờ (3600 giây) để thượng nguồn của nó trả lại một cái gì đó.


6
Lưu ý rằng có proxy_read_timeouttrong phần http có thể không giúp đỡ. Tôi có proxy_passchỉ thị trong phần vị trí và chỉ ở đó proxy_read_timeoutcài đặt đã tạo ra sự khác biệt. (nginx 1.16.0)
JonnyJD

Có vẻ như để làm việc trong http / server / location đối với tôi ... có thể mọi thứ đã thay đổi :)
rogerdpack 18/11/19

38

Bạn nên luôn luôn không tăng thời gian chờ, tôi nghi ngờ thời gian phản hồi của máy chủ phụ trợ của bạn là vấn đề ở đây trong mọi trường hợp.

Tôi đã khắc phục vấn đề này bằng cách xóa cờ giữ kết nối và chỉ định phiên bản http theo câu trả lời tại đây: https://stackoverflow.com/a/36589120/479632

server {
    location / {
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   Host      $http_host;

        # these two lines here
        proxy_http_version 1.1;
        proxy_set_header Connection "";

        proxy_pass http://localhost:5000;
    }
}

Thật không may, tôi không thể giải thích lý do tại sao điều này hoạt động và không quản lý để giải mã nó từ các tài liệu được đề cập trong câu trả lời được liên kết vì vậy nếu có ai có lời giải thích tôi rất muốn nghe.


1
Tại sao bạn không điều chỉnh proxy_read_timeoutnếu bạn biết rằng proxy (nếu thậm chí đối với một URL cụ thể) yêu cầu nhiều thời gian xử lý hơn?
Josh M.

Chào! Tôi không còn nhớ chính xác vấn đề nữa nhưng tôi nghĩ nó không liên quan đến thời gian thực sự của url mà là thời gian chờ không được xử lý chính xác nếu không có các cài đặt này.
Almund

@magicbacon đây là năm trước nên tôi hầu như không nhớ trường hợp nào nữa, nhưng bạn đã thay đổi $http_hostphải không? Tôi đoán rằng sẽ không bay cho https. Cũng có thể cần cài đặt bổ sung để ủy quyền các yêu cầu https.
Almund

1 ... nhìn này như một hack vụng về nhưng thực chất đây là từ các tài liệu chính thức :) nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive Tôi có một vấn đề hơi khác nhau "thượng nguồn kết nối sớm khép kín trong khi đọc câu trả lời tiêu đề từ thượng nguồn "khi tôi sử dụng chỉ thị ngược dòng với keepalive và sử dụng hai dòng này dường như để sửa nó.
Karussell

1
@TimDavis Tôi thấy, có lẽ điều đó tốt hơn. Tôi đoán nó có thể phụ thuộc vào lưu lượng truy cập, như trong bài đăng này nói rằng nó cần thiết cho WebSockets: serverlab.ca/tutorials/linux/web-servers-linux/
Almund

26

Trước tiên, hãy tìm ra dòng ngược nào đang chậm bằng cách tham khảo tệp nhật ký lỗi nginx và điều chỉnh thời gian đọc phù hợp trong trường hợp của tôi, đó là fastCGI

2017/09/27 13:34:03 [error] 16559#16559: *14381 upstream timed out (110: Connection timed out) while reading response header from upstream, client:xxxxxxxxxxxxxxxxxxxxxxxxx", upstream: "fastcgi://unix:/var/run/php/php5.6-fpm.sock", host: "xxxxxxxxxxxxxxx", referrer: "xxxxxxxxxxxxxxxxxxxx"

Vì vậy, tôi phải điều chỉnh fastcgi_read_timeout trong cấu hình máy chủ của mình

 location ~ \.php$ {
     fastcgi_read_timeout 240;
     ...
 }

Xem: bài gốc


Dưới đây là một cách để thêm thông tin thời gian sự thất bại để xem có bao nhiêu bạn "cần" để tăng nó để: stackoverflow.com/questions/18627469/... FWIW
rogerdpack

10

Trong trường hợp của bạn, nó giúp tối ưu hóa một chút trong proxy hoặc bạn có thể sử dụng "# time out settings"

location / 
{        

  # time out settings
  proxy_connect_timeout 159s;
  proxy_send_timeout   600;
  proxy_read_timeout   600;
  proxy_buffer_size    64k;
  proxy_buffers     16 32k;
  proxy_busy_buffers_size 64k;
  proxy_temp_file_write_size 64k;
  proxy_pass_header Set-Cookie;
  proxy_redirect     off;
  proxy_hide_header  Vary;
  proxy_set_header   Accept-Encoding '';
  proxy_ignore_headers Cache-Control Expires;
  proxy_set_header   Referer $http_referer;
  proxy_set_header   Host   $host;
  proxy_set_header   Cookie $http_cookie;
  proxy_set_header   X-Real-IP  $remote_addr;
  proxy_set_header X-Forwarded-Host $host;
  proxy_set_header X-Forwarded-Server $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

Đối với tôi, nó có một sự khác biệt khi có các cài đặt này trong phần vị trí . Có họ trong http phần không giúp đỡ (pssibly vì tôi cũng đã có proxy_passtrong vị trí phần.
JonnyJD

Chính xác thì bạn đang tối ưu hóa điều gì với những tuyên bố này?
Vlad

9

Tôi nghĩ lỗi này có thể xảy ra vì nhiều lý do, nhưng nó có thể cụ thể đối với mô-đun bạn đang sử dụng. Ví dụ, tôi đã thấy điều này bằng cách sử dụng mô-đun uwsgi, vì vậy phải đặt "uwsgi_read_timeout".


2
Tôi nghĩ uwsgi_read_timeout 3600; proxy_send_timeout 3600; proxy_read_timeout 3600; làm việc cho tôi
tyan

9

Tôi khuyên bạn nên xem xét error_logs, cụ thể là phần thượng nguồn nơi nó hiển thị ngược dòng cụ thể đã hết thời gian.

Sau đó, dựa vào đó bạn có thể điều chỉnh proxy_read_timeout, fastcgi_read_timeouthoặc uwsgi_read_timeout.

Cũng đảm bảo rằng cấu hình của bạn đã được tải.

Thêm chi tiết tại đây Nginx ngược dòng đã hết thời gian (tại sao và cách khắc phục)


4

Như nhiều người khác đã chỉ ra ở đây, việc tăng cài đặt thời gian chờ cho NGINX có thể giải quyết vấn đề của bạn.

Tuy nhiên, việc tăng cài đặt thời gian chờ của bạn có thể không đơn giản như nhiều câu trả lời trong số này cho thấy. Bản thân tôi đã phải đối mặt với vấn đề này và đã cố gắng thay đổi cài đặt thời gian chờ của mình trong tệp /etc/nginx/nginx.conf , vì hầu hết mọi người trong các chủ đề này đều đề xuất. Điều này đã không giúp tôi một chút nào; không có thay đổi rõ ràng trong cài đặt thời gian chờ của NGINX. Bây giờ, nhiều giờ sau, cuối cùng tôi cũng đã khắc phục được vấn đề này.

Giải pháp nằm trong chuỗi diễn đàn này , và những gì nó nói là bạn nên đặt cài đặt thời gian chờ của mình trong /etc/nginx/conf.d/timeout.conf (và nếu tệp này không tồn tại, bạn nên tạo nó). Tôi đã sử dụng các cài đặt tương tự như được đề xuất trong chuỗi:

proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;

1

Tôi đã có cùng một vấn đề và kết quả là lỗi "mỗi ngày" trong bộ điều khiển rails. Tôi không biết tại sao, nhưng khi sản xuất, puma lại chạy lỗi và gây ra thông báo:

hết thời gian ngược dòng (110: Đã hết thời gian kết nối) trong khi đọc tiêu đề phản hồi từ thượng nguồn

Có lẽ bởi vì Nginx cố gắng lấy dữ liệu từ puma hết lần này đến lần khác. Điều buồn cười là lỗi gây ra thông báo hết thời gian ngay cả khi tôi đang gọi một hành động khác trong bộ điều khiển, do đó, một lỗi đánh máy sẽ chặn tất cả ứng dụng.

Kiểm tra tệp log / puma.stderr.log của bạn để xem đó có phải là tình huống không.


0

Từ phía chúng tôi, nó đã sử dụng spdy với bộ đệm proxy. Khi bộ đệm hết hạn, chúng tôi gặp lỗi này cho đến khi bộ đệm được cập nhật.


0

Hy vọng nó sẽ giúp được ai đó: Tôi gặp phải lỗi này và nguyên nhân là sự cho phép sai trong thư mục nhật ký cho phpfpm, sau khi thay đổi để phpfpm có thể ghi vào nó, mọi thứ đều ổn.


0

Để proxy_upstreamhết thời gian, tôi đã thử cài đặt ở trên nhưng chúng không hoạt động.

Cài đặt resolver_timeoutlàm việc cho tôi, biết rằng phải mất 30 giây để tạo thông báo hết thời gian ngược dòng. Ví dụ: me.atwibble.com không thể được giải quyết (110: Đã hết thời gian hoạt động) .

http://nginx.org/en/docs/http/ngx_http_core_module.html#resolver_timeout

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.