[Nginx] Cách đánh bại reply_status = 0

Một bài viết thuộc danh mục “sidenotes”.

TL: DR:

http2_max_field_size 8k; # всех спасет!

Trên một trong các dự án, sau khi thay đổi một số logic bên trong của phần phụ trợ, tôi bắt đầu quan sát thấy một mã phản hồi lạ trong nhật ký, cụ thể là 0. Trong nhật ký, nó trông giống như thế này:

{
  "timestamp": "2020-01-17T08:41:51+00:00",
  "remote_addr": "zzz.zzz.zzz.zzz",
  "request_time": 0,
  "upstream_response_time": "",
  "upstream_header_time": "",
  "http_accept_language": "-language",
  "response_status": 0,
  "request": "",
  "host": "example.com",
  "upstream_addr": "",
  "http_referrer": "",
  "request_length": 5854,
  "bytes_sent": 0,
  "http_user_agent": ""
}


Đọc tài liệu và tìm kiếm trên Google về chủ đề này hoàn toàn không mang lại kết quả gì - bởi vì... Người ta nói rằng hiện tượng này xảy ra khi máy khách đóng kết nối mà không chuyển tiêu đề. Chà, và nhiều thứ kỳ lạ khác với kích thước bộ đệm cho wsgi_, trong trường hợp của chúng tôi không phù hợp với từ “theo bất kỳ cách nào”.

Nói chung, chúng tôi quyết định rằng vấn đề không phải là vấn đề, có tính đến thực tế là ở khối lượng của chúng tôi, nó không hề nghiêm trọng chút nào.

Chính xác cho đến khi tôi bối rối trước vấn đề sau: trong một số trường hợp, các liên kết mở mà không gặp vấn đề gì qua http, nhưng hoàn toàn từ chối hoạt động qua https, tạo ra điều tuyệt vời: Kết nối #0 đến máy chủ example.com vẫn nguyên vẹn
Curl: (52) Trả lời trống từ máy chủ

Trong nhật ký, chúng tôi chỉ có thể theo dõi nội dung này bằng IP - không có yêu cầu hoặc bất kỳ dữ liệu nào khác, như có thể thấy từ ví dụ trên. Chỉ có trạng thái khét tiếng là 0, nhưng tôi biết rằng mình không làm gián đoạn yêu cầu! Tôi bắt đầu tìm hiểu xem điều gì có thể sai. Và mọi thứ hóa ra rất đơn giản:

nghe 443 ssl http2 tồn đọng=8192;

Chà, nếu bạn sử dụng http2 cho các kết nối ssl, thì việc định cấu hình bộ đệm yêu cầu là chưa đủ mà chúng còn phải được định cấu hình trong ngx_http_v2_module, cụ thể là:

Синтаксис:	http2_max_field_size размер;
Умолчание:	http2_max_field_size 4k;
Контекст:	http, server

Giới hạn kích thước tối đa của tiêu đề yêu cầu được nén bằng HPACK. Ràng buộc áp dụng như nhau cho cả tên và giá trị. Nếu sử dụng mã hóa Huffman, kích thước thực tế của chuỗi tên và giá trị được giải nén có thể lớn hơn. Giới hạn mặc định phù hợp với hầu hết các truy vấn.

Nói chung, đây là nó. Và tại sao tất cả? Bởi vì độ dài của liên kết dài - dài hơn 4k tương tự.

Ví dụ: bằng cách đặt nó ở mức 8kb (hoặc nhiều nhất có thể là đủ), chúng tôi sẽ giải quyết được vấn đề.
Vì vậy, nó đi.

Nguồn: www.habr.com

Thêm một lời nhận xét