Tôi có hai máy chủ Tomcat cần duy trì kết nối liên tục để cắt giảm việc bắt tay SSL. Một máy chủ (proxy) nằm trong DMZ trong khi máy chủ khác an toàn sau tường lửa khác. Proxy về cơ bản chỉ chạy một servlet đơn giản thực hiện kiểm tra tính hợp lệ trước khi chuyển tiếp các yêu cầu tới máy an toàn. Trên một yêu cầu intial các máy trao đổi chứng chỉ trước khi thực hiện công việc thực tế. Vì vậy, tôi muốn duy trì kết nối liên tục với thời gian chờ vài phút.Tomcat, HTTP Keep-Alive và HttpsUrlConnection của Java
Để nói chuyện với máy chủ bảo mật, servlet trên proxy sử dụng HttpsUrlConnection
. Tôi đã thiết lập WireShark và tôi đã nhận thấy rằng bất kể giá trị keepAliveTimeout
tôi đặt cho đầu nối trên máy bảo mật, kết nối TCP sẽ bị đóng sau khoảng 5 hoặc 10 giây. Con số này dường như phù hợp với những gì tôi đã đọc là thời gian chờ mặc định và cách Java xử lý HTTP Keep-Alive. Điều này link giải thích rằng Java vinh danh thời gian chờ Keep-Alive
nếu nó được gửi bởi máy chủ, nếu không nó sẽ sử dụng 5 giây (kết nối trực tiếp) hoặc 10 giây (kết nối proxy) trước khi đóng kết nối.
Điều tôi đang cố gắng tìm ra là làm cách nào để buộc Tomcat gửi tiêu đề Keep-Alive. Không, Connection: Keep-Alive
, nhưng Keep-Alive: timeout=x
.
Tôi đã thử nghiệm với máy chủ Apache HTTP và sửa đổi keepAliveTimeout
trong httpd.conf không làm cho tiêu đề Keep-Alive thay đổi giá trị thời gian chờ của nó. Hơn nữa Java không tôn trọng thời gian chờ này.
CẬP NHẬT (12/23/11): Sau khi chạy thêm một vài thử nghiệm, tôi đã thử thêm một số mã nhanh chóng và bẩn bằng cách sử dụng HttpClient (3.1) của Apache thay vì HttpsUrlConnection
. Có vẻ như HttpClient, khi được đặt để sử dụng Keep-Alive, chỉ cần đợi máy chủ đóng kết nối. Tôi không biết nó sẽ đợi bao lâu. Tôi đang quay để duy trì kết nối HTTP trong 3 đến 5 phút.
"Kết nối TCP bị đóng sau khoảng 5 hoặc 10 giây". Cuối cùng thì sao? Máy khách hoặc máy chủ? – EJP
Ứng dụng đã đóng ứng dụng khách. –
Bạn biết đấy, kịch bản bạn mô tả; Máy chủ Web trong các yêu cầu chuyển tiếp DMZ tới Trình quản lý ứng dụng phía sau một số tường lửa, thường được xử lý bằng Apache HTTPD trong DMZ thực hiện công cụ https và chuyển tiếp các yêu cầu tới Máy chủ ứng dụng Tomcat bằng trình kết nối AJP (http://tomcat.apache.org/tomcat-4.0 -doc/config/ajp.html). Đây là một cách thay thế để tránh chi phí SSL. –