Using in Production
在生产环境中,**强烈建议**不要将 Elasticsearch 实例直接暴露给浏览器。而是通过您自己的后端服务器代理所有请求。
您有以下选项可安全地将 Elasticsearch 实例暴露给互联网
提示
这是**推荐**的方法,将在以下示例中使用。
这包括创建一个 API 路由,将搜索请求代理到 Elasticsearch。代理允许您
- 在服务器上添加自定义标头或 API 密钥。
- 应用过滤器以限制对特定文档的访问
- 您自己的基于用户的 API 身份验证
- 监控和记录搜索活动
- 在 API 和 Elasticsearch 之间添加缓存层
在前端使用 ApiProxyConnector 将请求发送到您的后端,并在后端使用 ElasticsearchAPIConnector 将请求转发到 Elasticsearch。
您可以通过使用 API 密钥来限制对索引的访问。我们**建议**您创建一个仅限于特定索引且具有**只读**授权的 apiKey。请参阅 Kibana API 密钥指南。要使用 API 密钥,请将其放置在 Elasticsearch 连接配置中。
要通过服务器代理搜索请求,请使用 ApiProxyConnector。此连接器将搜索和自动完成请求发送到您的后端,并在后端执行实际的 Elasticsearch 查询。
import { ApiProxyConnector } from "@elastic/search-ui-elasticsearch-connector";
const connector = new ApiProxyConnector({
basePath: "https://:3001/api"
// fetchOptions: {}
});
const config = {
apiConnector: connector
// other Search UI config options
};
- ⚠️ 在生产环境中替换为您的服务器 URL
- 可选:如有需要,在此处添加标头或凭据
有关更多详细信息,请参阅 ApiProxyConnector
在您的后端,使用 ElasticsearchAPIConnector 处理请求,并传入来自客户端的请求正文
import express from "express";
import ElasticsearchAPIConnector from "@elastic/search-ui-elasticsearch-connector";
const app = express();
app.use(express.json());
const connector = new ElasticsearchAPIConnector({
host: "https://your-elasticsearch-host",
index: "your-index",
apiKey: "your-api-key"
});
app.post("/api/search", async (req, res) => {
const { state, queryConfig } = req.body;
const response = await connector.onSearch(state, queryConfig);
res.json(response);
});
app.post("/api/autocomplete", async (req, res) => {
const { state, queryConfig } = req.body;
const response = await connector.onAutocomplete(state, queryConfig);
res.json(response);
});
app.listen(3001);
- ⚠️ 替换为您的 Elasticsearch 主机
- ✅ 使用与您的数据相同的索引
- 🔒 使用安全的、只读的 API 密钥
- { state: RequestState, queryConfig: QueryConfig } - 来自前端的 ApiProxyConnector
有关其他身份验证方法,请查看 Elasticsearch API 连接器参考。
为了实现安全且可扩展的生产设置
- 在前端使用
ApiProxyConnector。 - 在服务器上使用
ElasticsearchAPIConnector。 - **避免**将您的 Elasticsearch API 密钥暴露给浏览器。
- 如有需要,请监控和记录。
提示
您可以在我们的 CodeSandbox 中探索使用此设置的**生产就绪**示例。
它演示了如何在客户端使用 ApiProxyConnector,并将搜索请求代理到使用 ElasticsearchAPIConnector 的后端。