Elasticsearch:Nginx可以給Elasticsearch叢集帶來什麼福利?

來源:互聯網
上載者:User
Elasticsearch是一種先進的,高效能的,可擴充的開源搜尋引擎,提供全文檢索搜尋和即時分析的結構化和非結構化的資料。

它的特點是可以通過HTTP使用 RESTful API,很容易的融入現有的web架構。因此在高並發的情況下,我們可以採用nginx反向 Proxy負載平衡到多台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教程有興趣的朋友有所協助。

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.