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教程有興趣的朋友有所協助。