为搜索引擎配置Nginx
本主题讨论使用传输层安全性(TLS)加密和HTTP基本身份验证的组合来保护Web服务器和搜索引擎(Elasticsearch或OpenSearch)之间通信的示例。 您也可以选择配置其他类型的身份验证;我们会提供该信息的参考。
(旧称安全套接字层(SSL)经常与TLS互换使用。 在此主题中,我们称为 TLS。)
root
权限的用户身份输入。Recommendations
我们建议执行以下操作:
-
您的Web服务器使用TLS。
TLS超出了本主题的范围;但是,我们强烈建议您在生产中使用真正的证书,而不是自签名证书。
-
您的搜索引擎与Web服务器在同一主机上运行。 在不同主机上运行搜索引擎和Web服务器超出了本主题的范围。
将搜索引擎和Web服务器放在同一台主机上的优点是,它使得拦截加密通信变得不可能。 搜索引擎Web服务器不必与Adobe Commerce Web服务器相同;例如,Adobe Commerce可以运行Apache,而Elasticsearch/OpenSearch可以运行nginx。
如果搜索引擎向公共Web公开,则应当配置身份验证。 如果您的搜索引擎实例在网络内受到保护,则可能没有必要。 与您的托管提供商合作,确定您应当实施哪些安全措施来保护实例。
有关TLS的更多信息
请参阅以下资源之一:
设置代理
本节讨论如何将nginx配置为 不安全 代理,以便Adobe Commerce能够使用在此服务器上运行的搜索引擎。 本节不讨论设置HTTP基本身份验证;这将在与nginx🔗的安全通信中讨论。
在全局配置中指定其他配置文件
请确保您的全局/etc/nginx/nginx.conf
包含以下行,以便加载以下部分中讨论的其他配置文件:
include /etc/nginx/conf.d/*.conf;
将nginx设置为代理
本节讨论如何指定谁可以访问nginx服务器。
-
使用文本编辑器创建包含以下内容的文件
/etc/nginx/conf.d/magento_es_auth.conf
:code language-conf server { listen 8080; location /_cluster/health { proxy_pass http://localhost:9200/_cluster/health; } }
-
重新启动nginx:
code language-bash service nginx restart
-
通过输入以下命令验证代理是否正常工作:
code language-bash curl -i http://localhost:<proxy port>/_cluster/health
例如,如果您的代理使用端口8080:
code language-bash curl -i http://localhost:8080/_cluster/health
类似于以下内容的消息显示成功:
code language-none HTTP/1.1 200 OK Date: Tue, 23 Feb 2019 20:38:03 GMT Content-Type: application/json; charset=UTF-8 Content-Length: 389 Connection: keep-alive {"cluster_name":"elasticsearch","status":"yellow","timed_out":false,"number_of_nodes":1,"number_of_data_nodes":1,"active_primary_shards":5,"active_shards":5,"relocating_shards":0,"initializing_shards":0,"unassigned_shards":5,"delayed_unassigned_shards":0,"number_of_pending_tasks":0,"number_of_in_flight_fetch":0,"task_max_waiting_in_queue_millis":0,"active_shards_percent_as_number":50.0}
与nginx的安全通信
本节讨论如何使用安全代理设置HTTP基本身份验证。 同时使用TLS和HTTP Basic身份验证可防止任何人截获与Elasticsearch、OpenSearch或您的应用程序服务器的通信。
由于nginx本身支持HTTP基本身份验证,因此我们建议将其覆盖,例如摘要式身份验证,在生产环境中不建议这样做。
其他资源:
有关更多信息,请参阅以下部分:
创建密码
我们建议您使用Apache htpasswd
命令为有权访问Elasticsearch或OpenSearch(在此示例中名为magento_elasticsearch
)的用户编码密码。
要创建密码,请执行以下操作:
-
输入以下命令以确定是否已安装
htpasswd
:code language-bash which htpasswd
如果显示路径,则表明已安装;如果命令未返回任何输出,则表明未安装
htpasswd
。 -
如有必要,请安装
htpasswd
:- Ubuntu:
apt-get -y install apache2-utils
- CentOS:
yum -y install httpd-tools
- Ubuntu:
-
创建
/etc/nginx/passwd
目录以存储密码:code language-bash mkdir -p /etc/nginx/passwd
code language-bash htpasswd -c /etc/nginx/passwd/.<filename> <username>
note warning WARNING 出于安全原因, <filename>
应隐藏;即,它必须以句点开头。 -
(可选)。 若要向密码文件添加其他用户,请输入相同的命令,但不使用
-c
(创建)选项:code language-bash htpasswd /etc/nginx/passwd/.<filename> <username>
-
验证
/etc/nginx/passwd
的内容是否正确。
设置对nginx的访问权限
本节讨论如何指定谁可以访问nginx服务器。
使用文本编辑器修改/etc/nginx/conf.d/magento_es_auth.conf
(不安全)或您的安全服务器块,内容如下:
server {
listen 8080;
server_name 127.0.0.1;
location / {
limit_except HEAD {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/passwd/.htpasswd_magento_elasticsearch;
}
proxy_pass http://127.0.0.1:9200;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /_aliases {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/passwd/.htpasswd_magento_elasticsearch;
proxy_pass http://127.0.0.1:9200;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
include /etc/nginx/auth/*.conf;
}
为搜索引擎设置受限制的上下文
本节将讨论如何指定可以访问搜索引擎服务器的用户。
-
输入以下命令创建用于存储身份验证配置的目录:
code language-bash mkdir /etc/nginx/auth/
-
使用文本编辑器创建包含以下内容的文件
/etc/nginx/auth/magento_elasticsearch.conf
:code language-conf location /elasticsearch { auth_basic "Restricted - elasticsearch"; auth_basic_user_file /etc/nginx/passwd/.htpasswd_magento_elasticsearch; proxy_pass http://127.0.0.1:9200; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }
-
如果您设置了安全代理,请删除
/etc/nginx/conf.d/magento_es_auth.conf
。 -
重新启动nginx并继续下一部分:
code language-bash service nginx restart
验证
本节将讨论验证HTTP基本身份验证是否正常工作的两种方法:
- 使用
curl
命令验证必须输入用户名和密码才能获取群集状态 - 在管理员中配置HTTP基本身份验证
使用curl
命令验证群集状态
输入以下命令:
curl -i http://<hostname, ip, or localhost>:<proxy port>/_cluster/health
例如,如果在搜索引擎服务器上输入命令,而您的代理使用的是端口8080:
curl -i http://localhost:8080/_cluster/health
将显示以下消息来指示验证失败:
HTTP/1.1 401 Unauthorized
Date: Tue, 23 Feb 2016 20:35:29 GMT
Content-Type: text/html
Content-Length: 194
Connection: keep-alive
WWW-Authenticate: Basic realm="Restricted"
<html>
<head><title>401 Authorization Required</title></head>
<body bgcolor="white">
<center><h1>401 Authorization Required</h1></center>
</body>
</html>
现在尝试以下命令:
curl -i -u <username>:<password> http://<hostname, ip, or localhost>:<proxy port>/_cluster/health
例如:
curl -i -u magento_elasticsearch:mypassword http://localhost:8080/_cluster/health
此时,该命令会成功,并显示一条类似于以下内容的消息:
HTTP/1.1 200 OK
Date: Tue, 23 Feb 2016 20:38:03 GMT
Content-Type: application/json; charset=UTF-8
Content-Length: 389
Connection: keep-alive
{"cluster_name":"elasticsearch","status":"yellow","timed_out":false,"number_of_nodes":1,"number_of_data_nodes":1,"active_primary_shards":5,"active_shards":5,"relocating_shards":0,"initializing_shards":0,"unassigned_shards":5,"delayed_unassigned_shards":0,"number_of_pending_tasks":0,"number_of_in_flight_fetch":0,"task_max_waiting_in_queue_millis":0,"active_shards_percent_as_number":50.0}
在管理员中配置HTTP基本身份验证
执行搜索引擎配置 中讨论的相同任务,但 除外,请单击 Enable HTTP Auth 列表中的 Yes,然后在提供的字段中输入用户名和密码。
单击 Test Connection 以确保它正常工作,然后单击 Save Config。
在继续之前,必须刷新缓存并重新索引。