2012-02-10 23 views
5

Tóm tắt/Quesiton:Tôi có thể sử dụng Apache mod_proxy làm hồ bơi kết nối, theo MPM của Prefork không?

Tôi có Apache đang chạy với MPM Prefork, chạy php. Tôi đang cố gắng sử dụng Apache mod_proxy để tạo một proxy ngược lại mà tôi có thể định tuyến lại các yêu cầu của mình thông qua, để tôi có thể sử dụng Apache để thực hiện kết nối tổng hợp. Ví dụ impl:

trong httpd.conf:

SSLProxyEngine On 
ProxyPass /test_proxy/ https://destination.server.com/ min=1 keepalive=On ttl=120 

nhưng khi tôi chạy thử nghiệm của tôi, đó là lệnh sau đây trong một vòng lặp:

curl -G 'http://localhost:80/test_proxy/testpage' 

nó dường như không để tái sử dụng các kết nối.

Sau khi đọc thêm, có vẻ như tôi không nhận được chức năng của hồ bơi kết nối vì tôi đang sử dụng MPM của Prefork thay vì MPM của người lao động. Vì vậy, mỗi khi tôi thực hiện một yêu cầu cho proxy, nó quay một quy trình mới với hồ bơi kết nối của riêng mình (kích thước một), thay vì sử dụng công nhân duy nhất duy trì hồ bơi riêng của mình. Đó là giải thích đúng không?


thông tin Bối cảnh:

Có một máy chủ bên ngoài mà tôi đưa ra yêu cầu để, trên https, cho mỗi trang đánh vào một trang web mà tôi chạy.

Thương lượng bắt tay SSL đang tốn kém, vì tôi sử dụng php và dường như không hỗ trợ kết nối tổng hợp - nếu tôi nhận được 300 yêu cầu trang tới trang web của mình, họ phải thực hiện bắt tay 300 SSL với máy chủ bên ngoài các kết nối sẽ bị đóng sau khi mỗi tập lệnh kết thúc chạy. Vì vậy, tôi đang cố gắng sử dụng một proxy ngược theo Apache để hoạt động như một hồ bơi kết nối, để duy trì các kết nối trên các quy trình php vì vậy tôi không phải thực hiện bắt tay SSL thường xuyên như vậy.

Nguồn rằng đã cho tôi ý tưởng này:

Trả lời

1

prefork vẫn có thể bơi 1 kết nối mỗi máy chủ backend cho mỗi quá trình.

Đầu tiên không nhất thiết phải tạo quy trình mới cho mỗi yêu cầu giao diện người dùng, quy trình máy chủ được "gộp" và hành vi phụ thuộc vào ví dụ: MinSpareServers/MaxSpareServers và bạn bè.

Để tối đa hóa tần suất một quy trình prefork sẽ có kết nối phụ trợ cho bạn, hãy tránh các trình thu phóng tối đa hoặc thấp hoặc các máy thu nhỏ rất cao vì chúng sẽ dẫn đến các quy trình "mới" chấp nhận kết nối mới.

Bạn có thể đăng nhập% P trong chỉ thị LogFormat của mình để giúp nhận ý tưởng xem các quy trình thường xuyên được sử dụng lại hay không.

+0

Cảm ơn câu trả lời. Điều này đã giúp tôi rất nhiều để hiểu liệu kết nối tổng hợp thậm chí có thể sử dụng MPM_prefork. Quảng cáo tài liệu Apache ngay cả khi đăng nhập mod_proxy ở cấp độ gỡ lỗi không phải là rất hùng hồn về việc liệu các kết nối có được sử dụng lại hay không. Trong trường hợp của tôi, hóa ra nó không phải là Proxy ngược nhưng máy chủ phụ trợ là Vấn đề. Nó phát hiện trình duyệt là một MSIE bằng cách kiểm tra tiêu đề HTTP 'User-Agent' và do đó đóng kết nối SSL ở cuối mỗi yêu cầu. Đó là lý do tại sao proxy ngược lại không bao giờ tái sử dụng các kết nối SSL đến máy chủ phụ trợ. – BertNase

+0

