2015-03-18 21 views
5

Tôi đang xây dựng API trên Rails phiên bản 4.1.7/Nginx đáp ứng yêu cầu từ một ứng dụng iOS. Chúng tôi đang nhìn thấy một số bộ nhớ đệm kỳ lạ trên máy khách và chúng tôi nghĩ rằng nó có một cái gì đó để làm với một sự khác biệt nhỏ trong phản ứng mà Rails đang gửi trở lại. Câu hỏi của tôi ...Khi nào Rails phản hồi bằng 'chuyển mã hóa' và 'chiều dài nội dung'?

1) Tôi muốn hiểu tại sao, đối với cùng một yêu cầu (chỉ với giá trị tiêu đề ủy quyền đã thay đổi), Rails gửi lại transfer-encoding: chunked đôi khi và Content-Length: <number> đôi khi? Tôi nghĩ rằng có thể nó có liên quan đến kích thước phản hồi, nhưng trong các phản hồi ví dụ có các tiêu đề tôi đã dán bên dưới, dữ liệu được trả về trong cơ thể cũng giống như vậy.

2) Có cách nào để ép buộc sử dụng Content-Length không? Chúng tôi nghĩ rằng điều đó sẽ khắc phục các sự cố bộ nhớ đệm trong ứng dụng iOS của chúng tôi.

Response # 1

HTTP/1.1 200 OK 
Cache-Control: max-age=0, private, must-revalidate 
Content-Type: application/json; charset=utf-8 
Date: Wed, 18 Mar 2015 00:59:31 GMT 
ETag: "86f277ea63295460d4f3bed9a073eaa2" 
Server: nginx/1.6.2 
Status: 200 OK 
X-Content-Type-Options: nosniff 
X-Frame-Options: SAMEORIGIN 
X-Request-Id: dd36f139-1986-4da6-9645-4438d41e74b0 
X-Runtime: 0.123865 
X-XSS-Protection: 1; mode=block 
transfer-encoding: chunked 
Connection: keep-alive 

Yêu cầu # 2

HTTP/1.1 200 OK 
Cache-Control: max-age=0, private, must-revalidate 
Content-Type: application/json; charset=utf-8 
Date: Wed, 18 Mar 2015 00:59:36 GMT 
ETag: "86f277ea63295460d4f3bed9a073eaa2" 
Server: nginx/1.6.2 
Status: 200 OK 
X-Content-Type-Options: nosniff 
X-Frame-Options: SAMEORIGIN 
X-Request-Id: 0cfd7705-157b-41b5-aa36-739bc6f8302e 
X-Runtime: 0.092672 
X-XSS-Protection: 1; mode=block 
Content-Length: 2234 
Connection: keep-alive 
+0

Rails có gửi phản hồi thứ hai hay nginx không? Đó là, nginx đang làm bộ nhớ đệm của riêng nó? –

+0

@MichaelHampton hmm ... Tôi sẽ xem xét và báo cáo lại ... – readyornot

Trả lời

1

Cả hai phản ứng có giá trị theo HTTP 1.1, vì vậy bạn cần phải sửa chữa mã khách hàng của bạn mà nó có thể xử lý cả hai. Đó là một ý tưởng tồi để cố gắng sửa chữa máy chủ để nó hoạt động theo cách nó không kích hoạt một lỗi trong máy khách. Phiên bản tiếp theo của nginx có thể hoạt động khác nhau, người dùng của bạn thậm chí có thể có proxy thay đổi việc chuyển giao, có thể chỉ khi họ chuyển vùng và sử dụng một nhà cung cấp khác.

Nếu bạn muốn in một số ngón tay trên tiêu đề, tiêu đề ETAG có thể giúp bạn, vì thẻ ETAG sẽ không đổi khi nội dung của phản hồi không thay đổi, bất kể chuyển khoản.

Máy chủ thường gửi theo khối khi nó gọi một trang động, vì nó không cần tạo bộ đệm cho toàn bộ trang và đợi cho đến khi tất cả các trang được tạo.

Máy chủ thường gửi phản hồi trong một lần nếu bộ đệm đã có bộ đệm, ví dụ vì bộ đệm nằm trong bộ nhớ cache hoặc nội dung nằm trên tệp và không lớn. Việc gửi đi một lần hiệu quả hơn, mặt khác, một bản sao bổ sung của dữ liệu để đệm đầu ra cần nhiều bộ nhớ hơn và kém hiệu quả hơn. Vì vậy, máy chủ thậm chí có thể quyết định điều này theo bộ nhớ có sẵn.

+0

OK, cảm ơn phản hồi! – readyornot

Các vấn đề liên quan