首頁  >  文章  >  後端開發  >  ElasticSearch:Nginx可以為ElasticSearch叢集帶來什麼福利?

ElasticSearch:Nginx可以為ElasticSearch叢集帶來什麼福利?

WBOY
WBOY原創
2016-08-08 09:18:532163瀏覽

Elasticsearch是一種先進的,高效能的,可擴展的開源搜尋引擎,提供全文搜尋和即時分析的結構化和非結構化的資料。

它的特點是可以透過HTTP使用 RESTful API,很容易的融入現有的web架構。因此在高並發的情況下,我們可以採用nginx反向代理負載平衡到多台Elasticsearch 伺服器上。

架構圖:

ElasticSearch:Nginx可以為ElasticSearch叢集帶來什麼福利?

那麼使用nginx有什麼好處呢?

1. 記錄每個API存取請求的日誌。 (ElasticSearch本身不支援這個功能,只有slowLog和服務日誌)

2. 支援大量的客戶端連線。 ES官方的blog推薦使用keep-alives,在nginx和ES之間使用長連接。我理解是因為在通常情況下,ES都是架構中的底層,存取它的一般是固定的上層服務,這種情況是適用於使用keep-alive的。 (實際上不管用不用keep-alive,nginx都可以起到支援更大量客戶端連線的作用)

3. 負載平衡的請求Elasticsearch伺服器。

4. 快取數據,減少同一內容再次請求Elasticsearch伺服器。

5. 提供主動健康偵測(僅nginx plus),不斷偵測後端Elasticsearch伺服器是否正常,並主動的進行切換。 (當某台ES掛掉的時候,nginx不分發請求到此結點,當結點重新恢復正常時,自動歸位)

6. 報告豐富的監控指標(僅nginx plus),提供監控和管理。

7. 安全驗證。只讓持有帳號名稱密碼的客戶端存取到ES叢集。

8. 對特殊介面如"_shutdown"限制存取。 (這個功能相當實用)

9. 帶角色的存取控制(例如user角色擁有資料存取權限,admin角色擁有叢集管控權限)

====我是設定範例的分割線====

一個簡單的nginx配置如下:

upstream elasticsearch_servers {
    zone elasticsearch_servers 64K;
    server 192.168.187.132:9200;
    server 192.168.187.133:9200;
    keepalive 40 ;
}
match statusok {
    status 200;
    header Content-Type ~ "application/json";
    body ~ '"status" : 200';
}
server {
    listen 9200;
    status_zone elasticsearch;
    location / {
        proxy_pass http://elasticsearch_servers;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_cache elasticsearch;
        proxy_cache_valid 200 302 10m;
        proxy_cache_valid 404 1m;
        proxy_connect_timeout 5s;
        proxy_read_timeout 10s;
        proxy_set_header Connection "Keep-Alive";
        proxy_set_header Proxy-Connection "Keep-Alive";
        health_check interval=5s fails=1 passes=1 uri=/ match=statusok;

    } 
    # redirect server error pages to the static page /50x.html
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }
    access_log logs/es_access.log combined;
}
server {
    listen 8080;
    root /usr/share/nginx/html;
    location / {
        index status.html;
    }
    location =/status {
        status;
    }
}
長連線、負載平衡、對有效的請求快取10分鐘、主動的健康監測、狀態收集。

====我是安全驗證配置的分割線====

一個帶安全驗證的配置如下:

events {
  worker_connections  1024;
}

http {

  upstream elasticsearch {
    server 127.0.0.1:9200;
  }

  server {
    listen 8080;

    auth_basic "Protected Elasticsearch";
    auth_basic_user_file passwords;

    location / {
      proxy_pass http://elasticsearch;
      proxy_redirect off;
    }
  }
}
passwords檔案和nginx.conf在同一目錄,裡面的格式是按行的"用戶名:crypt (3)加密後的密碼串":
$ printf "john:$(openssl passwd -crypt s3cr3t)n" > passwords
做完以上設定後重啟nginx,直接存取服務會被禁止:
$ curl -i localhost:8080
# HTTP/1.1 401 Unauthorized
# ...
透過正確的使用者名稱密碼可順利存取:
$ curl -i john:s3cr3t@localhost:8080
# HTTP/1.1 200 OK
# ...

====我是訪問限製配置的分割線====

location / {
  if ($request_filename ~ _shutdown) {
    return 403;
    break;
  }

  proxy_pass http://elasticsearch;
  proxy_redirect off;
}

做了此配置之後,直接訪問_shutdown會被拒絕:

$ curl -i -X POST john:s3cr3t@localhost:8080/_cluster/nodes/_shutdown
# HTTP/1.1 403 Forbidden
# ....

針對我目前的項目,上層應用僅需要訪問ES中的數據,所以cluster和node等API介面都應拒絕上層應用的存取。同時,對不應刪除的資源進行-DELETE也應禁止。這對ES叢集是一種安全保證,否則輕易就可以被修改叢集配置或刪除大量資料。

====我是多角色配置的分割線====

events {
  worker_connections  1024;
}

http {

  upstream elasticsearch {
      server 127.0.0.1:9200;
  }

  # Allow access to /_search and /_analyze for authenticated "users"
  #
  server {
      listen 8081;

      auth_basic           "Elasticsearch Users";
      auth_basic_user_file users;

      location / {
        return 403;
      }

      location ~* ^(/_search|/_analyze) {
        proxy_pass http://elasticsearch;
        proxy_redirect off;
      }
  }

  # Allow access to anything for authenticated "admins"
  #
  server {
      listen 8082;

      auth_basic           "Elasticsearch Admins";
      auth_basic_user_file admins;

      location / {
        proxy_pass http://elasticsearch;
        proxy_redirect off;
      }
  }

}
區分admins和users兩種權限,admins可以存取一切API,而users只允許存取_search和_analyze介面。

多角色存取限制的代價是每個角色使用不同的連接埠號碼存取集群,這在架構上是合理的——一個客戶端只需要擁有一種角色,也對應一個存取連接埠。

使用lua可以進行更細緻的url權限控制,nginx對lua的嵌入也支持得很好很簡潔,此處不做更多深入的探究。有興趣可以了解。

參考文件:

http://www.ttlsa.com/nginx/nginx-elasticsearch/

https://www.elastic.co/blog/playing-http-tricks-nginx

版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。

以上就介紹了ElasticSearch:Nginx可以為ElasticSearch叢集帶來什麼福利? ,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
上一篇:php 檔案寫入下一篇:php 檔案寫入