500 là của bạn, như bình luận của bạn đã giúp tôi hiểu những gì đang xảy ra, Tôi sẽ đăng câu trả lời để chỉ ra, những gì đã giải quyết các vấn đề trong trường hợp của tôi. – BertNase

2

Trước hết, phương pháp thử nghiệm của bạn không thể chứng minh kết nối tổng hợp vì mỗi cuộc gọi, một khách hàng curl được sinh ra và sau đó nó chết. Giống như những người chết không nói nhiều, một quá trình chết không thể giữ một kết nối còn sống.

Bạn có khách hàng làm phiền máy chủ proxy của bạn.

Client ====== (A) =====> ProxyServer 

Hãy gọi kết nối này A. Máy chủ proxy của bạn không có gì, nó chỉ là một chương trình biểu diễn. Các máy chủ đẹp trai và chăm chỉ là rất khiêm tốn mà ông ẩn đằng sau.

Client ====== (A) =====> ProxyServer ====== (B) =====> WebServer 

Ở đây, nếu tôi không sai, kết nối bảo mật là A, không phải B?

Lặp lại điểm đầu tiên của tôi, trong bài kiểm tra của bạn, bạn đang tạo một ứng dụng khách riêng cho từng yêu cầu. Mỗi khách hàng cần một kết nối riêng biệt. Kết nối là điều xảy ra giữa ít nhất hai bên. Một bên lá và kết nối bị mất.

Được rồi, chúng ta hãy quên curl ngay bây giờ và cùng nhau xem những gì chúng tôi thực sự muốn làm.

Chúng tôi muốn có SSL trên A và chúng tôi muốn Bên giao thông càng nhanh càng tốt. Với mục đích này, chúng tôi đã tách ra bên B để nó không làm cho A chậm hơn nữa, đúng không?

Kết nối tổng hợp? Không có những thứ như kết nối tổng hợp tại A. Mỗi khách hàng đến và đi làm cho rất nhiều tiếng ồn. Điều duy nhất có thể giúp bạn giảm tiếng ồn này là "Keep-Alive" có nghĩa là giữ kết nối còn sống từ một máy khách trong một khoảng thời gian ngắn để khách hàng này có thể yêu cầu các tệp khác sẽ được yêu cầu này yêu cầu . Khi chúng ta hoàn thành, chúng ta đã xong.

Đối với các kết nối trên B, các kết nối sẽ được gộp lại; nhưng điều này sẽ không mang lại cho bạn bất kỳ hiệu suất nào kể từ khi cài đặt một máy chủ, bạn không có phần này của quá trình tạo tiếng ồn.

Làm cách nào để chúng tôi giúp hệ thống này chạy nhanh hơn?

Nếu hai máy chủ này nằm trên cùng một máy, chúng ta nên loại bỏ máy chủ show-off và tiếp tục với máy chủ web chăm chỉ của chúng tôi. Nó cho biết thêm rất nhiều công việc không cần thiết cho hệ thống.

Nếu đây là những máy riêng biệt, thì bạn đang trở nên tốt đẹp với máy chủ web bằng cách lấy ít nhất là sự hấp thụ (đối với ssl) từ anh chàng tội nghiệp này. Tuy nhiên, bạn thậm chí còn đẹp hơn.

Nếu bạn muốn tiếp tục trên Apache, hãy chuyển sang mpm_worker từ mpm_prefork. Trong trường hợp có hơn 300 yêu cầu đồng thời, điều này sẽ hoạt động tốt hơn nhiều. Tôi thực sự không có ý tưởng về khả năng của phần cứng của bạn; nhưng nếu xử lý 300 yêu cầu là khó khăn, tôi tin rằng sự thay đổi nhỏ này sẽ giúp hệ thống của bạn rất nhiều.

Nếu bạn muốn có một hệ thống thậm chí còn nhẹ hơn, hãy xem nginx là một thay thế cho Apache. Nó là rất easy to setup để làm việc với PHP và nó sẽ có hiệu suất tốt hơn.

