私は現在、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()
}
このようにしてください:
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が接続を安全な接続と見なす必要があることを知る必要があるためです。
X-Forwarded-Forはリクエストヘッダーで読み取ることができます。
リバースプロキシモードで動作する場合(たとえば、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")
}
これは非常に簡単です。
<VirtualHost>
ServerName www.server.com
redirect / http://www.server.com/foo
ProxyRequests off
ProxyPass / ajp://localhost:8009/
</VirtualHost>