Magento Tutorials

How to Improve Magento 2 Performance with AWS CloudFront?

Hello Magento Folks👋,

In this tutorial, I will help you to Improve Magento 2 performance by utilizing AWS CloudFront☁️. Let me first illuminate you all about Amazon CloudFront and how it works in improving website performance. Check our previously published article How to Integrate Amazon S3 Cloud Store with Your Magento Store.

Introduction:

Amazon CloudFront is one type of CDN that stands for a content delivery network. Amazon CloudFront’s name itself says that it is provided by Amazon that delivers static as well as dynamic data, provides APIs at high speed and low latency in the whole world, applications and videos. By integrating the Magento 2 with Amazon CloudFront CDN, you will be optimizing the performance of your Magento 2 store. Let’s Get Started🚀.

Checkout How to Configure Amazon S3 with Magento 2 stepwise solution.

Steps to Configure Magento 2 store with AWS CloudFront☁️:

Firstly, we will request a Magento 2 page from a web browser that has been processed by a server. On average Magento 2 loads 170 scripts per page. Additional loads are experienced for a server CPU and memory when the requests are incoming. This results in a rise in the costing of infrastructure for maintaining an acceptable level of page load time.

The following data is processed when the request is processed on installed Magento 2.4.

Page Number of Requests Size, KB
Homepage 236 88
Category Page 225 23.2
Product Page (Configurable) 338 348
CMS Page (Contact Us) 114 880

I will illustrate to you all how to configure Magento 2 with AWS CloudFront:

For this, you will need an AWS Account. If you don’t have then create a new one

Log In to the AWS account and open the Services tab and write down CloudFront.

From the popup, Choose CloudFront Global Content Delivery Network suggestion 

Now, from the AWS CloudFront Distributions page create the location for the Magento static files. 

Tap on the Create Distribution button for creating a web distribution

Now here are 2 steps to follow for creating.

Step 1: Provides 2 delivery method options i.e. Web & RTMP

Tap on getting Started below the Web delivery method option.

Static Content Distribution

Now we have to set the static file distribution from the Create Distribution page. 

Make sure you don’t change the specific settings for creating a static content distribution.

Take a reference to the below-recommended settings.

Static Content Distribution
Origin Domain Name magento24.magecomp.com
Origin Path pub/static
Origin ID static-magento24.magecomp.com
Viewer Protocol Policy Redirect HTTP to HTTPS
Allowed HTTP Methods GET, HEAD, OPTIONS
Cached HTTP Methods GET, HEAD, OPTIONS
Cache Based on Selected Request Headers Whitelist
Price Class Use Only US, Canada, Europe
SSL Certificate Default CloudFront Certificate (*.cloudfront.net)
Distributed State Enabled

Origin Protocol Policy and Viewer Protocol Policy settings are set to HTTPS if the domain connection is secure, if there is a non-secure connection of your domain then you have to set it to HTTP.

Note: Price Class setting is used only in Europe, Canada, US. 

Choose to Accept, Host, and Origin values for Whitelist Headers from Cache Based on Selected Request Headers 

After all the settings are given for the static distribution, tap on the Create Distribution option.

Here, the OPTIONS HTTP is utilized for the fonts and the HTML templates files are requested from the JavaScript files.

It takes approximately 15 minutes for the AWS CloudFront for creating the new distribution

After creating the distribution the Magento 2 static files should be accessible from the new CloudFront distribution.

Media Content Distribution

Similarly, we have to create the distribution for Magento 2 media files.

From the AWS CloudFront Distributions page tap on the Create Distribution option. Tap on Get Started below the Web delivery method option.

Media Content Distribution
Origin Domain Name magento24.magecomp.com
Origin Path pub/media
Origin ID media-magento24.magecomp.com
Viewer Protocol Policy HTTPS Only
Allowed HTTP Methods GET, HEAD
Cached HTTP Methods GET, HEAD
Cache Based on Selected Request Headers None
Price Class Use Only US, Canada, Europe
SSL Certificate Default CloudFront Certificate (*.cloudfront.net)
Distributed State Enabled

