Magento 성능 최적화 설명
게시 됨: 2022-03-11Magento 성능은 가장 중요합니다. 로딩 속도는 웹사이트의 전환율에 직접적이고 측정 가능한 영향을 미치므로 최적화된 Magento 설치는 Magento 매장의 성공과 비즈니스 전반의 성공에 매우 중요합니다.
이 기사에서는 Magento 개발자가 Magento 2 설치를 최적화할 수 있는 몇 가지 방법을 제시하고 다음을 수행하는 방법을 설명합니다.
- 타사 모듈 확인 및 병목 현상 찾기
- 전체 페이지 캐시 사용
- 전체 페이지 캐시용 파일이 아닌 바니시
- 전체 페이지 캐시가 작동하는지 확인하십시오. 너무 쉽게 깨질 수 있습니다.
- 프로덕션 모드 활성화
- CSS/JS 축소
- 플랫 테이블 사용
- 당신이 감당할 수 있는 가장 빠른 호스팅을 얻으십시오
- 이미지 최적화
- "일정에 따라 업데이트"하는 인덱서
- GZIP 압축
- 카탈로그 페이지 및 검색에서 Elasticsearch를 사용하십시오.
- 페이지 로드 후 서버에 대한 불필요한 Ajax 호출 확인(세션 잠금을 유발할 수 있음)
- 페이지 캐시 및 세션 스토리지용 Redis
타사 모듈 확인 및 병목 현상 찾기
잘못된 코드, 더 이상 사용되지 않는 방법을 사용하거나 안정적인 최신 버전의 Magento와의 호환성 문제가 있는 타사 Magento 모듈이 많이 있습니다. 많은 요청을 식별하는 가장 좋은 방법은 프로파일러를 사용하는 것입니다. 이는 페이지에 있는 MySQL 쿼리 수와 동일한 쿼리 수를 식별하는 데 도움이 됩니다. 이를 알면 이러한 쿼리를 하나로 압축하여 Magento의 속도를 높일 수 있습니다.
주니어 개발자가 Magento에서 잘못하고 있는 주요 사항 중 하나는 루프 내부에 모델을 로드하는 것입니다. 가능한 한 그것을 피하십시오. 필요한 모든 것이 포함된 전체 컬렉션을 로드한 다음 반복합니다. 항상 시간과 공간의 복잡성을 염두에 두고 최적화된 방식으로 알고리즘을 구축하십시오.
레이아웃이 로드되는 방식과 가장 느리게 수행되는 템플릿 블록을 확인한 다음 해당 코드를 살펴보세요. 루프에 대한 호출 로드와 같은 통찰력 있는 데이터를 찾을 수 있는 모델 CRUD 메트릭을 살펴보십시오.
Magento 전체 페이지 캐시
사용자가 상점에 액세스할 때 서버에 요청이 이루어집니다. 이 요청은 특정 작업 및 데이터베이스 쿼리를 수행한 다음 사용자에게 표시할 해당 HTML을 반환하는 PHP에 의해 처리됩니다. 전체 페이지 캐시는 해당 HTML 응답을 저장하므로 다음 동일한 요청이 모든 백엔드 처리 및 데이터베이스 쿼리를 건너뛰고 직접 반환합니다. 이렇게 하면 웹 사이트 응답이 훨씬 빨라집니다.
Magento 최적화 노력의 일부로 전체 페이지 캐시를 사용하면 웹사이트 속도를 엄청나게 높일 수 있습니다. 이렇게 하면 페이지의 캐시된 버전이 만들어지고 각 요청에 대한 모든 쿼리를 실행하는 대신 사용자에게 전달됩니다. 물론 모든 페이지가 캐시되는 것은 아닙니다. 예를 들어 장바구니 페이지는 캐시되지 않습니다. 그렇지 않으면 모든 사용자에게 페이지의 첫 번째 캐시된 버전이 표시됩니다. 이는 사용자 및 세션별 동적 페이지 또는 페이지 섹션입니다.
Magento 전체 페이지 캐시를 활성화하려면 다음 CLI 명령을 실행할 수 있습니다.
php bin/magento cache:enable full_page
캐시 유형을 활성화하려면 CLI 명령을 실행할 수 있습니다.
php bin/magento cache:enable
Magento Admin에서 관리자로 로그인하여 수행할 수도 있습니다.
- 시스템 > 도구 > 캐시 관리로 이동
- 활성화하려는 캐시 유형 을 선택하십시오.
- 작업 드롭다운에서 활성화 를 선택하고 제출 을 클릭합니다.
전체 페이지 캐시에 바니시 사용
전체 페이지 캐시를 활성화할 때 파일이 아닌 Varnish를 사용하여 처리합니다. Magento는 프로덕션에서 Varnish(또는 Redis)를 사용할 것을 강력히 권장합니다. 통합 전체 페이지 캐싱(파일 시스템 또는 데이터베이스에 대한)은 Varnish보다 훨씬 느리고 Varnish는 HTTP 트래픽을 가속화하도록 설계되었습니다.
공식 Magento 2 설명서에서 Varnish를 설치하고 구성하는 방법에 대한 전체 가이드를 찾을 수 있습니다.
Varnish를 사용하도록 Magento를 구성하려면 Magento Admin에 관리자로 로그인합니다.
- 스토어 > 구성 > 고급 > 시스템 > 전체 페이지 캐시 로 이동합니다.
- 캐싱 응용 프로그램 목록에서 Varnish Caching 을 클릭합니다.
- 공개 콘텐츠에 대한 TTL 필드에 값을 입력합니다.
- Varnish Configuration 을 확장하고 Varnish 구성에 대한 특정 정보를 입력합니다.
전체 페이지 캐시 작동 확인: 쉽게 깨짐
전체 페이지 캐시는 Magento 2에서 쉽게 깨질 수 있습니다. 예를 들어 캐시에서 블록을 제외하려면 블록을 선언할 때 XML 레이아웃에서 cacheable="false"
속성을 사용하지 마십시오. 이렇게 하면 해당 블록뿐만 아니라 해당 블록을 포함하는 전체 페이지에 대한 캐시가 비활성화됩니다. 그것은 사람들이 저지르는 것을 보아온 실수입니다.
레이아웃에서 cacheable="false"
속성을 찾아 어떤 블록이 설정되고 어떤 페이지에서 해당 블록이 호출되는지 확인합니다. 따라서 사소한 페이지에 캐시 문제가 있는지 식별할 수 있습니다.
페이지가 수동으로 캐시되었는지 여부를 테스트할 수도 있습니다. 로컬 또는 스테이지 환경에서 스토어를 개발자 모드로 설정합니다.
- Magento 캐시 지우기
- 브라우저에서 페이지 로드
- 브라우저 디버그 네트워크 탭에서 페이지 헤더를 검사합니다.
- X-Magento-Cache-Debug: MISS를 찾습니다.
- 페이지를 새로고침하면 HIT로 변경되어야 합니다.
HIT로 변경되지 않으면 페이지가 캐시되지 않고 캐시가 작동하지 않는다는 의미입니다.
프로덕션 모드를 활성화하는 것을 잊지 마십시오
Magento에는 기본 , 개발자 및 프로덕션 모드의 세 가지 실행 모드가 있습니다.
프로덕션 모드는 프로덕션 시스템에 배포하기 위한 것입니다. 이 모드는 예외를 숨기고 캐시에서만 정적 파일을 제공하며 Magento Admin에서 캐시 유형을 활성화하거나 비활성화할 수 없습니다. 또한 자동 코드 파일 컴파일을 방지합니다.
스토어 작업 및 개발 중에는 개발자 모드가 활성화됩니다. 사이트를 라이브 서버에 배포할 때 프로덕션 모드로 전환하는 것을 잊지 마십시오!
현재 모드를 확인하는 CLI 명령은 다음과 같습니다.
php bin/magento deploy:mode:show
프로덕션 모드로 전환하는 CLI 명령은 다음과 같습니다.
php bin/magento deploy:mode:set production
개발자 모드로 전환하는 CLI 명령은 다음과 같습니다.
php bin/magento deploy:mode:set developer
여기에서 다양한 Magento 모드에 대한 자세한 정보를 찾을 수 있습니다.
CSS/JS 축소
CSS 및 JS 파일을 최소화하는 것은 Magento 2 속도 최적화의 중요한 요소입니다. 그것들을 축소함으로써 파일의 모든 공백, 탭 및 개행을 제거합니다. 결과 파일은 더 적은 문자를 가지므로 더 작은 크기를 가지므로 더 빨리 다운로드됩니다.
Magento에는 이 기능이 내장되어 있으며 Admin에서 CSS/JS 축소를 활성화할 수 있습니다. JavaScript 축소를 활성화하려면 다음 단계를 따르세요.
- Magento를 프로덕션 모드로 전환
- 스토어 > 구성 > 고급 > 개발자 로 이동합니다.
- Javascript 파일 축소 옵션을 예로 설정
- 구성 저장
- 시스템 > 캐시 관리 페이지에서 캐시 플러시
CSS 축소를 활성화하려면 다음 단계가 필요합니다.
- Magento를 프로덕션 모드로 전환
- 스토어 > 구성 > 고급 > 개발자 > CSS 설정 으로 이동합니다.
- CSS 파일 축소 옵션을 예로 설정
- 구성 저장
- 시스템 > 캐시 관리 페이지에서 캐시 플러시
참고: JS 파일을 병합하지 말고 축소만 하십시오 .
플랫 테이블 활성화
Magento는 값 유형에 따라 엔티티의 속성을 여러 테이블에 저장하는 EAV(엔티티 속성 값) 모델을 사용합니다. 여러 테이블을 사용하여 데이터를 검색하려면 여러 테이블에 대한 조인 및 요청이 필요하므로 쿼리 속도가 느려질 수 있습니다.
Magento에는 카탈로그 및 제품에 플랫 테이블을 사용할 수 있는 옵션이 있습니다. 플랫 테이블은 엔터티의 모든 속성을 하나의 테이블로 병합하여 생성됩니다. 데이터를 요청할 때 하나의 테이블을 쿼리해야 하므로 훨씬 빨라집니다.
Magento는 모든 인덱싱에서 플랫 테이블을 생성하고 업데이트합니다. Magento Admin에 관리자로 로그인하여 플랫 테이블을 활성화할 수 있습니다.
- 상점 > 구성 > 카탈로그 > 카탈로그 > 상점 첫화면 으로 이동하십시오.
- 플랫 카탈로그 범주 사용 에 대해 예 를 선택합니다.
- 플랫 카탈로그 제품 사용 에 대해 예 를 선택합니다.
- 구성 저장
빠른 Magento 호스팅 선택
Magento 최소 요구 사항을 확인하고 서버가 요구 사항을 충족하는지 확인하십시오. 여기에서 공식 Magento 2.2.x 기술 스택 요구 사항을 확인할 수 있습니다.
호스팅 구성은 Magento 2 성능에 매우 중요합니다. Magento를 위한 전용 호스팅 서비스도 있지만 이는 다른 어떤 것보다 마케팅에 관한 것일 수 있습니다.
결론: 프로젝트에 과도하지 않는 한 감당할 수 있는 가장 빠른 호스팅 솔루션을 얻으십시오.
마젠토 이미지 최적화
이미지의 크기는 분명히 웹사이트의 속도에 영향을 미칩니다. 예를 들어, 20개의 제품이 있는 카탈로그 페이지가 있고 각 제품 이미지의 크기가 1Mb인 경우 페이지가 로드될 때 총 20Mb가 다운로드되며 일부 시나리오(모바일 장치, 특정 지역 등의 제한된 대역폭).
이미지가 제대로 최적화되었는지, 품질과 크기의 비율이 좋은지 확인하세요. 또한 이미지의 크기가 CSS에 의해 조정되지 않았는지 확인하고 소스 파일의 크기를 필요한 특정 크기로 조정해야 합니다.
또 다른 기술은 페이지가 완전히 로드된 후 또는 사용자가 카탈로그를 스크롤하는 동안 이미지를 로드하는 지연 로드를 사용하는 것입니다.
AWS 또는 CDN을 사용하여 콘텐츠를 훨씬 더 빠르게 전달할 수도 있습니다. 비트맵 최적화 관점에서 AWS, CDN 및 기존 호스팅 간의 차이점을 간단히 살펴보겠습니다.
기존 호스팅
전통적인 방법은 이미지와 같은 콘텐츠를 웹사이트와 동일한 서버에 저장하는 것입니다. 이것은 디스크 공간과 대역폭의 상당 부분을 차지하여 상당한 서버 로드를 생성할 수 있습니다. 분명히 기존 호스팅으로 확장하는 것이 문제가 될 수 있습니다.
CDN(콘텐츠 전송 네트워크)
콘텐츠 전송 네트워크는 일반적으로 웹사이트의 콘텐츠 중 일부를 제공하여 서버의 부하를 줄이는 데 사용됩니다. 그 외에도 여러 네트워크를 사용하여 콘텐츠를 빠르게 제공하고 고가용성을 제공하여 고성능을 제공합니다.

