web-dev-qa-db-ja.com

ProxyPass、Proxy Reverse、またはAJP

私は現在、Javaサーブレット:

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

myserviceがクライアントIPアドレスを知る必要があることを除いて、これはすべて問題ありません。クライアントIPアドレスは、プロキシのために常に127.0.0.1であることがわかります。実際のIPアドレスを取得するための解決策はありますか? AJPはオプションですか?

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

このようにしてください:

apache構成で:

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

そして、server.xmlで:

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

それはすべてを通過するはずです。 AJPプロトコルは情報を渡しますが、http:は渡しません。

Secure = "true"は必要ないかもしれません。これは、SSLがApacheレイヤーで処理され、Tomcatが接続を安全な接続と見なす必要があることを知る必要があるためです。

22
caskey

X-Forwarded-Forはリクエストヘッダーで読み取ることができます。

Apache mod_proxyドキュメント から:

リバースプロキシモードで動作する場合(たとえば、ProxyPassディレクティブを使用)、mod_proxy_httpは、Originサーバーに情報を渡すためにいくつかの要求ヘッダーを追加します。これらのヘッダーは次のとおりです。

  • X-Forwarded-For:クライアントのIPアドレス。
  • X-Forwarded-Host:ホストHTTP要求ヘッダーでクライアントによって要求された元のホスト。
  • X-Forwarded-Server:プロキシサーバーのホスト名。

元のリクエストにすでにこれらのヘッダーの1つが含まれている場合、これらのヘッダーには複数の(カンマ区切りの)値が含まれるため、Originサーバーでこれらのヘッダーを使用する場合は注意が必要です。たとえば、オリジンサーバーのログ形式の文字列で%{X-Forwarded-For} iを使用して、元のクライアントのIPアドレスをログに記録できますが、リクエストが複数のプロキシを通過する場合、複数のアドレスを取得する可能性があります。

サーブレットには、次のものがあります。

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

これは非常に簡単です。

<VirtualHost> 

 ServerName www.server.com

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

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

</VirtualHost>
1
alparslan