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 环境中,服务
是一个可以在操作系统启动时启动并在后台持续运行的进程。它最大的优势之一是使您的程序随时可用。即使发生一些执行问题或崩溃,服务也会重新启动,您的程序将再次运行。
如果您不熟悉服务和
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. 启用并启动服务
您刚刚构建的服务文件是创建服务所需的全部内容。现在您必须 启用
它,以告诉操作系统我们希望在每次启动时都运行 MeiliSearch。然后您可以 启动
该服务以使其立即运行。通过检查服务 状态
来确保一切运行顺畅。
# 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 可供外部世界请求了。为此,您将使用 Web 上可用的两项主要技术:反向代理和 SSL/TLS。
3.1. 使用 Nginx 创建反向代理
反向代理基本上是一个应用程序,它将处理外部世界和您的内部应用程序之间的所有通信。Nginx 将接收外部 HTTP 请求并将它们重定向到 MeiliSearch。当 MeiliSearch 完成其出色的工作后,它会将响应传递给 Nginx,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 提供服务。您现在应该能够从外部世界向您的服务器发送请求。打开您的 Web 浏览器并访问:(http://your-ip-address)。IP 地址与您在步骤 1 中用于通过 SSH 连接到您的机器的地址相同。
如果您想了解更多关于使用 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,这是一个很棒、免费且非常易于使用的工具。如果您已经拥有从 证书颁发机构或 CA
为您的域名颁发的 SSL 证书,则第二个选项涵盖了您需要遵循的步骤。然后,您将准备好在生产环境中安全地使用 MeiliSearch!
3.2. 选项 A:Certbot
在您的 Linux 服务器中使用 certbot 非常简单直接。此工具将为您的域名生成一个免费的 SSL/TLS 证书,并自动处理其在您的服务器上的安装。certbot 文档包含针对许多操作系统和服务器的详细说明,但我们将遵循 Debian 上带有 Nginx 的 Certbot 的说明。
首先,在您的系统上安装软件包
$ 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 证书
当 证书颁发机构
为您颁发 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 服务
请记住将
example.com
在两个server_name
字段中替换为您自己的域名
# 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 了!