proxypass، proxyreveve vs ajp
سؤال
لدي حاليا إعداد خادم HTTP Tomcat + Apache لخدمة Servlet Java:
ProxyPass /myservice http://localhost:8080/myservice
ProxyPassRerverse /myservice http://localhost:8080/myservice
هذا كل شيء على ما يرام إلا myservice
يحتاج إلى معرفة عنوان 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: لا.
قد لا ترغب في الحصول على آمنة = "True"، وأنا استخدم ذلك لأن SSL يتم التعامل معها في طبقة Apache وأحتاج إلى Tomcat لمعرفة أن الاتصال يجب أن يعتبر واحدا آمنا.
نصائح أخرى
يمكنك قراءة X-Forended-for في رأس الطلب.
عند التمثيل في وضع وكيل عكسي (باستخدام التوجيه ProxyPass، على سبيل المثال)، يضيف MOD_PROXY_HTTP العديد من رؤوس الطلبات من أجل تمرير المعلومات إلى خادم الأصل. هذه الرؤوس هي:
- X- إعادة توجيه-ل: عنوان IP للعميل.
- X- إعادة توجيه المضيف: المضيف الأصلي المطلوب من قبل العميل في رأس طلب HTTP المضيف.
- خادم X- إعادة توجيه: اسم المضيف للخادم الوكيل.
كن حذرا عند استخدام هؤلاء الرؤوس على خادم الأصل، نظرا لأنهم سيحتويون على أكثر من قيمة واحدة (مفصولة بفواصل) إذا كان الطلب الأصلي يحتوي بالفعل على واحد من هؤلاء الرؤوس. على سبيل المثال، يمكنك استخدام٪ {X - إعادة توجيهها - ل} 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>