2009-07-25 17 views
13

Tôi hiện đang có một môi trường máy chủ Tomcat + Apache HTTP để phục vụ servlet Java của tôi:ProxyPass, ProxyReverse vs AJP

ProxyPass /myservice http://localhost:8080/myservice 
ProxyPassRerverse /myservice http://localhost:8080/myservice 

này là tất cả tốt ngoại trừ việc myservice cần phải biết địa chỉ IP của khách hàng, mà luôn luôn quay ra là 127.0.0.1 do proxy. Có một giải pháp để có được địa chỉ IP thực? AJP là một tùy chọn?

doGet(HttpServletRequest request, HttpServletResponse response){ 
    request.getRemoteAddr() 
} 

Trả lời

19

Làm điều đó như thế này:

trong config apache:

<Location /foo> 
    ProxyPass ajp://localhost:8009/foo 
    ProxyPassReverse ajp://localhost:8009/foo 
</Location> 

Và sau đó trong server.xml của bạn:

<Connector port="8009" 
      enableLookups="false" secure="true" URIEncoding="UTF-8" 
      tomcatAuthentication="false" 
      protocol="AJP/1.3" /> 

Điều đó sẽ vượt qua tất cả mọi thứ thông qua. Giao thức AJP chuyển thông tin, nhưng http: không.

Bạn có thể không muốn bảo mật = "true", tôi sử dụng vì SSL được xử lý ở lớp apache và tôi cần tomcat để biết rằng kết nối nên được coi là an toàn.

+1

tôi đã có khách hàng bị từ chối bởi cấu hình máy chủ: proxy: ajp: //127.0.0.1: 8009 lỗi/tomcat trong error.log Tôi đã phải thay đổi cài đặt Proxy * từ Từ chối tất cả thành Từ chối không có trong /etc/apache2/mods-enabled/proxy.conf Chỉ đề cập ở đây để tra cứu trong tương lai. – KishoreK

+0

Điều này đã giúp tôi rất nhiều. Tôi là một thằng ngốc và đặt 'http' thay vì' ajp' ... LOL! – cbmeeks

+5

Vui lòng xem xét sửa đổi cài đặt ProxyPassReverse của bạn, vì đây có vẻ là một lỗi phổ biến theo http://www.humboldt.co.uk/2009/02/the-mystery-of-proxypassreverse.html – Jack

1

này rất đơn giản:

<VirtualHost> 

ServerName www.server.com 

redirect/http://www.server.com/foo 

ProxyRequests off 
ProxyPass/ajp://localhost:8009/ 

</VirtualHost> 
3

Bạn có thể đọc X-Forwarded-For trong tiêu đề yêu cầu.

Từ Apache mod_proxy documentation:

Khi diễn xuất trong một chế độ reverse-proxy (sử dụng chỉ thị ProxyPass, ví dụ), mod_proxy_http thêm một số tiêu đề yêu cầu để chuyển thông tin đến máy chủ gốc. Những tiêu đề là:

  • X Forwarded-For-: Địa chỉ IP của khách hàng.
  • X-Forwarded-Host: Máy chủ gốc được yêu cầu bởi máy khách trong tiêu đề yêu cầu HTTP Host.
  • X-Forwarded-Server: Tên máy chủ của máy chủ proxy.

Hãy cẩn thận khi sử dụng các tiêu đề này trên máy chủ gốc vì chúng sẽ chứa nhiều giá trị (được phân cách bằng dấu phẩy) nếu yêu cầu ban đầu đã chứa một trong các tiêu đề này. Ví dụ: bạn có thể sử dụng% {X-Forwarded-For} i trong chuỗi định dạng nhật ký của máy chủ gốc để ghi lại địa chỉ IP của máy khách gốc, nhưng bạn có thể nhận được nhiều địa chỉ nếu yêu cầu chuyển qua một số proxy.

Trong servlet của bạn, bạn sẽ phải:

doGet(HttpServletRequest request, HttpServletResponse response){ 
    request.getHeader("X-Forwarded-For") 
} 
+0

Thận trọng: 'X-Forwarded_For' vs' X-Forwarded-For' ... Sao chép-dán mã của bạn có thể nguy hiểm :) –