2015-10-10 2 views
5

Я пытаюсь выполнить ping локально работающий elasticsearch, используя elasticsearch.jquery.min.js, и каждый раз я получаю ошибку «нет живого соединения».Отключено клиентское соединение elasticsearch.js: Access-Control-Allow-Origin не распознан?


ETA: В Chrome я вижу, что похоже на довольно низкий уровень «Соединение отказано». Я разрабатываю MacOS X, и мой браузер указывает на страницу через http://localhost/~myuserid/SiteName/. Когда я обращаюсь к localhost:9200, это явно подпадает под требования к CORS для кросс-домена.

я вижу следующее сообщение об ошибке в консоли Chrome:

XMLHttpRequest cannot load http://localhost:9200/?hello=elasticsearch!. 
No 'Access-Control-Allow-Origin' header is present on the requested resource. 
Origin 'http://localhost' is therefore not allowed access. 

Per http://enable-cors.org/server_apache.html Я добавил следующее /etc/apache2/httpd.conf:

<Directory /> 
    Header set Access-Control-Allow-Origin "localhost:9200" 
    AllowOverride none 
    Require all denied 
</Directory> 

и запустить

$ sudo apachectl -t 
$ sudo apachectl -k graceful 

, но ошибка сохраняется. Есть ли еще одна настройка, которую я пропускаю?


Я новичок в elasticsearch.js. Есть ли что-нибудь, что мне нужно сделать на стороне elasticsearch, чтобы разрешить клиентские соединения из браузера или что-то еще?

Я следую the book в моей пинг попытки:

var client = new $.es.Client({ 
    hosts: 'localhost:9200' 
    }); 

client.ping(
    { 
    requestTimeout: Infinity, 
    // undocumented params are appended to the query string 
    hello: "elasticsearch!" 
    }, 
    function (error) { 
    if (error) { 
     console.error('elasticsearch cluster is down!'); 
     console.error(error); 
    } else { 
     console.log('All is well'); 
     } 
    } 
); 

, но я получаю следующее сообщение об ошибке (ы):

"WARNING: 2015-10-10T07:00:16Z"  elasticsearch.jquery.min.js:14:10575 
    Unable to revive connection: http://localhost:9200/ 

"WARNING: 2015-10-10T07:00:16Z"  elasticsearch.jquery.min.js:14:10575 
    No living connections 

Я могу подключиться с помощью локон в командной строке только хорошо, тянуть и вставлять данные и т.д .:

$ curl "localhost:9200/_cat/indices?v" 
health status index    pri rep docs.count docs.deleted store.size pri.store.size 

green open fuddle    1 0   3   0  12.9kb   12.9kb             
green open faddle    1 0   0   0  144b   144b 



ETA Дополнительная диагностика. Google Chrome показывает следующие сетевые трассы для неудачной попытки. На уровне HTTP ответ выглядит так, как будто это происходит.

General 
    Remote Address:[::1]:9200 
    Request URL:http://localhost:9200/?hello=elasticsearch! 
    Request Method:HEAD 
    Status Code:200 OK 
Response Headers 
    Content-Length:0 
    Content-Type:text/plain; charset=UTF-8 
