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服务器
第一步:安装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,而目前它是隔离的。让我们以安全的方式解决这个问题。
第三步:保护并完成您的设置。使用反向代理、域名和HTTPS
现在是时候安全地让您的全新MeiliSearch可从外部世界请求了。为此,您将使用网络上两种主要的技术:反向代理和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提供服务。您现在应该能够从外部世界向您的服务器发送请求。打开您的网络浏览器并访问:(http://your-ip-address)。IP地址与您在第一步中通过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,这是一个免费、易于使用的出色工具。如果您已经拥有从证书颁发机构或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,并始终使用安全连接。您应该能够使用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服务。
请记住将两个
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**了!