AWS(아마존 클라우드프론트)
Amazon CloudFront는 네트워크 및 애플리케이션 수준 보호를 모두 제공하는 매우 안전한 CDN(콘텐츠 전송 네트워크)입니다. AWS를 시작하고 콘텐츠를 더 빠르게 제공하는 방법에 대한 이 자습서를 확인하십시오.
또한 AWS를 사용하여 쿼리 파라미터를 통해 전달된 차원을 기반으로 즉석에서 이미지 크기를 조정할 수 있습니다. 자세한 내용은 Amazon CloudFront 및 Lambda@Edge로 이미지 크기 조정에 대한 이 자습서를 참조하십시오.
인덱서를 "일정에 따라 업데이트"로 설정
Magento 인덱서는 " 저장 시 업데이트 " 또는 " 일정에 따라 업데이트 " 의 두 가지 모드로 설정할 수 있습니다.
제품, 속성 또는 범주를 저장할 때마다 "저장 시 업데이트"로 설정하면 특정 색인이 실행되기 시작합니다. 인덱서는 리소스를 소모하게 되어 서버 속도가 느려질 수 있습니다.
인덱서를 설정하는 가장 좋은 모드는 "일정에 따라 업데이트"입니다. 이런 식으로 설정한 특정 시간에 cron 작업에 의해 실행된다는 것을 확신할 수 있습니다. 웹사이트의 트래픽이 적은 시간을 선택하십시오.
다음 명령을 실행하여 현재 인덱서 모드를 볼 수 있습니다.
php bin/magento indexer:show-mode
또는 Magento Admin에서 다음으로 이동합니다.
시스템 > 인덱스 관리
다음 명령을 실행하여 인덱서 모드를 "일정에 따라 업데이트"로 변경할 수 있습니다.
php bin/magento indexer:set-mode schedule
다음 명령을 실행하여 인덱서 모드를 "저장 시 업데이트"로 변경할 수 있습니다.
php bin/magento indexer:set-mode realtime
그리고 여기 Magento Admin에 있습니다.
시스템 > 인덱스 관리: 모든 인덱서를 선택하고 작업 드롭다운에서 "일정에 따라 업데이트"를 선택합니다.
또한 관리로 이동하여 예약된 작업을 구성하여 다음을 수행할 수 있습니다.
스토어 > 설정 > 구성 > 고급 > 시스템 > 크론(예약된 작업)
"그룹에 대한 Cron 구성 옵션: 인덱스" 확장
GZIP 압축
Gzip은 더 빠른 네트워크 전송을 위해 파일을 압축하는 방법입니다. 압축을 사용하면 웹 서버에서 웹 사이트 사용자에게 더 빨리 로드되는 더 작은 파일 크기를 제공할 수 있습니다. 그러나 여기에는 비용이 따릅니다.
파일을 압축하는 동안 CPU를 로드하고 파일을 압축할수록 프로세스가 더 오래 걸립니다. 이렇게 하면 서버 CPU 로드가 증가할 수 있지만 대역폭 사용량도 상당히 감소할 수 있습니다. gzip을 사용하면 1에서 9까지의 다양한 압축 수준 중에서 선택할 수 있습니다.
레벨 1에서는 압축 시간이 가장 빠르지만 압축 비율은 낮습니다. 반대로 레벨 9에서는 압축률이 가장 높지만 속도는 낮습니다. gzip의 기본 구성은 속도보다 압축을 선호하는 레벨 6을 사용합니다. Nginx는 파일 크기보다 속도를 선호하는 레벨 1을 사용합니다.
gzip 압축을 켜고 Apache의 mod_deflate
모듈을 활성화하려면 .htaccess 파일을 업데이트하여 이를 추가하고 아래와 같이 적절한 줄의 주석 처리를 제거할 수 있습니다. mod_deflate
모듈은 정적 리소스를 브라우저로 전송하기 전에 더 작은 파일로 압축합니다.
<IfModule mod_deflate.c> ############################################ ## enable apache served files compression ## http://developer.yahoo.com/performance/rules.html#gzip # Insert filter on all content SetOutputFilter DEFLATE # Insert filter on selected content types only AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/x-javascript application/json image/svg+xml # Netscape 4.x has some problems... BrowserMatch ^Mozilla/4 gzip-only-text/html # Netscape 4.06-4.08 have some more problems BrowserMatch ^Mozilla/4\.0[678] no-gzip # MSIE masquerades as Netscape, but it is fine BrowserMatch \bMSIE !no-gzip !gzip-only-text/html # Don't compress images SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary # Make sure proxies don't deliver the wrong content Header append Vary User-Agent env=!dont-vary </IfModule>
카탈로그 페이지 및 검색에서 Elasticsearch 사용
웹 사이트 속도를 높일 수 있는 또 다른 방법은 카탈로그 페이지 및 검색 결과에 Elasticsearch를 사용하는 것입니다. Elasticsearch 서버를 설정하고 Magento 저장소를 연결하십시오. Elasticsearch를 사용하면 검색이 훨씬 빨라집니다.
이 공식 가이드는 Elasticsearch로 Magento를 구성하는 방법을 설명합니다.
Elasticsearch를 사용하도록 Magento를 구성하려면 Magento Admin에 관리자로 로그인합니다.
- 상점 > 설정 > 구성 > 카탈로그 > 카탈로그 > 카탈로그 검색 을 클릭하십시오.
- 검색 엔진 목록에서 다음 그림과 같이 Elasticsearch 또는 Elasticsearch 5.0+ 를 클릭합니다. ( Elasticsearch 5.0+ 옵션은 Magento 2.1에서 사용할 수 없습니다.)
불필요한 Ajax 호출 확인
페이지 로드 후 서버를 다시 호출하면 세션 잠금이 발생할 수 있습니다. 페이지에서 수행 중인 모든 Ajax 호출을 확인하는 방법은 Chrome의 DevTools를 사용하는 것입니다. 페이지를 마우스 오른쪽 버튼으로 클릭하고 검사를 선택하여 열 수 있습니다.
네트워크 탭으로 이동하면 XHR로 요청을 필터링할 수 있습니다. 이제 페이지의 모든 Ajax 요청을 볼 수 있고 특정 페이지에서 어떤 요청이 필요한지 확인할 수 있습니다.
페이지 캐시 및 세션 스토리지용 Redis
Redis는 기본적으로 Magento 2에서 사용되는 Zend_Cache_Backend_File
을 대체하는 선택적 백엔드 캐시 솔루션입니다.
왜 Redis를 사용합니까?
Redis를 사용하면 다음과 같은 여러 이점이 있습니다.
- PHP 세션 스토리지에도 사용할 수 있으므로 memcached를 Redis로 대체할 수 있습니다.
- Redis는 디스크 저장 및 마스터/슬레이브 복제를 지원하며 이는 memcached에서 지원하지 않는 요청이 많은 기능입니다. 복제는 단일 실패 지점을 방지하고 고가용성을 제공합니다.
- Redis는 파일의 태그를 인덱싱하여 작동하기 때문에 태그 작업은 모든 캐시 파일의 전체 스캔을 필요로 하지 않습니다.
- 백엔드는 foreach 루프 없이 태그 기반 캐시 정리를 지원합니다.
주요 단점도 있습니다.
- Redis는 메모리 내 저장소이므로 모든 데이터가 메모리에 맞아야 합니다. 즉, RAM 속도와 용량에 의해서만 제한됩니다.
세션 스토리지에 Redis를 사용하도록 Magento 구성
다음은 <your Magento install dir>app/etc/env.php
에 추가할 샘플 구성입니다.
'session' => array ( 'save' => 'redis', 'redis' => array ( 'host' => '127.0.0.1', 'port' => '6379', 'password' => '', 'timeout' => '2.5', 'persistent_identifier' => '', 'database' => '2', 'compression_threshold' => '2048', 'compression_library' => 'gzip', 'log_level' => '1', 'max_concurrency' => '6', 'break_after_frontend' => '5', 'break_after_adminhtml' => '30', 'first_lifetime' => '600', 'bot_first_lifetime' => '60', 'bot_lifetime' => '7200', 'disable_locking' => '0', 'min_lifetime' => '60', 'max_lifetime' => '2592000' ) ),
여기에서 매개변수에 대한 모든 세부 정보와 Redis 설치가 Magento와 함께 제대로 작동하는지 기본 확인을 수행하는 방법을 확인할 수 있습니다.
페이지 및 기본 캐시에 Redis를 사용하도록 Magento 구성
페이지 및 기본 캐시에 대해 Redis를 구성하는 두 가지 방법이 있습니다. <Magento install dir>app/etc/env.php
파일을 수동으로 편집하거나 명령줄을 사용할 수 있습니다. 이 방법은 유효성 검사도 제공하기 때문에 권장되는 방법입니다.
기본 캐시의 경우 다음 명령을 실행합니다.
php bin/magento setup:config:set --cache-backend=redis --cache-backend-redis-<parameter_name>=<parameter_value>...
Redis 기본 캐싱과 관련된 매개변수를 지정합니다.
페이지 캐시의 경우 다음 명령을 실행합니다.
Php bin/magento setup:config:set --page-cache=redis --page-cache-redis-server=redis.example.com --page-cache-redis-db=1
이 명령은 Redis 페이지 캐싱을 활성화하고 호스트를 redis.example.com
으로 설정하고 데이터베이스 번호를 1로 할당합니다. Magento DevDocs에서 모든 세부 정보를 확인할 수 있습니다.
Magento 성능 최적화 요약
우리는 Magento 2 성능 최적화에 대한 몇 가지 접근 방식을 다루었으므로 간단히 요약해 보겠습니다.
병목 현상을 식별하고 해결하면 데이터 처리에 큰 차이가 생깁니다. 전체 페이지 캐시 및 Varnish를 사용하면 웹 사이트 속도가 향상되고 HTTP 트래픽이 가속화됩니다. 변명의 여지 없이 라이브 서버의 프로덕션 모드에서 항상 Magento를 사용해야 합니다. 축소를 사용하여 CSS 및 JS 파일의 크기를 줄이십시오. 더 작은 파일은 더 빨리 다운로드되고 더 적은 대역폭을 사용합니다.
플랫 테이블을 활성화하여 데이터베이스 요청을 줄이고 데이터베이스 응답 시간을 개선합니다. 이미지를 최적화하고 가능하면 CDN을 사용하십시오. 일정에 따라 업데이트하도록 인덱서를 설정하고 Magento cron을 활성화합니다. gzip 압축을 활성화하면 다운로드할 파일의 크기도 줄어듭니다. Elasticsearch를 사용하면 카탈로그 페이지의 속도가 빨라지고 검색 결과 페이지가 훨씬 빠르게 로드됩니다. 기본 memcache보다 훨씬 빠른 페이지 캐시 및 세션 스토리지에 Redis를 사용합니다.
이러한 권장 사항을 모두 구현하거나 지금까지 사용하지 않은 몇 가지만 구현할 수 있습니다. 부부라도 Magento 성능을 개선하기에 충분해야 하며 더 많은 전환으로 전환되기를 바랍니다.