# Set up Magento 2 with Redis, Varnish and Nginx as SSL termination

URL: https://sohaib.com/blog/set-up-magento-2-with-redis-varnish-and-nginx-as-ssl-termination
Author: Sohaib Khan
Published: Nov 17, 2017
Updated: Sep 8, 2026
Category: E-commerce Solutions

> In this article, we will show you how to install Magento 2 on an Ubuntu 16.04 VPS with MariaDB, PHP-FPM 7.0, Varnish as a full page cache, Nginx as SSL termination and Redis for session storage and page caching. This…

In this article, we will show you how to install Magento 2 on an Ubuntu 16.04 VPS with MariaDB, PHP-FPM 7.0, Varnish as a full page cache, Nginx as SSL termination and Redis for session storage and page caching.  This guide should work on other Linux VPS systems as well but was tested and written for an [Ubuntu 16.04 VPS](https://www.rosehosting.com/ubuntu-vps.html "Ubuntu VPS Hosting").

## Login to your VPS via SSH

```plaintext
ssh my_sudo_user@my_server
```

## Update the system and install necessary packages

```bash
sudo apt-get update && sudo apt-get -y upgrade
sudo apt-get -y install curl nano git
```

## Install MariaDB 10.0

Install the latest MariaDB 10.0 server from the official Ubuntu repositories:

```bash
sudo apt-get install -y mariadb-server
```

When the installation is complete, run the following command to secure your installation:

```plaintext
mysql_secure_installation
```

Next, we need to create a database for our Magento installation.

```plaintext
mysql -uroot -p
```

```plaintext
MariaDB [(none)]> CREATE DATABASE magento;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON magento.* TO 'magento'@'localhost' IDENTIFIED BY 'my_strong_password';
MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> \q
```

## Install PHP 7.0, composer and all required PHP modules

To install the latest stable version of PHP 7.0 and all necessary modules, run:

```bash
sudo apt-get -y install php-fpm php-cli php-gd php-imagick php-mysql php-mcrypt php-pear php-curl php-intl php-xsl php-zip php-mbstring
```

Change few default PHP settings:

```bash
sudo sed -i "s/memory_limit = .*/memory_limit = 256M/" /etc/php/7.0/fpm/php.ini
sudo sed -i "s/upload_max_filesize = .*/upload_max_filesize = 128M/" /etc/php/7.0/fpm/php.ini
sudo sed -i "s/zlib.output_compression = .*/zlib.output_compression = on/" /etc/php/7.0/fpm/php.ini
sudo sed -i "s/max_execution_time = .*/max_execution_time = 18000/" /etc/php/7.0/fpm/php.ini
```

Composer is a dependency manager for PHP with which you can install packages. Composer will pull in all the required libraries and dependencies you need for your project.

```bash
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
```

## Install Magento 2 from Github

Clone the Magento repository to the `~/myMagentoSite.com` directory using the following command:

```bash
sudo git clone https://github.com/magento/magento2.git /var/www/myMagentoSite.com
```

Get the latest stable release, at the time of the writing it’s Magento 2.1.2:

```bash
cd /var/www/myMagentoSite.com
```

```bash
sudo git checkout $(git describe --tags $(git rev-list --tags --max-count=1))
```

Run composer to install all Magento dependencies:

```bash
sudo composer install
```

To continue with the installation you can either use the installation wizard or the command line, in this guide we will use the latter.

```bash
sudo bin/magento setup:install \
--base-url=http://myMagentoSite.com/ \
--db-host=localhost \
--db-name=magento \
--db-user=magento \
--db-password=my_strong_password \
--admin-firstname=First  \
--admin-lastname=Last \
--admin-email=user@myMagentoSite.com \
--admin-user=admin \
--admin-password=my_strong_password123 \
--language=en_US \
--currency=USD \
--timezone=America/Chicago \
--use-rewrites=1
```

If the installation is successful you will see something like below:

```plaintext
: Magento installation complete.
: Magento Admin URI: /admin_mejj1n
```

Run the `crontab` command to create a cronjob

```plaintext
crontab -u www-data -e
```

and add the following line:

```plaintext
* * * * * /usr/bin/php /var/www/myMagentoSite.com/bin/magento cron:run | grep -v "Ran jobs by schedule" >> /var/www/myMagentoSite.com/var/log/magento.cron.log
```

Finally, set the correct permissions:

```bash
sudo chown -R www-data: /var/www/myMagentoSite.com
```

## Install and configure Nginx

Install Nginx from the official Ubuntu repositories::

```bash
sudo apt-get -y install nginx
```

Create a new Nginx server block with the following content:

```bash
sudo nano /etc/nginx/sites-available/myMagentoSite.com
```

```nginx
upstream fastcgi_backend {
  server   unix:/run/php/php7.0-fpm.sock;
}

server {
    server_name myMagentoSite.com www.myMagentoSite.com;
    listen 80;
    set $MAGE_ROOT /var/www/myMagentoSite.com;
    set $MAGE_MODE developer; # or production

    access_log /var/log/nginx/myMagentoSite.com-access.log;
    error_log /var/log/nginx/myMagentoSite.com-error.log;

    include /var/www/myMagentoSite.com/nginx.conf.sample;
}
```

Activate the server block by creating a symbolic link :

```bash
sudo ln -s /etc/nginx/sites-available/myMagentoSite.com /etc/nginx/sites-enabled/myMagentoSite.com
```

Delete the default configuration:

```bash
sudo rm -f /etc/nginx/sites-enabled/default
```

Test the Nginx configuration and restart nginx:

```bash
sudo nginx -t
sudo service nginx restart
```

You should be now able to login to your Magento back-end by going to `http://myMagentoSite.com/admin_mejj1n` using the information you set when running the `bin/magento setup:install` .

## Install and configure Varnish

Installing Varnish is as simple as running the following command:

```bash
sudo apt-get install varnish
```

From you Magento Admin dashboard click on the STORES link (left sidebar) -> Configuration -> ADVANCED -> System -> Full Page Cache Unselected Use system value and from the Caching Application list, select Varnish Cache (Recommended), save the configuration, click on the Varnish Configuration link and click on the Export VCL for Varnish 4 button. The `varnish.vcl` file which we will use will be exported in the `/var/www/myMagentoSite.com/var/` directory. Flush the Magento cache with:

```bash
sudo php bin/magento cache:flush
```

Delete the `/etc/varnish/default.vcl` and symlink it to the exported varnish configuration.

```bash
sudo rm -f /etc/varnish/default.vcl
sudo ln -sf /var/www/myMagentoSite.com/var/varnish.vcl /etc/varnish/default.vcl
```

To change varnish port from 6081 to 80, we need to edit the systemd service configuration. Create a new `customexec.conf` file

```bash
sudo mkdir -p /etc/systemd/system/varnish.service.d
sudo nano /etc/systemd/system/varnish.service.d/customexec.conf
```

paste the following:

```plaintext

ExecStart=
ExecStart=/usr/sbin/varnishd -j unix,user=vcache -F -a :80 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,256m
```

and reload systemd units

```bash
sudo systemctl daemon-reload
```

Now we need to change Nginx listening port from 80 to 8080 and enable Nginx SSL termination with HTTP2, to do that open the Nginx configuration file and change it as follows:

```bash
sudo nano /etc/nginx/sites-available/myMagentoSite.com
```

```nginx
upstream fastcgi_backend {
  server   unix:/run/php/php7.0-fpm.sock;
}

server {
    server_name myMagentoSite.com www.myMagentoSite.com;
    listen 8080;
    set $MAGE_ROOT /var/www/myMagentoSite.com;
    set $MAGE_MODE production; # or developer

    access_log /var/log/nginx/myMagentoSite.com-access.log;
    error_log /var/log/nginx/myMagentoSite.com-error.log;

    include /var/www/myMagentoSite.com/nginx.conf.sample;
}

server {

    listen 443 ssl http2;
    server_name myMagentoSite.com www.myMagentoSite.com;

    ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem; # change with your SSL cert
    ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key; # change with your SSL key
    ssl_protocols              TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers               'AES128+EECDH:AES128+EDH:!aNULL';
    ssl_session_cache    shared:SSL:10m;
    ssl_session_timeout 24h;
    keepalive_timeout 300s;

    location / {
        proxy_pass http://127.0.0.1;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Ssl-Offloaded "1";
        proxy_set_header      X-Forwarded-Proto https;
        proxy_set_header      X-Forwarded-Port 443;
        #proxy_hide_header X-Varnish;
        #proxy_hide_header Via;
        proxy_set_header X-Forwarded-Proto $scheme;

    }

}
```

If you don’t already have an SSL certificate, you can purchase a trusted SSL certificate [here](https://www.rosehosting.com/ssl-certificates.html). Restart Varnish and Nginx:

```bash
sudo systemctl restart nginx
sudo systemctl restart varnish
```

Change the base url to https and flush the cache

```bash
sudo bin/magento setup:store-config:set --base-url="https://myMagentoSite.com"
sudo php bin/magento cache:flush
```

If everything is setup correctly now you should be able to login to your Magento back-end by going to `https://myMagentoSite.com/admin_mejj1n`.

Stuck somewhere? [Get a VPS](https://www.rosehosting.com/linux-vps-hosting.html) from us and we’ll do all of this for you, free of charge!

## Install and configure Redis caching

Redis is a key-value in memory data store and we will use it to replace the default Magento 2 Zend\_Cache\_Backend\_File backend cache.  Install Redis by running the following command:

```bash
apt-get install php-redis redis-server
```

To configure your Magento installation to use Redis for session storage open the `app/etc/env.php` file and change/add the following:

```bash
sudo nano /var/www/myMagentoSite.com/app/etc/env.php
```

change:

```javascript
  'session' =>
  array (
    'save' => 'files',
  ),
```

with:

```javascript
'session' =>
   array (
   'save' => 'redis',
   'redis' =>
      array (
	'host' => '127.0.0.1',
	'port' => '6379',
	'password' => '',
	'timeout' => '2.5',
	'persistent_identifier' => '',
	'database' => '0',
	'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'
    )
),
```

and to use Redis for page caching add:

```javascript
'cache' =>
array(
   'frontend' =>
   array(
      'default' =>
      array(
         'backend' => 'Cm_Cache_Backend_Redis',
         'backend_options' =>
         array(
            'server' => '127.0.0.1',
            'port' => '6379'
            ),
    ),
    'page_cache' =>
    array(
      'backend' => 'Cm_Cache_Backend_Redis',
      'backend_options' =>
       array(
         'server' => '127.0.0.1',
         'port' => '6379',
         'database' => '1',
         'compress_data' => '0'
       )
    )
  )
),
```

Finally flush the cache again:

```bash
sudo php bin/magento cache:flush
```

## Further Optimizations

To further optimize your Magento installation from you Magento admin dashboard: 1. Go to STORES -> Configuration -> CATALOG -> Catalog -> Use Flat Catalog Category, select Yes and click Save Config. 2. Go to STORES -> Configuration -> ADVANCED -> Developer -> JavaScript Settings and set both Merge JavaScript Files and Minify JavaScript Files to Yes and click Save Config.. 3. Go to STORES -> Configuration -> ADVANCED -> Developer -> CSS Settings and set both Merge CSS Files and Minify CSS Files to Yes and click Save Config. 4. Consider using a CDN – Content Delivery Network Do not forget to flush the cache:

```bash
sudo php bin/magento cache:flush
```

* * *

All Credit for this HOW TO GOTO [www.rosehosting.com](http://www.rosehosting.com) Excellent Article
