How to Setup Magento 2 With Varnish and Apache on Ubuntu 16.04
Magento is a free and open source Content Management System built in PHP, Zend framework and MySQL database. It is very popular eCommerce web application that runs on top of many open source applications such as Apache, MySQL and many more. Magento comes with lots of built-in modules that is used to add more functionality.
Varnish Cache is a powerful open source web application accelerator also known as a caching HTTP reverse proxy. It is used to speed up your website by caching a copy of a webpage the first time a user visits. Magento and Varnish is a known combination to increase site performance significantly. Varnish is integrated by default in Magento 2. You will only need to make some configuration changes to make it work.
In this tutorial, we will learn how to install Magento 2 with Varnish as a full page cache on Ubuntu 16.04 server.
Before starting, it is recommended to update your system with the latest package by running the following command:sudo apt-get update -ysudo apt-get upgrade -y
Once your system is up-to-date, restart your system and log in with sudo user.
Magento won't function without installing LAMP stack (Apache, PHP, MariaDB). First, install Apache web server and varnish by running the following command:sudo apt-get install apache2 varnish -y
After installing Apache, start Apache service and enable it to start on boot time by running the following command:sudo systemctl start apache2sudo systemctl enable apache2
Magento is written in PHP language, so you also need to install PHP with all the libraries to your system. You can install all of them by running the following command:sudo apt-get install php7.0 libapache2-mod-php7.0 php7.0-mbstring php7.0-mysql php7.0-mcrypt php7.0-xsl php-imagick php7.0-gd php7.0-cli php-pear php7.0-intl php7.0-curl php7.0-zip php7.0-gd php7.0-soap php7.0-xml -y
After installing PHP along with all required libraries, you will need to change few default PHP settings. You can do this by editing php.ini file:sudo nano /etc/php/7.0/cli/php.ini
Change the following lines:memory_limit = 512upload_max_filesize = 128Mzlib.output_compression = onmax_execution_time = 15000
Save and close the file when you are finished.
Magento uses MariaDB as a database. So you will need to install it to your server. You can install it by just running the following command:sudo apt-get install mariadb-server -y
After installing MariaDB, start MariaDB service and enable it to start at boot time by running the following command:sudo systemctl start mysqlsudo systemctl enable mysql
By default, MariaDB is not secured, so you will need to secure it. You can secure it by running the following command:sudo mysql_secure_installation
Answer all the questions as shown below:NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDBSERVERS IN PRODUCTION USE!PLEASE READ EACH STEP CAREFULLY!In order to log into MariaDB to secure it, we'll need the currentpassword for the root user.If you've just installed MariaDB, andyou haven't set the root password yet, the password will be blank,so you should just press enter here.Enter current password for root (enter for none): OK, successfully used password, moving on...Setting the root password ensures that nobody can log into the MariaDBroot user without the proper authorisation.You already have a root password set, so you can safely answer 'n'.Change the root password? [Y/n] n ... skipping.By default, a MariaDB installation has an anonymous user, allowing anyoneto log into MariaDB without having to have a user account created forthem.This is intended only for testing, and to make the installationgo a bit smoother.You should remove them before moving into aproduction environment.Remove anonymous users? [Y/n] Y ... Success!Normally, root should only be allowed to connect from 'localhost'.Thisensures that someone cannot guess at the root password from the network.Disallow root login remotely? [Y/n] Y ... Success!By default, MariaDB comes with a database named 'test' that anyone canaccess.This is also intended only for testing, and should be removedbefore moving into a production environment.Remove test database and access to it? [Y/n] Y - Dropping test database... ... Success! - Removing privileges on test database... ... Success!Reloading the privilege tables will ensure that all changes made so farwill take effect immediately.Reload privilege tables now? [Y/n] Y ... Success!Cleaning up...All done!If you've completed all of the above steps, your MariaDBinstallation should now be secure.Thanks for using MariaDB!
Next, login to MariaDB shell with the following command:mysql -u root -p
Enter your root password when prompt, then create a database for Magento with the following command:MariaDB [(none)]>CREATE DATABASE magento_db;
After creating database for Magento, create a username, and password with the following command:MariaDB [(none)]>CREATE USER 'magento'@'localhost' IDENTIFIED BY 'password';
Next, grant privileges to the Magento database with the following command:MariaDB [(none)]>GRANT ALL PRIVILEGES ON magento_db.* TO 'magento'@'localhost';
Next, run the FLUSH PRIVILEGES command reloade the privileges:MariaDB [(none)]>FLUSH PRIVILEGES;
Finally, exit from the MariaDB console with the following command:MariaDB [(none)]>\q
First, you will need to download the latest version of the Magento from their official website.
After downloading Magento, extract the downloaded zip file to the apache web root directory with the following command:sudo mkdir /var/www/html/magento/sudo unzip magento2-develop.zip -d /var/www/html/magento
Next, change the ownership of the magento directory and give proper permission to it:sudo chown -R www-data:www-data /var/www/html/magentosudo chmod -R 777 /var/www/html/magento
Next, you will need to install Composer to your system. Composer is a dependency manager that is used to install all required PHP dependencies. You can download and install Composer binary with the following command:curl -sS https://getcomposer.org/installer | phpsudo mv composer.phar /usr/bin/composer
Next, run composer command to install all the dependencies required by Magento:cd /var/www/html/magentosudo composer install
Once all the dependencies are installed, you can proceed to configure Apache for Magento.
Next, you will need to create an Apache virtual host file for Magento. Create a new Apache configuration file named magento.conf with the following command:sudo nano /etc/apache2/sites-available/magento.conf
Add the following lines:ServerAdmin [email protected]DocumentRoot /var/www/html/magentoServerName 192.168.15.189ServerAlias www.example.comOptions FollowSymLinksAllowOverride AllOrder allow,denyallow from allErrorLog /var/log/apache2/magento-error_logCustomLog /var/log/apache2/magento-access_log common
Save the file, then enable your virtual host with Apache rewrite module the following command:sudo a2ensite magentosudo a2enmod rewrite
Next, you will also need to change Apache listening port from 80 to 8080. Because we will reserve port 80 for varnish. To do so, open ports.conf file:sudo nano /etc/apache2/ports.conf
Change the file as shown below:Listen 8080
Finally, restart Apache service to apply this changes with the following command:sudo systemctl restart apache2
Magento is now installed, now it's time to install Magento through web browser.
To do so, open your web browser and type the URL http://192.168.15.189:8080, you should see the following page:
Now, agree to Terms and Conditions then click on the "Agree and Setup Magento" button, you should see the following page:
Check all the Readiness and click on the "Next" button, you should see the following page:
Provide your database details, like Database name, Database username and Password, then click on the "Next" button, you should see the following page:
Provide your website details and click on the "Next" button, you should see the following page:
Customize Magento as per your need and click on the "Next" button, you should see the following page:
Provide your admin user details and click on the "Next" button, you should see the following page:
Now, click on the "Install Now" button to start Magento installation. Once the installation is completed you should see the following page:
Note: Remember your Magento Admin URL: http://192.168.15.189/admin_wczta4. This will use to access Magento admin.
Now, click on "Launch Magento Admin" button, you should see the Magento login page as below:
Provide your Magento admin credentials and click on the "Sign In" button, you should see the Magent-o Dashboard as below:
From you Magento Admin dashboard click on the STORES button (leftside) > Configuration > ADVANCED > System > Full Page Cache, then Unselect use system value and select Varnish Cache from the Caching Application list, save the configuration, click on the Varnish Configuration link and click on the Export VCL for Varnish 4 button (this will export the varnish.vcl file in /var/www/html/magento/var directoy) as shown below:
Finally, flush the Magento cache with the following command:cd /var/www/html/magentosudo php bin/magento cache:flush
Once you are finished, you can proceed to configure varnish.
Magento is now installed and configured. It's time to configure varnish.
First, delete the /etc/varnish/default.vcl file and create a symlink from the exported varnish configuration:sudo rm -rf /etc/varnish/default.vclsudo ln -s /var/www/html/magento/var/varnish.vcl /etc/varnish/default.vcl
Next, you will need to create a systemd service file for varnish. You can do this by copying varnish.service from /lib/systemd/system/ to /etc/systemd/system/ directory:sudo cp /lib/systemd/system/varnish.service /etc/systemd/system/
After copying this file, you will need to make some changes in varnish.service file:sudo nano /etc/systemd/system/varnish.service
Make the following changes:[Unit]Description=Varnish HTTP acceleratorDocumentation=https://www.varnish-cache.org/docs/4.1/ man:varnishd[Service]Type=simpleLimitNOFILE=131072LimitMEMLOCK=82000ExecStart=/usr/sbin/varnishd -j unix,user=vcache -F -a :80 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,256mExecReload=/usr/share/varnish/reload-vclProtectSystem=fullProtectHome=truePrivateTmp=truePrivateDevices=true[Install]WantedBy=multi-user.target
Save the file when you are finished, then restart varnish service with the following command:sudo systemctl daemon-reloadsudo systemctl reload varnish.service
If everything is working fine, then you should be able to login to your Magento back-end by typing the following URL on your web browser:
You can also check whether varnish is enabled or not by running the following command:curl -I http://192.168.15.189/admin_wczta4
You should see that varnish is enabled:Date: Fri, 07 Jul 2017 17:10:01 GMTServer: Apache/2.4.18 (Ubuntu)Set-Cookie: store=default; expires=Sat, 07-Jul-2018 17:10:03 GMT; Max-Age=31536000; path=/; HttpOnlySet-Cookie: PHPSESSID=irp2k8cmrhct0dfh18qk7ap0i4; expires=Fri, 07-Jul-2017 18:10:04 GMT; Max-Age=3600; path=/; domain=192.168.15.189; HttpOnlyExpires: Thu, 07 Jul 2016 17:10:04 GMTCache-Control: max-age=0, must-revalidate, no-cache, no-storePragma: no-cacheLocation: http://192.168.15.189/admin_wczta4/?SID=irp2k8cmrhct0dfh18qk7ap0i4X-Content-Type-Options: nosniffX-XSS-Protection: 1; mode=blockX-Frame-Options: SAMEORIGINContent-Length: 0Content-Type: text/html; charset=UTF-8X-Varnish: 2Age: 0Via: 1.1 varnish-v4Connection: keep-alive
Congratulations! you have successfully configured Magento with Varnish on Ubuntu 16.04 server.