Elasticsearch head 插件无法通过 nginx 反向代理工作
Elasticsearch head plugin not working through nginx reverse proxy
我在另一台服务器上安装了带有 head 插件的 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;
}
}
}
点击 link http://es.mydomain.net/
效果很好,我收到状态 200 响应。但是,如果我尝试点击 link http://es.mydomain.net/_plugin/head/
,我似乎得到一个空白页。请注意,如果我通过 http://SERVERIP:PORT/_plugin/head/
在没有反向代理的情况下直接访问 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
,并且它试图 read/write 的文件夹可能没有正确的权限。仍在调查此问题,但会在找到时更新答案
编辑 2:删除了不必要的信息以使问题更直接。
我能够想出两个解决方案来绕过许可,所以我将同时展示它们。
关于我的 nginx 设置需要知道的一件事是我没有使用 sudo 来安装它。我取消归档 tar 文件,配置并安装它,所以它位于 /home/USERNAME/nginx/.
问题是 starting nginx 在“nobody”下创建了一个工作进程,然后试图 read/write in /home/USERNAME/nginx/proxy_temp/ ,它没有权限这样做。网络上的解决方案据说只是 chown nobody
到临时文件夹,但这个解决方案并不适合我的特定情况,因为我们在 USERNAME 的家中。
解决方案 1:
将 user USERNAME;
添加到 nginx.conf 的顶部,这样它将 运行 工作进程作为指定的用户名。这不再导致权限问题,因为 USERNAME 有权在所需的临时文件夹中 read/write。
解决方案 2:
将 proxy_temp_path 添加到服务器配置。有了这个,您可以为 nobody 进程指定一个文件夹,以在它具有 read/write 权限的地方创建。请注意,如果您的 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 文件夹。
您必须在所有 ES 节点上安装插件头。
我在另一台服务器上安装了带有 head 插件的 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;
}
}
}
点击 link http://es.mydomain.net/
效果很好,我收到状态 200 响应。但是,如果我尝试点击 link http://es.mydomain.net/_plugin/head/
,我似乎得到一个空白页。请注意,如果我通过 http://SERVERIP:PORT/_plugin/head/
在没有反向代理的情况下直接访问 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
,并且它试图 read/write 的文件夹可能没有正确的权限。仍在调查此问题,但会在找到时更新答案
编辑 2:删除了不必要的信息以使问题更直接。
我能够想出两个解决方案来绕过许可,所以我将同时展示它们。
关于我的 nginx 设置需要知道的一件事是我没有使用 sudo 来安装它。我取消归档 tar 文件,配置并安装它,所以它位于 /home/USERNAME/nginx/.
问题是 starting nginx 在“nobody”下创建了一个工作进程,然后试图 read/write in /home/USERNAME/nginx/proxy_temp/ ,它没有权限这样做。网络上的解决方案据说只是 chown nobody
到临时文件夹,但这个解决方案并不适合我的特定情况,因为我们在 USERNAME 的家中。
解决方案 1:
将 user USERNAME;
添加到 nginx.conf 的顶部,这样它将 运行 工作进程作为指定的用户名。这不再导致权限问题,因为 USERNAME 有权在所需的临时文件夹中 read/write。
解决方案 2:
将 proxy_temp_path 添加到服务器配置。有了这个,您可以为 nobody 进程指定一个文件夹,以在它具有 read/write 权限的地方创建。请注意,如果您的 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 文件夹。
您必须在所有 ES 节点上安装插件头。