为搜索引擎配置Nginx

本主题讨论使用传输层安全性(TLS)加密和HTTP基本身份验证的组合来保护Web服务器和搜索引擎(Elasticsearch或OpenSearch)之间通信的示例。 您也可以选择配置其他类型的身份验证;我们会提供该信息的参考。

(旧称安全套接字层(SSL)经常与TLS互换使用。 在此主题中,我们称为​ TLS。)

WARNING
除非另有说明,否则此主题中的所有命令都必须以具有root权限的用户身份输入。

Recommendations

我们建议执行以下操作:

  • 您的Web服务器使用TLS。

    TLS超出了本主题的范围;但是,我们强烈建议您在生产中使用真正的证书,而不是自签名证书。

  • 您的搜索引擎与Web服务器在同一主机上运行。 在不同主机上运行搜索引擎和Web服务器超出了本主题的范围。

    将搜索引擎和Web服务器放在同一台主机上的优点是,它使得拦截加密通信变得不可能。 搜索引擎Web服务器不必与Adobe Commerce Web服务器相同;例如,Adobe Commerce可以运行Apache,而Elasticsearch/OpenSearch可以运行nginx。

    如果搜索引擎向公共Web公开,则应当配置身份验证。 如果您的搜索引擎实例在网络内受到保护,则可能没有必要。 与您的托管提供商合作,确定您应当实施哪些安全措施来保护实例。

有关TLS的更多信息

请参阅以下资源之一:

设置代理

NOTE
2.4.4中添加了OpenSearch支持。OpenSearch是兼容的Elasticsearch分支。 有关详细信息,请参阅将Elasticsearch迁移到OpenSearch

本节讨论如何将nginx配置为​ 不安全 ​代理,以便Adobe Commerce能够使用在此服务器上运行的搜索引擎。 本节不讨论设置HTTP基本身份验证;这将在与nginx🔗的安全通信中讨论。

NOTE
在此示例中,代理不受保护的原因是它更容易设置和验证。 如果需要,可以将TLS与此代理一起使用;要这样做,请确保将代理信息添加到安全服务器块配置中。

在全局配置中指定其他配置文件

请确保您的全局/etc/nginx/nginx.conf包含以下行,以便加载以下部分中讨论的其他配置文件:

include /etc/nginx/conf.d/*.conf;

将nginx设置为代理

本节讨论如何指定谁可以访问nginx服务器。

  1. 使用文本编辑器创建包含以下内容的文件/etc/nginx/conf.d/magento_es_auth.conf

    code language-conf
    server {
       listen 8080;
       location /_cluster/health {
          proxy_pass http://localhost:9200/_cluster/health;
       }
    }
    
  2. 重新启动nginx:

    code language-bash
    service nginx restart
    
  3. 通过输入以下命令验证代理是否正常工作:

    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)的用户编码密码。

要创建密码,请执行以下操作:

  1. 输入以下命令以确定是否已安装htpasswd

    code language-bash
    which htpasswd
    

    如果显示路径,则表明已安装;如果命令未返回任何输出,则表明未安装htpasswd

  2. 如有必要,请安装htpasswd

    • Ubuntu: apt-get -y install apache2-utils
    • CentOS: yum -y install httpd-tools
  3. 创建/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>应隐藏;即,它必须以句点开头。
  4. (可选)。 ​若要向密码文件添加其他用户,请输入相同的命令,但不使用-c (创建)选项:

    code language-bash
    htpasswd /etc/nginx/passwd/.<filename> <username>
    
  5. 验证/etc/nginx/passwd的内容是否正确。

设置对nginx的访问权限

本节讨论如何指定谁可以访问nginx服务器。

WARNING
显示的示例适用于​ 不安全 ​代理。 要使用安全代理,请将以下内容(监听端口除外)添加到安全服务器块。

使用文本编辑器修改/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;
}
NOTE
上例中显示的搜索引擎侦听端口仅为示例。 出于安全原因,我们建议您使用非默认监听端口。

为搜索引擎设置受限制的上下文

本节将讨论如何指定可以访问搜索引擎服务器的用户。

  1. 输入以下命令创建用于存储身份验证配置的目录:

    code language-bash
    mkdir /etc/nginx/auth/
    
  2. 使用文本编辑器创建包含以下内容的文件/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;
    }
    
  3. 如果您设置了安全代理,请删除/etc/nginx/conf.d/magento_es_auth.conf

  4. 重新启动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

在继续之前,必须刷新缓存并重新索引。

recommendation-more-help
0f8e7db5-0e9c-4002-a5b8-a0088077d995