【问题标题】:elasticsearch.js client connection refused: Access-Control-Allow-Origin not recognized?elasticsearch.js 客户端连接被拒绝:无法识别 Access-Control-Allow-Origin?
【发布时间】:2016-01-08 04:16:13
【问题描述】:

我一直在尝试使用 elasticsearch.jquery.min.js 对本地运行的 elasticsearch 进行 ping 操作,但每次都会收到“无活动连接”错误。


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.

根据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 的菜鸟。在弹性搜索方面我需要做些什么来允许来自浏览器的客户端连接,还是什么?

我在 ping 尝试中关注 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 进行连接,拉取和插入数据等:

$ 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]

我真的不知道从这里去哪里。我在 teh googlz 上看到很多关于该错误的引用,但这些情况似乎都不太相似。感觉就像我只是遇到了一些错误配置,但我找不到任何可以表明那是什么的东西。

【问题讨论】:

  • 已知 Javascript 客户端库在连接池中存在错误。你的问题看起来很多like this one
  • 看到了那个,但情况似乎不同。在那里,池在工作一段时间后死亡。就我而言,从来没有任何联系。建立连接的初始尝试立即失败,并在某个低级别出现“CONNECTION REFUSED”错误。行为似乎与未运行弹性搜索时相同。
  • 我考虑过的事情:一些 AJAX 跨域类型问题(尽管都在本地主机上:apache、elasticsearch、浏览器等等); elasticsearch 上缺少一些组件或配置以启用或允许连接(尽管我找不到任何指示可能是什么),API 或版本不匹配(我正在使用 ES 1.7 和 1.7 elasticsearch.js API 并尝试过1.x 和 2.x 行上的最新 jQuery)、浏览器问题(Chrome 和 Firefox 中的行为相同)以及许多其他“好吧,尝试一下不会有坏处”的可能性,这些都不是关键。

标签: jquery ajax apache localhost access-control


【解决方案1】:

嗯,那是一个艰难的过程。

这是修复它的原因:

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>

每个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"

我现在可以运行client.ping 调用而不会出现任何错误。

【讨论】:

  • 这里不需要(或有用)更改 apache 配置。只需要对 elasticsearch.yml 进行更改。
  • Russell,我对不同组合的变化和不变化进行了广泛的试验,如果不进行这两种变化,就无法使其工作。 (如果只有一项更改有效,我会用更少的时间尝试。)为什么调解连接的 Web 服务器不需要允许 CORS?
  • 我很抱歉,斯科特。我误解了你的设置。我不确定我认为 Apache 在这里扮演什么角色。
  • 不用担心。交换的所有部分。 :)
  • 谢谢先生。将 http.cors 部分添加到 elasticsearch.yml 节省了我的时间。
【解决方案2】:

放入你的elasticsearch.yml配置文件,位于elasticsearch-xxx\config\elasticsearch.yml的下面一行

http.cors.enabled: true

并在您的 Internet 导航器中启用 cors。 重新启动您的弹性搜索服务器,然后重试。

【讨论】:

    【解决方案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 添加任何内容。

    【讨论】:

    • 见上面我对罗素的回复。这显然是不够的。
    • @scott 是的,我看到了您的回复,但您说您需要修改两个文件,一个在 Apache 中,一个在 ES 中,这是不正确的。顺便说一句,感谢您的反对票。
    • 同样,事实是这样:只修改一个文件并没有解决问题,修改两个文件可以解决问题。我会相信我自己说谎的眼睛,谢谢。
    • @scott 好吧,也许它对你有用,但对我来说,它只是一个解决问题的文件。老实说,我想将其发布为评论,但由于我的声誉,我无法这样做。
    • 我的回复中没有任何内容暗示不存在只需要修改一个文件的情况。在我的情况下,我可能会在其他地方进行不同的配置,但我不知道那可能是什么。否决票是为了发布我已经解释过的相同答案,众所周知是不够的。如果您有关于确定其他可能是一个因素的建议,那将很有帮助。跟进评论说,您的解决方案必须对我有效,而您的意思是它对您无效。
    猜你喜欢
    • 2014-11-28
    • 2015-04-08
    • 2012-11-14
    • 2012-07-27
    • 2017-05-11
    • 2023-04-03
    • 2019-03-12
    • 2017-06-15
    • 2023-04-01
    相关资源
    最近更新 更多