Elasticsearch是一種先進的,高效能的,可擴展的開源搜尋引擎,提供全文搜尋和即時分析的結構化和非結構化的資料。
它的特點是可以透過HTTP使用 RESTful API,很容易的融入現有的web架構。因此在高並發的情況下,我們可以採用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教程有興趣的朋友有所幫助。