After all the settings are given 

After all the settings are given for the static distribution, tap on the Create Distribution option.

Now, these 2 distributions will be listed on the AWS CloudFront Distributions page.

Check out the new CloudFront Distribution you will be able to access the media files

Apache Configuration

Magento 2 should send precise response headers to permit the requests for static as well as media files from the various domains. 

Now, we have to provide extra Apache information before using the new AWS CloudFront Distributions. 

The Access-Control-Allow-Origin error will be faced for all the static and media files that are requested from the content delivery network or AWS CloudFront if additional header’s responses are absent.

Apache Headers Module

For utilizing the mod_headers module in .htaccess files it is compulsory to enable the Apache headers module.

For this you will have to use the below-given command [Ubuntu]:

$ a2enmod rewrite

For Restarting Apache [Ubuntu]:

$ service apache2 restart

The pub/static Instructions

The pub/static/.htaccess file gives by default headers for the static files. Now, these headers need to be adjusted for permitting requests from other domains. 

The pub/static/.htaccess before:

<code class="xml">
<IfModule mod_headers.c>
   <FilesMatch .*\.(ico|jpg|jpeg|png|gif|svg|js|css|swf|eot|ttf|otf|woff|woff2)$>
       Header append Cache-Control public
   </FilesMatch>

   <FilesMatch .*\.(zip|gz|gzip|bz2|csv|xml)$>
       Header append Cache-Control no-store
   </FilesMatch>
</IfModule>
</code>

The pub/static/.htaccess after changes:

<code class="xml">
<IfModule mod_headers.c>
<FilesMatch .*\.(ico|jpg|jpeg|png|gif|svg|js|css|swf|eot|ttf|otf|woff|woff2|html|json)$>
   Header set Cache-Control "max-age=604800, public"
   Header set Access-Control-Allow-Origin "*"
   Header set Access-Control-Allow-Methods "GET, OPTIONS"
   Header set Access-Control-Max-Age "604800"
   Header set Access-Control-Allow-Headers "Host, Content-Type, Origin, Accept"
</FilesMatch>

   <FilesMatch .*\.(zip|gz|gzip|bz2|csv|xml)$>
       Header append Cache-Control no-store
   </FilesMatch>
</IfModule>
</code>

Note: All the file extension lists in the FilesMatch option are modified and 2 extra extensions are included namely JSON and HTML. For the HTML extension, the Catalog Store settings must be visited again because of the used .html URL suffix for the Categories and Products. 

The pub/media Instructions

The pub/media/.htaccess file has to include the response headers for the images

The mod_headers.c section from the pub/media/.htaccess before:

<code class="xml">
<IfModule mod_headers.c>
   <FilesMatch .*\.(ico|jpg|jpeg|png|gif|svg|js|css|swf|eot|ttf|otf|woff|woff2)$>
       Header append Cache-Control public
   </FilesMatch>

   <FilesMatch .*\.(zip|gz|gzip|bz2|csv|xml)$>
       Header append Cache-Control no-store
   </FilesMatch>
</IfModule>
</code>

The mod_headers.c section from the pub/media/.htaccess after:

<code class="xml">
<FilesMatch .*\.(ico|jpg|jpeg|png|gif|svg|js|css|swf|eot|ttf|otf|woff|woff2)$>
   Header append Cache-Control max-age=604800
   Header set Access-Control-Allow-Origin "*"
</FilesMatch>
</code>

Magento 2 Configuration

Step 1: Navigate to Stores > Configuration > General > Web > Base URLs (Secure)

Note: If you have multiple stores, then these changes will be reflected in the specific store only.

Step 2: Add AWS CloudFront URLs to the Secure Base URL for Static View Files and similarly Secure Base URL for User Media Files.

