Chúng tôi đang phát triển song song dịch vụ web Python và trang web ứng dụng khách. Khi chúng tôi thực hiện một yêu cầu HTTP từ máy khách đến dịch vụ này, một cuộc gọi liên tục đặt ra một socket.error trong socket.py, ở chế độ đọc:104, Lỗi kết nối do lỗi ngang hàng thiết lập kết nối hoặc khi nào đóng kết quả ổ cắm trong RST thay vì FIN?
(104, 'Connection reset by peer')
Khi tôi nghe với Wireshark là "tốt" và "xấu "phản hồi trông rất giống nhau:
- Do kích thước của tiêu đề OAuth, yêu cầu được chia thành hai gói. Dịch vụ phản hồi cả hai với ACK
- Dịch vụ gửi phản hồi, một gói cho mỗi tiêu đề (HTTP/1.0 200 OK, sau đó là tiêu đề Ngày, v.v.). Máy khách phản hồi với ACK.
- (Yêu cầu tốt) máy chủ gửi FIN, ACK. Máy khách trả lời bằng FIN, ACK. Máy chủ phản hồi ACK.
- (Yêu cầu không hợp lệ) máy chủ gửi RST, ACK, máy khách không gửi phản hồi TCP, socket.error được đặt ở phía máy khách.
Cả dịch vụ web và ứng dụng khách đang chạy trên hộp x86-64 Gentoo Linux chạy glibc-2.6.1. Chúng tôi đang sử dụng Python 2.5.2 bên trong cùng virtual_env.
Ứng dụng khách là ứng dụng Django 1.0.2 đang gọi httplib2 0.4.0 để thực hiện yêu cầu. Chúng tôi đang ký yêu cầu với thuật toán ký OAuth, với mã thông báo OAuth luôn được đặt thành một chuỗi trống.
Dịch vụ đang chạy Werkzeug 0.3.1, đang sử dụng wsgiref.simple_server của Python. Tôi đã chạy ứng dụng WSGI thông qua wsgiref.validator mà không có vấn đề gì. Có vẻ như điều này sẽ dễ dàng để gỡ lỗi, nhưng khi tôi theo dõi qua một yêu cầu tốt về phía dịch vụ, nó trông giống như yêu cầu xấu, trong hàm socket._socketobject.close(), chuyển phương thức ủy nhiệm thành phương pháp giả. Khi gửi hoặc sendto (không thể nhớ được) phương pháp được tắt, FIN hoặc RST được gửi đi, và khách hàng bắt đầu xử lý.
"Đặt lại kết nối theo đồng đẳng" dường như đổ lỗi cho dịch vụ, nhưng tôi cũng không tin tưởng httplib2. Khách hàng có bị lỗi không?
** gỡ lỗi Hơn nữa - Hình như máy chủ trên Linux **
Tôi có một MacBook, vì vậy tôi cố gắng chạy dịch vụ trên một và trang web của khách hàng về việc khác. Máy khách Linux gọi máy chủ OS X mà không có lỗi (FIN ACK). Trình khách OS X gọi dịch vụ Linux bằng lỗi (RST ACK và một (54, 'Kết nối lại bằng peer')). Vì vậy, có vẻ như đó là dịch vụ đang chạy trên Linux. Có phải là x86_64 không? Một glibc xấu? wsgiref? Vẫn đang tìm kiếm ...
** Tiếp tục thử nghiệm - wsgiref trông flaky **
Chúng tôi đã đi vào sản xuất với Apache và mod_wsgi, và reset kết nối đã biến mất. Xem câu trả lời của tôi dưới đây, nhưng lời khuyên của tôi là để đăng nhập thiết lập lại kết nối và thử lại. Điều này sẽ cho phép máy chủ của bạn chạy OK trong chế độ phát triển và vững chắc trong sản xuất.
Câu hỏi thực sự là lý do máy chủ gửi yêu cầu RST. Khách hàng phải đặt lại kết nối và thông báo cho thông báo 'Kết nối lại bằng máy ngang hàng'. Vì vậy, tôi nghĩ rằng bạn đang đi đúng hướng –