Головной плагин Elasticsearch не работает через обратный прокси-сервер nginx

У меня есть elasticsearch с плагином head, установленным на другом сервере. Я также настроил обратный прокси-сервер nginx для своего экземпляра ES. Конфигурация выглядит следующим образом:

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: удалена ненужная информация, чтобы проблема была более прямой.


person Shark    schedule 26.05.2015    source источник
comment
Вы уверены, что nginx проксирует все вложенные пути, то есть /_plugin/* также? Кажется, вы проксируете только корневой путь.   -  person Zouzias    schedule 27.05.2015
comment
@Zouzias Я обновил OP дополнительной информацией. Я добавил фактическую ошибку, которая происходит. Кажется, проблема с разрешением.   -  person Shark    schedule 28.05.2015
comment
Взгляните на эту статью, она может быть полезной, например, установите proxy_http_version 1.1 https://www.elastic.co/blog/playing-http-tricks-nginx   -  person Zouzias    schedule 28.05.2015
comment
Спасибо за ссылку, а то я уже смотрел. Мне удалось найти решение, и я разместил его ниже.   -  person Shark    schedule 28.05.2015


Ответы (2)


Мне удалось найти два решения, чтобы обойти разрешение, поэтому я представлю их оба.

Одна вещь, которую нужно знать о моей настройке nginx, это то, что я не использовал sudo для его установки. Я разархивировал файл tar, настроил и установил его, чтобы он находился в /home/ИМЯ ПОЛЬЗОВАТЕЛЯ/nginx/.

Проблема заключалась в том, что запуск nginx создавал рабочий процесс под никем, который затем пытался читать/записывать в /home/ИМЯ ПОЛЬЗОВАТЕЛЯ/nginx/proxy_temp/, на что у него не было разрешения. Решения в Интернете говорили только о chown nobody временных папках, но это решение не совсем подходило для моего конкретного случая, поскольку мы находились в доме USERNAME.

Решение 1:

Добавьте user USERNAME; в начало nginx.conf, чтобы он запускал рабочий процесс от имени указанного пользователя. Это больше не приводило к проблемам с разрешениями, так как USERNAME имел разрешения на чтение и запись в нужных временных папках.

Решение 2:

Добавьте proxy_temp_path в конфигурацию сервера. При этом вы можете указать папку для создания процесса Nobody, в которой он будет иметь разрешение на чтение/запись. Обратите внимание, что вы все равно можете столкнуться с проблемами с правами доступа, если другие папки *_temp используются вашим сервером nginx.

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, так как оно применимо ко всем блокам сервера, и мне не придется беспокоиться о других папках *_temp, когда файл conf станет более сложным.

person Shark    schedule 28.05.2015

Вы должны установить голову плагина на все узлы ES.

person Hugues Lepesant    schedule 29.07.2015