MeiliSearch 投入生产:迈向新台阶
在自己的机器上为您的周末项目运行 MeiliSearch 很有趣,这一点我们都同意。然而,您可能希望将其上线并部署到生产环境中,以使其达到新的水平。

快速介绍
希望您已经知道 MeiliSearch 是一个用 Rust 构建的强大而快速的开源搜索引擎。它旨在为用户提供非常有用且可定制的搜索体验,包括开箱即用的功能,如容错、过滤和同义词,适用于任何类型的项目。
运行 MeiliSearch 实例进行测试非常容易,并且可以通过多种方式完成:使用 Docker、brew、aptitude、二进制文件、简单的 curl,甚至源代码。如果您是 MeiliSearch 的新用户,我们建议您浏览一下文档。
在自己的机器上为您的周末项目使用 MeiliSearch 很有趣,这一点我们都同意。然而,您可能希望将其上线并部署到生产环境中,以使其达到新的水平。您需要采取哪些步骤和细节才能将 MeiliSearch 部署到生产环境并确保其安全可用?
为您的 MeiliSearch 做好生产准备
在本教程中,我们将使用一台运行在 DigitalOcean 上的 Debian 10 服务器。您可以轻松地自行尝试,套餐起价为每月 5 美元。如果您想获得一些积分来开始运行 MeiliSearch,并且尚未在 DigitalOcean 上注册,您可以使用此推荐链接免费获得 100 美元。
先决条件
- 一台运行 Debian 10 的最新服务器
- 用于连接该机器的 SSH 密钥对
- MeiliSearch 是一个数据库,这意味着它需要一个可写入的文件系统,并且该文件系统必须是持久的。
提示:了解如何通过 SSH 连接到您的 DigitalOcean droplet 或任何 Linux 或 Windows 服务器
步骤 1:安装 MeiliSearch
安装和运行 MeiliSearch 既简单又直接。为了使本教程尽可能简单,我们将使用一个脚本来执行安装过程。它会将 MeiliSearch 的二进制文件复制到您的机器上,让您立即使用它。
通过 SSH 登录到您的机器后,在继续安装之前,请确保您的系统及其依赖项是最新的。
# Update the list of available packages and their versions $ apt update # Install curl which is required to install MeiliSearch in the next step $ apt install curl -y # Install MeiliSearch latest version from the script $ curl -L https://install.meilisearch.com | sh
实现 MeiliSearch 安装的不同选项详见本指南。
重要的是要知道,有多种方法可以在您的机器上运行 MeiliSearch。作为一个开源项目,您始终可以从源代码编译 MeiliSearch 的最新稳定版本,以确保二进制文件以最佳方式利用您的架构。
您可以通过访问以下链接,随时查看 MeiliSearch 的最新稳定版本,并获取适用于您选择的操作系统的 MeiliSearch
MeiliSearch 终于安装完毕并可供使用。为了使其在您的系统中随处可访问,请将二进制文件移动到您的系统二进制文件夹中
# Move the MeiliSearch binary to your system binaries $ mv ./meilisearch /usr/bin/
您现在可以开始使用 MeiliSearch 了!在您的终端中,运行
$ meilisearch # --- Expected output for v0.10.1 --- 888b d888 d8b 888 d8b .d8888b. 888 8888b d8888 Y8P 888 Y8P d88P Y88b 888 88888b.d88888 888 Y88b. 888 888Y88888P888 .d88b. 888 888 888 "Y888b. .d88b. 8888b. 888d888 .d8888b 88888b. 888 Y888P 888 d8P Y8b 888 888 888 "Y88b. d8P Y8b "88b 888P" d88P" 888 "88b 888 Y8P 888 88888888 888 888 888 "888 88888888 .d888888 888 888 888 888 888 " 888 Y8b. 888 888 888 Y88b d88P Y8b. 888 888 888 Y88b. 888 888 888 888 "Y8888 888 888 888 "Y8888P" "Y8888 "Y888888 888 "Y8888P 888 888 [2020-05-04T11:47:13Z INFO meilisearch] Database path: "./data.ms" [2020-05-04T11:47:13Z INFO meilisearch] Start server on: "127.0.0.1:7700"
步骤 2:将 MeiliSearch 作为服务运行
在 Linux 环境中,服务 (service)
是一个可以在操作系统启动时启动并在后台持续运行的进程。其最大的优点之一是使您的程序随时可用。即使发生一些执行问题或崩溃,服务也会重新启动,您的程序将再次运行。
如果您是服务和
systemd
的新用户,您可以在此处了解有关 Linux 服务基础知识的更多信息。
在 Debian 和其他 Linux 发行版中,systemd
允许您创建和管理自己的自定义服务。为了确保 MeiliSearch 始终响应您的请求,您可以构建自己的服务。这样,您将确保其在崩溃或系统重启时的可用性。如果发生其中任何一种情况,systemd
将自动重启 MeiliSearch。
2.1 创建服务文件
服务文件是文本文件,它们告诉您的操作系统如何以及何时运行您的程序。它们位于 /etc/systemd/system
目录中,您的系统会在启动时加载它们。在这种情况下,我们使用一个非常简单的服务文件,它将在端口 7700
上运行 MeiliSearch。
要在生产环境中运行 MeiliSearch,请使用 --env
标志。要生成一个主密钥,允许 MeiliSearch 创建读写密钥,请使用 --master-key
标志。通过这些密钥,您可以轻松控制谁可以访问或创建新文档、索引或更改配置。您可以在以下命令中将 主密钥 (Master Key)
更改为任何值。但是,出于安全考虑,最好选择一个安全且随机的密钥,切勿共享,并且务必妥善保管。
$ cat << EOF >/etc/systemd/system/meilisearch.service [Unit] Description=MeiliSearch After=systemd-user-sessions.service [Service] Type=simple ExecStart=/usr/bin/meilisearch --http-addr 127.0.0.1:7700 --env production --master-key Y0urVery-S3cureAp1K3y [Install] WantedBy=default.target EOF
有关 MeiliSearch 身份验证和 API 密钥的更多信息,请参阅 身份验证文档。有关 MeiliSearch 选项和标志的更多信息,请参阅 MeiliSearch 配置选项
目前,尚未是将您的 MeiliSearch 实例暴露给外部世界的时候。为了使其在您自己的环境中安全运行,请将其在本地 127.0.0.1
地址上可用。这意味着只有在您的机器上运行的程序才被允许向您的 MeiliSearch 实例发出请求。
2.2. 启用并启动服务
您刚刚构建的服务文件就是创建服务所需的全部。现在您必须启用 (enable)
它,告诉操作系统我们希望它在每次启动时运行 MeiliSearch。然后,您可以启动 (start)
该服务,使其立即运行。通过检查服务状态 (status)
来确保一切正常运行。
# Set the service meilisearch $ systemctl enable meilisearch # Start the meilisearch service $ systemctl start meilisearch # Verify that the service is actually running $ systemctl status meilisearch -# --- Expected output --- ● meilisearch.service - MeiliSearch Loaded: loaded (/etc/systemd/system/meilisearch.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2020-04-10 14:27:49 UTC; 1min 8s ago Main PID: 14960 (meilisearch)
至此,MeiliSearch 已安装并正在运行。它受到保护,可避免最终的崩溃、系统重启以及运行时可能遇到的绝大多数问题。但它仍然隐藏在您的机器的围墙(或防火墙)内,并且无法从外部世界访问。如果您对 MeiliSearch 的所有请求都是由同一台机器上的另一个应用程序完成的,那么您可以到此为止。
但您可能希望将 MeiliSearch 开放给外部世界,而目前它处于隔离状态。让我们以安全的方式解决这个问题。
步骤 3:保护并完成您的设置。使用反向代理、域名和 HTTPS
现在是时候安全地让您的全新 MeiliSearch 可供外部世界请求了。为此,您将使用网络上可用的两种主要技术:反向代理和 SSL/TLS。
3.1. 使用 Nginx 创建反向代理
反向代理本质上是一个应用程序,它将处理外部世界与您的内部应用程序之间的所有通信。Nginx 将接收外部 HTTP 请求并将它们重定向到 MeiliSearch。当 MeiliSearch 完成其出色的工作后,它将将其响应传达给 Nginx,然后 Nginx 会将该响应转发给最初发送请求的用户。这是一种通过添加一个健壮、安全、快速的守门人(如 Nginx,它是网上最安全、最有效的工具之一,当然也是开源的!)来隔离和保护任何应用程序的常用方法!
反向代理在安全性、性能、可扩展性和日志记录方面非常有用。如果您是反向代理的新手,您可能会喜欢这篇解释反向代理的原理和方法的文章。
将 Nginx 配置为代理服务器非常简单。首先,在您的机器上安装它。
# Install Nginx on Debian $ apt-get install nginx -y
首先,删除默认配置文件很重要,因为 HTTP 的默认端口 端口 80
默认被 Nginx 使用。因此,尝试将其用于 MeiliSearch 将会产生冲突。用您自己的配置文件替换默认文件。您也可以通过在 Nginx 配置文件中指定,让 MeiliSearch 监听另一个端口,但本教程不会涵盖此选项。
# Delete the default configuration file for Nginx $ rm -f /etc/nginx/sites-enabled/default # Add your configuration file specifying the Reverse Proxy settings $ cat << EOF > /etc/nginx/sites-enabled/meilisearch server { listen 80 default_server; listen [::]:80 default_server; server_name _; location / { proxy_pass http://127.0.0.1:7700; } } EOF
最后,再次启用并启动 Nginx 服务,以确保其仍然可用。
# Reload the operating system daemons / services $ systemctl daemon-reload # Enable and start Nginx service $ systemctl enable nginx $ systemctl restart nginx
MeiliSearch 现已启动,部署在生产环境中,使用安全的 API 密钥,并由 Nginx 反向代理提供服务。您现在应该能够从外部世界向您的服务器发送请求。打开您的网络浏览器并访问:(http://您的IP地址)。该 IP 地址与您在步骤 1 中通过 SSH 连接到机器时使用的 IP 地址相同。
如果您想了解更多关于使用 Nginx 作为反向代理的信息,请参阅此专用文档。
唯一剩下的问题是 MeiliSearch 通过 HTTP 处理请求时没有任何额外的安全性。通过 HTTP 传输的内容很容易被攻击者读取或修改,并且有人可能会获得您数据的全部或部分访问权限。为了防止这种情况发生,使用 HTTPS 很重要,它将使您能够使用 SSL/TLS 证书,并安全地传输数据。
3.2. 为您的 MeiliSearch 设置 SSL/TLS
SSL 将允许用户或客户端与 MeiliSearch 建立经过身份验证的连接。通过这种方式,用户可以在发送敏感数据或对其发出任何请求之前验证服务器的身份。然后,数据以加密方式发送,只有 MeiliSearch 服务器才能解密,从而为您提供快速、可靠和自动的安全层。
在大多数情况下,启用 SSL 时,您可能希望使用自己的域名(或子域名)。您需要遵循的第一步是注册您自己的域名并更改 DNS 记录。要使您的域名指向您新安装的 MeiliSearch 服务器,您只需添加一个指向用于连接您自己的服务器的 IP 地址的 A 记录
。这个过程简单快速,但对于每个域名提供商来说可能会有所不同。因此,本文不会涵盖该过程。
当您注册域名并添加
A 记录
后,您应该能够通过使用该域名直接请求 MeiliSearch。
为了说明这一点,如果您注册了域名example.com
,那么请求索引的操作将在 http://example.com/indexes 进行。
一旦您的域名设置完毕,您就可以配置 SSL/TLS 并使用 HTTPS 了。您有两种不同的选择来实现此目标。第一种是使用 Certbot,一个令人惊叹、免费且非常易于使用的工具。如果您已经拥有由证书颁发机构 (Certificate Authority 或 CA)
为您的域名颁发的 SSL 证书,第二种选择涵盖了您需要遵循的步骤。然后,您就可以安全地在生产环境中使用 MeiliSearch 了!
3.2. 选项 A:Certbot
在您的 Linux 服务器中使用 Certbot 非常简单直接。该工具将为您的域名生成一个免费的 SSL/TLS 证书,并自动处理其在您服务器上的安装。Certbot 文档包含针对许多操作系统和服务器的详细说明,但我们将遵循Debian 上 Certbot 与 Nginx 的使用说明。
首先,在您的系统上安装软件包
$ sudo apt-get install certbot python-certbot-nginx -y
让我们运行 Certbot 脚本,按照指导完成安装过程
certbot --nginx
输入您的电子邮件地址,同意条款和条件,然后输入您的域名。之后您将看到以下选项
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1: No redirect - Make no further changes to the webserver configuration. 2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for new sites, or if you're confident your site works on HTTPS. You can undo this change by editing your web server's configuration.
我们建议您选择选项 2,将 HTTP 重定向到 HTTPS 并始终使用安全连接。您应该能够通过 SSL 请求您的域名,例如 https://example.com
或 https://example.com/indexes
。
3.2. 选项 B:自定义 SSL/TLS 证书
当证书颁发机构 (Certificate Authority)
为您颁发 SSL 证书时,您会收到至少两个包含加密密钥的文件
- 您的证书(通常命名为
your_domain_name.pem
或example.pem
) - 您的密钥(通常命名为
your_domain_name.key
或example.key
)
example.pem
和example.key
将在以下示例中使用。请务必将example
替换为您自己的证书文件名。
您所需要做的就是将证书文件存储在一个安全的位置,并使用适当的文件系统安全权限。然后,在 Nginx 配置中设置证书的位置。强烈建议将所有 HTTP 请求重定向到 HTTPS(端口 80 到 443)。
首先,让我们将您的证书文件复制到它们的常规目录中,以便服务器能够找到它们
# Create a directory /etc/ssl/example to store the certificate files $ mkdir -p /etc/ssl/example # Move your files to /etc/ssl/example. We will suppose that your # files are called example.pem and example.key $ mv path-to-your-files/example.pem /etc/ssl/example/ $ mv path-to-your-files/example.key /etc/ssl/example/
最后,我们创建一个新的 Nginx 配置文件,然后重启守护进程和 Nginx 服务
请记住,将两个
server_name
字段中的example.com
替换为您的实际域名
# Replace example.com in both `server_name` fields with your own domain name $ cat << EOF > /etc/nginx/sites-enabled/meilisearch server { listen 80 default_server; listen [::]:80 default_server; server_name example.com; return 301 https://\$server_name\$request_uri; } server { server_name example.com; location / { proxy_pass http://127.0.0.1:7700; } listen [::]:443 ssl ipv6only=on; listen 443 ssl; access_log /var/log/nginx/nginx.vhost.access.log; error_log /var/log/nginx/nginx.vhost.error.log; ssl_certificate /etc/ssl/example/example.pem; ssl_certificate_key /etc/ssl/example/example.key; } EOF $ systemctl restart nginx
您的 SSL 证书应该正在工作,并且 Nginx 应该能够找到它们。现在,所有对 http://example.com
的请求都将被重定向到 https://example.com
结论
您已遵循主要步骤,以提供安全稳定的服务。您的 MeiliSearch 实例应该已启动并正在运行,处于安全环境中,并准备好在最常见问题发生时仍保持可用。此外,它还受带有您自己域名和 API 密钥的反向代理保护,因此您的数据和配置仅可由受信任的客户端访问。与您的服务器的通信现已加密。此外,每次发送敏感数据之前,其身份都会以快速自动的方式进行验证。
您现在可以开始使用您的生产就绪型 MeiliSearch了!