Elasticsearch头插件无法通过nginx反向代理工作

时间:2015-05-26 22:58:41

标签: nginx elasticsearch reverse-proxy elasticsearch-plugin

我有一个在其他服务器上运行的head plugin安装的elasticsearch。我还为我的ES实例设置了一个nginx反向代理。配置如下所示:

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
      listen       80;
      server_name  es.mydomain.net;
      location / {
          proxy_set_header    Host $http_host;
          proxy_set_header    X-Real-IP   $remote_addr;
          proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;

          proxy_redirect off;
          proxy_pass  http://127.0.0.1:9200;
      }
    }
}

点击链接http://es.mydomain.net/工作正常,我得到状态200响应。但是,如果我尝试点击链接http://es.mydomain.net/_plugin/head/,我似乎会得到一个空白页面。注意,如果我通过http://SERVERIP:PORT/_plugin/head/直接访问没有反向代理的头部插件,页面加载正常。

编辑:

在做了一些调试之后,我在控制台中看到了该页面的net::ERR_CONTENT_LENGTH_MISMATCH错误。在查看了nginx的日志后,看看错误是什么,我找到了真正的罪魁祸首,这就是这个错误:

2015/05/27 16:26:48 [crit] 29765#0: *655 open() "/home/web/nginx/proxy_temp/6/0
0/0000000006" failed (13: Permission denied) while reading upstream, client: 10.
183.6.63, server: es.mydomain.com, request: "GET /_plugin/head/dist/app.js HTT
P/1.1", upstream: "http://127.0.0.1:9200/_plugin/head/dist/app.js", host: "es.my
domain.com", referrer: "http://es.mydomain.com/_plugin/head/"

我特意搜索了这个,似乎这可能发生,因为工作进程是nobody,并且它尝试读取/写入的文件夹可能没有正确的权限。仍在调查此问题,但会在找到答案时更新

编辑2 :删除不必要的信息以使问题更直接。

2 个答案:

答案 0 :(得分:1)

我能够制定出两个解决方案以获得许可,因此我会同时展示它们。

有关我的nginx设置的一件事是我没有使用sudo来安装它。我取消归档tar文件,配置并安装它,因此它驻留在/ home / USERNAME / nginx /.

问题在于启动nginx是在" nobody"下创建一个工作进程,然后尝试读/写/ home / USERNAME / nginx / proxy_temp /,它没有权限做。网上的解决方案仅对{temp}文件夹chown nobody说,但由于我们在USERNAME的家中,因此这个解决方案在我的特定情况下并不合适。

解决方案1:

user USERNAME;添加到nginx.conf的顶部,以便它将指定的用户名作为工作进程运行。这不再导致权限问题,因为USERNAME具有在所需临时文件夹中读/写的权限。

解决方案2:

将proxy_temp_path添加到服务器配置。通过这种方式,您可以为nobody进程指定一个文件夹,以创建具有读/写权限的位置。请注意,如果nginx服务器使用其他* _temp文件夹,您可能仍会遇到权限问题。

server {
  listen       80;
  server_name  es.mydomain.net;
  location / {
      proxy_set_header    Host $http_host;
      proxy_set_header    X-Real-IP   $remote_addr;
      proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;

      proxy_redirect off;
      proxy_pass  http://127.0.0.1:9200;
      proxy_temp_path /foo/bar/proxy_temp

  }
}

我个人更喜欢解决方案1,因为它适用于所有服务器块,并且一旦conf文件变得更复杂,我就不必担心其他* _temp文件夹。

答案 1 :(得分:0)

您必须在所有ES节点上安装插件头。