Khác với mặt trước của mọi thứ, cũng xem xét kiểm tra máy chủ cơ sở dữ liệu của bạn. Kết nối tổng hợp sẽ tạo sự khác biệt thực sự ở đây. Hãy chắc chắn rằng nếu cài đặt PHP của bạn được cấu hình để tái sử dụng các kết nối đến cơ sở dữ liệu. Ngoài ra, nếu bạn đang lưu trữ các tệp tĩnh trên cùng một hệ thống, hãy di chuyển chúng ra trên máy chủ web khác hoặc thậm chí tốt hơn bằng cách di chuyển các tệp tĩnh sang hệ thống đám mây có CDN như số S3 + CloudFront hoặc Rackspace's CloudFiles của AWS. Ngay cả khi không có CloudFront, S3 sẽ làm bạn hài lòng. Giải pháp của Rackspace đi kèm với Akamai!

Đưa ra các tệp tĩnh sẽ làm cho máy chủ web của bạn "oh chuyện gì đã xảy ra, sự im lặng này là gì? Ohhh trời!" vì bạn đã đề cập đây là một trang web và các trang web có nhiều tệp tĩnh cho mỗi trang html được tạo động hầu hết thời gian.

Tôi hy vọng bạn có thể cứu người nghèo khỏi công việc sát thủ.

+0

Cảm ơn câu trả lời rất dài đó về câu hỏi. Có, Câu hỏi là cách thiết lập kết nối tổng hợp trên kết nối (B). Như ngược lại Proxying là một khái niệm bảo mật để ẩn tất cả các máy chủ 'làm việc' sau một proxy ngược lại duy nhất, lấy proxy ra khỏi trò chơi không phải là một lựa chọn. Xóa SSL khỏi kết nối (B) giữa proxy và máy chủ phụ không phải là tùy chọn, vì máy chủ proxy là máy chủ duy nhất được phép kết nối với máy chủ phụ trợ và cách duy nhất để thực sự đảm bảo điều này đang sử dụng xác thực SSL tương hỗ để xác thực proxy đối với máy chủ bckend. – BertNase

+0

Những lợi ích tôi muốn thu được từ việc kết nối tổng hợp trên Kết nối (B) trong khi loại bỏ phí bắt tay SSL. Cái bắt tay là thứ đắt tiền - 300-500ms. Việc chạy một yêu cầu tiếp theo đối với kết nối SSL gộp đã được thiết lập chỉ thêm 20ms trên thời gian thực hiện yêu cầu của máy chủ phụ trợ. Vì vậy, mục tiêu là để loại bỏ các hình phạt 300-500ms trên mỗi yêu cầu khi không sử dụng một kết nối gộp. – BertNase

+0

Thực ra tôi đã chuyển sang MPM_worker trong những ngày cuối cùng và quản lý để thiết lập kết nối tổng hợp. Vì vậy, vấn đề ban đầu của tôi được giải quyết ngay bây giờ. Trong nỗ lực của tôi để đạt được cùng một bằng cách sử dụng MPM_Prefork tôi gặp phải một số vấn đề và đi qua câu hỏi này và bắt đầu một tiền thưởng để cho tôi một số gợi ý về cách xây dựng này bằng cách sử dụng MPM_Prefork. Khi nó bật ra, lỗi Apache được nêu trong bài gốc chỉ áp dụng cho các phiên bản Apache 2.2 ban đầu và không có trong Apache 2.2.22 của tôi. Vì vậy, kết nối tổng hợp làm việc trong cả MPM_Prefork và MPM_worker cho tôi, xem bình luận của tôi dưới đây. – BertNase

0

Vấn đề trong trường hợp của tôi là, kết nối gộp giữa proxy ngược và máy chủ phụ trợ không được thực hiện do máy chủ phụ trợ Apache đóng kết nối SSL ở cuối mỗi yêu cầu HTTPS.

Backend Apache Server đã được làm điều này becuse của Chỉ thị sau có mặt trong httpd.conf:

SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown 

Chỉ thị này không có ý nghĩa khi máy chủ backend được kết nối thông qua một proxy ngược và điều này có thể được gỡ bỏ từ cấu hình máy chủ phụ trợ.

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