Request Headers 
    Accept:text/plain, */*; q=0.01 
    Accept-Encoding:gzip, deflate, sdch 
    Accept-Language:en-US,en;q=0.8 
    Connection:keep-alive 
    Content-Length:0 
    Host:localhost:9200 
    Origin:http://localhost 
    Referer:http://localhost/~browsc3/Opticon/ 
    User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36 
Query String Parameters 
    view URL encoded 
    hello:elasticsearch! 

Тот же запрос в Wget:

wget http://localhost:9200/?hello=elasticsearch! 
--2015-10-10 09:47:13-- http://localhost:9200/?hello=elasticsearch! 
Resolving localhost... ::1, 127.0.0.1 
Connecting to localhost|::1|:9200... connected. 
HTTP request sent, awaiting response... 200 OK 
Length: 342 [application/json] 
Saving to: 'index.html?hello=elasticsearch!' 

index.html?hello=elastics 100%[=====================================>]  342 --.-KB/s in 0s  

2015-10-10 09:47:13 (65.2 MB/s) - 'index.html?hello=elasticsearch!' saved [342/342] 

Я действительно в недоумении, куда идти отсюда. Я вижу много ссылок на ошибку на googlz, но ни одно из этих обстоятельств не кажется отдаленно похожим. Мне кажется, что я просто нахожусь в какой-то неправильной конфигурации, но я не могу найти ничего, что могло бы указать на то, что это.

+0

Известно, что в клиентской библиотеке Javascript есть ошибка при объединении пулов. Ваша проблема выглядит много [как этот] (https://github.com/elastic/elasticsearch-js/issues/196). – Val

+0

Видел, что один, но обстоятельства кажутся разными. Там, пул умирает после работы на некоторое время. В моем случае никогда не было никакой связи. Первоначальная попытка установить соединение сбой сразу же с ошибкой «ПОДКЛЮЧЕНИЕ ПОДКЛЮЧЕНИЯ» на некотором низком уровне. Поведение кажется таким же, как когда elasticsearch не запускается. – Scott

+0

Вещи, которые я рассмотрел: проблема с перекрестным доменом AJAX (хотя это все на локальном хосте: apache, elasticsearch, browser и все); некоторый недостающий компонент или конфигурация на elasticsearch для включения или разрешения соединения (хотя я не могу найти никаких указаний на то, что может быть), несоответствие API или версии (я использую ES 1.7 и 1.7 elasticsearch.js API и пробовал последний jQuery на линиях 1.x и 2.x), проблемы с браузером (такое же поведение в Chrome и Firefox) и множество других «ну, не могли бы повредить возможности», ни одна из которых не была ключевым. – Scott

ответ

22

Ну, это было сложно.

Вот что установил его:

Per http://enable-cors.org/server_apache.html в /etc/apache2/httpd.conf, настроить Access-Control-Allow-Origin:

<Directory /> 
    # Add the following line to enable CORS to connect to local elasticsearch. 
    Header set Access-Control-Allow-Origin "localhost:9200" 
    AllowOverride none 
    Require all denied 
</Directory> 

Per https://jsbroadcast.com/elastic-search-cors/, в elasticsearch-1.7.0/config/elasticsearch.yml добавить:

http.cors.enabled : true // 
http.cors.allow-origin: "/.*/" 
http.cors.allow-methods : OPTIONS, HEAD, GET, POST, PUT, DELETE 
http.cors.allow-headers : "X-Requested-With,X-Auth-Token,Content-Type, Content-Length, Authorization" 

I теперь может запускать вызов client.ping без каких-либо ошибок.

+2

Здесь не требуется (или полезно) изменение конфигурации Apache. Требуется только изменение elasticsearch.yml. –

+0

Рассел, я много экспериментировал с изменениями в разных комбинациях и без них и не мог заставить его работать, не внося никаких изменений. (Если бы только одно изменение сработало, я бы ударил его гораздо меньше часов попыток.) ​​Почему веб-сервер, опосредующий соединение, не должен разрешать CORS? – Scott

+0

Мои извинения, Скотт. Я неправильно понял вашу настройку. Я не уверен, какую роль я думал, что Апач играл здесь. –

2

Put в файле конфигурации elasticsearch.yml, расположенный в elasticsearch-ххх \ Config \ elasticsearch.yml, линия ниже

http.cors.enabled: true 

и включить CORS в вашем интернет-навигатора. Перезагрузите сервер elasticsearch и повторите попытку.

3

Просто добавьте это в elasticsearch.yml.

http.cors.enabled: true 
http.cors.allow-origin: "/.*/" 
http.cors.allow-methods: OPTIONS, HEAD, GET, POST, PUT, DELETE 
http.cors.allow-headers: "X-Requested-With,X-Auth-Token,Content-Type, Content-Length, Authorization" 

Вам не нужно ничего добавить в Apache.

+0

См. мой ответ на Рассела выше. Этого было крайне не достаточно. – Scott

+0

@scott Да , Я видел ваш ответ, но вы говорите, что вам нужно изменить два файла: один в Apache и один в ES, что неверно. Спасибо за проголосовавший, кстати. – Penman

+0

Опять же, вот что было правдой: только изменение один из файлов не разрешил проблему, а изменение было сделано. Я верю своим глазам, спасибо. – Scott

Смежные вопросы