검색 엔진에 대한 Nginx 구성

이 항목에서는 TLS(전송 계층 보안) 암호화와 HTTP 기본 인증을 함께 사용하여 웹 서버와 검색 엔진(Elasticsearch 또는 OpenSearch) 간의 통신을 보호하는 예를 설명합니다. 다른 유형의 인증도 선택적으로 구성할 수 있습니다. 해당 정보에 대한 참조를 제공합니다.

(이전 용어인 SSL(Secure Sockets Layer)은 TLS와 혼용하여 자주 사용됩니다. 이 항목에서는 TLS ​을 참조합니다.

WARNING
별도로 지정하지 않는 한 이 항목의 모든 명령은 root 권한이 있는 사용자로 입력해야 합니다.

Recommendations

다음 사항을 권장합니다.

  • 웹 서버에서 TLS를 사용합니다.

    TLS는 이 주제의 범위를 벗어나지만, 프로덕션에서 자체 서명된 인증서가 아닌 실제 인증서를 사용하는 것이 좋습니다.

  • 검색 엔진은 웹 서버와 동일한 호스트에서 실행됩니다. 다른 호스트에서 검색 엔진 및 웹 서버를 실행하는 것은 이 항목의 범위를 벗어납니다.

    검색 엔진과 웹 서버를 동일한 호스트에 배치하는 장점은 암호화된 통신을 가로채는 것을 불가능하게 만든다는 것이다. 검색 엔진 웹 서버는 Adobe Commerce 웹 서버와 동일하지 않아도 됩니다. 예를 들어 Adobe Commerce은 Apache를 실행할 수 있고 Elasticsearch/OpenSearch는 nginx를 실행할 수 있습니다.

    검색 엔진이 공개 웹에 노출되는 경우 인증을 구성해야 합니다. 검색 엔진 인스턴스가 네트워크 내에서 보호되는 경우 필요하지 않을 수 있습니다. 호스팅 공급자와 협력하여 인스턴스를 보호하기 위해 구현해야 하는 보안 조치를 결정하십시오.

TLS에 대한 추가 정보

다음 리소스 중 하나를 참조하십시오.

프록시 설정

NOTE
2.4.4에 OpenSearch 지원이 추가되었습니다. OpenSearch는 호환 가능한 Elasticsearch 포크입니다. 자세한 내용은 OpenSearch로 Elasticsearch 마이그레이션을 참조하십시오.

이 섹션에서는 Adobe Commerce에서 이 서버에서 실행 중인 검색 엔진을 사용할 수 있도록 nginx를 unsecure 프록시로 구성하는 방법에 대해 설명합니다. 이 섹션에서는 HTTP 기본 인증 설정에 대해 설명하지 않습니다. nginx와의 보안 통신에서 설명합니다.

NOTE
이 예제에서 프록시가 보안되지 않은 이유는 보다 쉽게 설정하고 확인할 수 있기 때문입니다. 원하는 경우 이 프록시에 TLS를 사용할 수 있습니다. 그렇게 하려면 보안 서버 블록 구성에 프록시 정보를 추가해야 합니다.

전역 구성에서 추가 구성 파일 지정

전역 /etc/nginx/nginx.conf에 다음 줄이 포함되어 있는지 확인하여 다음 섹션에서 설명한 다른 구성 파일을 로드합니다.

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

nginx를 프록시로 설정

이 섹션에서는 ngnx 서버에 액세스할 수 있는 사용자를 지정하는 방법에 대해 설명합니다.

  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을(를) 설치합니다.

    • 우분투: 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에 대한 액세스 설정

이 섹션에서는 ngnx 서버에 액세스할 수 있는 사용자를 지정하는 방법에 대해 설명합니다.

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 명령을 사용하여 클러스터 상태를 가져오려면 사용자 이름과 암호를 입력해야 합니다.
  • Admin에서 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

For example:

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