Save the Config and refresh the cache from the Cache Management Section.

Goto Magento 2 frontend and review domain name changes of the static and media files.

CNAME for CDN

In case you desire to give friendly URLs for the CloudFront distributions then the configuration of CNAME records should be done for AWS CloudFront. 

static.magento24.magecomp.com points to d1mi2coqmkv4dg.cloudfront.net
media.magento24.magecomp.com points to d2q46a7mnom7n7.cloudfront.net

Changes in AWS CloudFront 

For the AWS CloudFront Distribution, a new CNAME record should be added. Add the Alternative Domain Names (CNAMEs) by clicking on distribution from the AWS CloudFront Distributions list.

Also, choose the Custom SSL Certificate for the SSL Certificate settings.

Now for this, you have to again create a new SSL Certificate for the custom domain. The AWS Certificate Manager will permit you to create an SSL Certificate in some minutes. Tap to YES, edit the button to save changes. Approximately it will take up to 15 minutes for alteration to be propagated for the distribution.

Performance Results

Mainly the performance metrics are on the basis of built-in Full Page Cache. Check the results on Pingdom. The page load time involves the rendering of all scripts loaded on a page.

Here during the testing, the minification of the static content is disabled.

Page Page Load Time,

Without CDN

Page Load Time,

With CDN

Homepage 2.191 sec 1.1 sec
Category Page 3.8 sec 2.22 sec
Product Page (Configurable) 1.9 sec 0.8 sec
CMS Page (Contact Us) 1.53 sec 0.7 sec

Here you can verify that the number of incoming HTTP GET requests are decreased when the webserver with the CDN is configured. It helps in decreasing the usage of CPU and Memory on the server and can serve more numbers of the incoming requests from the users.

Conclusion:

Content Delivery Network for an E-commerce store is a must-have nowadays. Especially, when the business grows and the number of customers increases year-to-year. The AWS CloudFront is a great service for the reasonable pricing and edge locations coverage.

Hence, improve your Magento 2 website performance by configuring Magento 2 with AWS CloudFront. When the business grows and the customers are increased every year then this is very useful for providing an excellent customer experience. 

In case any difficulties in the above steps then let me know in the comment section below I will help you.

Hit 5 ⭐⭐⭐⭐⭐ stars and share↗️ with your Magento business friends. 

Stay connected🔗 and Keep Developing👨‍💻

Happy Reading🙂.

Click to rate this post!
[Total: 7 Average: 5]
Gaurav Jain

Gaurav Jain is Co-Founder and Adobe Certified Expert-Magento Commerce Business Practitioner. Being Computer Engineer👨‍💻 and possessing Extensive Marketing skills he handles all kinds of customer Queries and his Happy😀 & Helping🙏 Nature makes customer's day Delightful. When he isn’t working, you’ll find Gaurav Reading on Books📖 or Traveling🚗. Also, he is Speaker at Magento Meetups.

Recent Posts

Magento 2: Add Quantity Increment and Decrement on Category Page

Hello Magento Friends, In this blog, we will discuss about adding quantity increment and decrement…

22 hours ago

How to Integrate ChatGPT with Laravel Application?

In this guide, we'll explore how to integrate ChatGPT, an AI-powered chatbot, with a Laravel…

4 days ago

What are Net Sales? How to Calculate Your Net Sales?

In the world of business, understanding financial metrics is crucial for making informed decisions and…

6 days ago

Magento 2 Extensions Digest April 2024 (New Release & Updates)

Welcome to the MageComp Monthly Digest, where we bring you the latest updates, releases, and…

6 days ago

The ABCs of Geofencing: Definition, Features and Uses

In this era, businesses are always on the lookout for ways to engage with their…

1 week ago

How to Delete Product Variant in a Shopify Remix App using GraphQL Mutations?

Managing a Shopify store efficiently involves keeping your product catalog organized. This includes removing outdated…

1 week ago