Tôi đã bắt đầu sử dụng Nginx làm proxy ngược cho một nhóm máy chủ cung cấp một số loại dịch vụ.
Dịch vụ đôi khi có thể khá chậm (đôi khi chạy trên Java và JVM đôi khi bị kẹt trong "bộ sưu tập rác đầy đủ" có thể mất vài giây), vì vậy tôi đã đặt thành proxy_connect_timeout
2 giây, điều này sẽ cho Nginx đủ thời gian để tìm ra ra rằng dịch vụ bị kẹt trên GC và sẽ không đáp ứng kịp thời và nó sẽ chuyển yêu cầu đến một máy chủ khác.
Tôi cũng đã thiết lập proxy_read_timeout
để ngăn chặn proxy ngược bị kẹt nếu bản thân dịch vụ mất quá nhiều thời gian để tính toán phản hồi - một lần nữa, nó sẽ chuyển yêu cầu đến một máy chủ khác đủ miễn phí để trả lời phản hồi kịp thời.
Tôi đã chạy một số điểm chuẩn và tôi có thể thấy rõ rằng proxy_connect_timeout
hoạt động chính xác khi một số yêu cầu trả về chính xác thời gian đã hết cho thời gian chờ kết nối, vì dịch vụ bị kẹt và không chấp nhận kết nối đến (dịch vụ đang sử dụng Jetty dưới dạng nhúng thùng chứa servlet). Công cụ này proxy_read_timeout
cũng hoạt động, vì tôi có thể thấy các yêu cầu trả về sau khi hết thời gian được chỉ định ở đó.
Vấn đề là tôi đã dự kiến sẽ thấy một số yêu cầu hết thời gian chờ proxy_read_timeout + proxy_connect_timeout
hoặc gần hết thời gian đó, nếu dịch vụ bị kẹt và không chấp nhận kết nối khi Nginx cố gắng truy cập, nhưng trước khi Nginx có thể hết thời gian - nó sẽ được phát hành và bắt đầu xử lý, nhưng quá chậm và Nginx sẽ hủy bỏ vì hết thời gian đọc. Tôi tin rằng dịch vụ có những trường hợp như vậy, nhưng sau khi chạy một số điểm chuẩn, tổng cộng hàng triệu yêu cầu - tôi đã không thấy một yêu cầu duy nhất trả về bất cứ điều gì ở trên proxy_read_timeout
(đó là thời gian chờ lớn hơn).
Tôi sẽ đánh giá cao bất kỳ nhận xét nào về vấn đề này, mặc dù tôi nghĩ rằng đó có thể là do lỗi của Nginx (tôi vẫn chưa xem mã, vì vậy đây chỉ là giả định) rằng bộ đếm thời gian chờ không được đặt lại sau khi kết nối là thành công, nếu Nginx không đọc bất cứ thứ gì từ máy chủ ngược dòng.
proxy_read_timeout
không phải là "thời gian chờ toàn cầu", mà là giữa 2 thao tác đọc.
proxy_read_timeout + proxy_connect_timeout
.