Я настраиваю Solr, используя Jetty. Я хотел бы ограничить доступ только к нескольким IP-адресам. Не кажется очевидным, что это можно сделать с помощью Jetty. Возможно ли, и если да, то как?
Ограничение IP-адресов для Jetty и Solr
Ответ 1
Solr 4.2.1 использует Jetty 8.1.8. Jetty 8 (как отмечено jonas789) не поддерживает .htaccess. Вместо этого он использует IPAccessHandler, который не имеет отличной документации. Мне пришлось немного поиграть, чтобы заставить его работать, поэтому я размещаю обновленное решение здесь.
IPAccessHandler управляет черным списком и белым списком, принимает произвольные диапазоны IP-адресов и поддерживает привязку определенных путей URI к каждой записи белого/черного списка. IPAccessHandler также подклассифицирует HandlerWrapper, который оказывается важным.
Приложение solr по-прежнему работает в WebAppContext (как в решении Lyndsay), но теперь WebAppContext управляется ContextHandler, который находится в ContextHandlerCollection, занимающем слот первого обработчика на сервере. Чтобы остановить запросы от неправильного IP-адреса, чтобы попасть в приложение, нам нужно обернуть его внутри IPAccessHandler где-то по этому пути. IPAccessHandler ведет себя странно, если он находится в неправильном месте: я попытался вставить его перед обработчиками контекста, и он дал 403 Forbidden на неправильные машины, бросил NullPointerException истерики без каких-либо дополнительных сообщений об ошибках, всевозможных глупостей. Я, наконец, заставил его работать, обернув сам ContextHandlerCollection на уровне сервера.
Перейдите к etc/jetty.xml
и прокрутите список до раздела обработчиков. Затем заверните существующий элемент ContextHandlerCollection следующим образом:
<!-- =========================================================== -->
<!-- Set handler Collection Structure -->
<!-- =========================================================== -->
<Set name="handler">
<New id="Handlers" class="org.eclipse.jetty.server.handler.HandlerCollection">
<Set name="handlers">
<Array type="org.eclipse.jetty.server.Handler">
<Item>
<!-- here begins the new stuff -->
<New class="org.eclipse.jetty.server.handler.IPAccessHandler">
<Call name="addWhite">
<Arg>xxx.xxx.xxx.xxx</Arg>
</Call>
<Set name="handler">
<!-- here where you put what was there before: -->
<New id="Contexts" class="org.eclipse.jetty.server.handler.ContextHandlerCollection"/>
</Set>
</New>
<!-- here ends the new stuff -->
</Item>
<Item>
<New id="DefaultHandler" class="org.eclipse.jetty.server.handler.DefaultHandler"/>
</Item>
<Item>
<New id="RequestLog" class="org.eclipse.jetty.server.handler.RequestLogHandler"/>
</Item>
</Array>
</Set>
</New>
</Set>
Ресурсы
Ответ 2
Я нашел решение.
Во-первых, извлеките содержимое файла solr.war в папке example/webapps. Затем создайте файл с именем .htaccess и поместите его в папку example/webapps/solr (тот, который вы только что извлекли), содержащий следующее:
<Limit>
satisfy all
order deny,allow
deny from all
allow from xxx.xxx.xxx.xxx
</Limit>
В примере/etc/отредактируйте файл jetty.xml и закомментируйте часть org.mortbay.jetty.deployer.WebAppDeployer. Затем, наконец, создайте папку в примере/вызываемых контекстах (если ее еще нет) и добавьте к ней файл с именем solr.xml, содержащий:
<Configure id="solr" class="org.mortbay.jetty.webapp.WebAppContext">
<Set name="resourceBase"><SystemProperty name="jetty.home" default="."/>/webapps/solr</Set>
<Set name="contextPath">/solr</Set>
<Call name="setSecurityHandler">
<Arg>
<New class="org.mortbay.jetty.security.HTAccessHandler">
<Set name="protegee">
<Ref id="solr"/>
</Set>
</New>
</Arg>
</Call>
</Configure>
Затем запустите новый безопасный файл solr!