How to Install Magento 2 with Nginx and Letsencrypt on Ubuntu 18.04

Magento is a widely used Open Source e-commerce software and content management system for e-commerce websites based on the PHP Zend Framework. It uses MySQL or MariaDB as database backend. The Magento development has been started in 2008 by Varien.

In this tutorial, I will show you how to install Magento 2 with Nginx, PHP 7.1 FPM, and MySQL as the database. I will use ubuntu 18.04 (Bionic Beaver) as server operating system. If you don't have a minimal server setup yet, please see this tutorial to get a proper base setup.

Prerequisites

  • Ubuntu 18.04
  • 2GB or more RAM memory
  • Root privileges

What we will do

  1. Install Nginx on Ubuntu 18.04
  2. Install and Configure PHP-FPM 7.1
  3. Install and Configure MySQL Server
  4. Install and Configure Magento 2
    1. Install PHP Composer
    2. Download Magento 2
    3. Install Magento Components
    4. Generate SSL Letsencrypt
    5. Configure Nginx Virtual Host for Magento
    6. Magento Post-Installation
  5. Testing

Step 1 - Install Nginx on Ubuntu 18.04 LTS

In this tutorial, we will be using the Nginx web server for our Magento installation.

Log in to the server, update the repository, and upgrade all packages.

sudo apt update
sudo apt upgrade

Now install the Nginx web server using the apt command below.

sudo apt install nginx -y

After the installation is complete, start the Nginx service and enable it to launch every time at system boot.

systemctl start nginx
systemctl enable nginx

Nginx web server has been installed, check it using netstat command and make sure the HTTP port 80 is on the 'LISTEN' state. Another way is by using curl command as below.

netstat -plntu
curl -I localhost

Install Nginx web server

Step 2 - Install and Configure PHP-FPM 7.1

After the Nginx web server installation, we will install PHP 7.1 on the server as Magento does not support PHP 7.2 yet. We will install PHP-FPM with all extensions needed by Magento 2.

List of PHP extensions needed for Magento 2 installation:

  • bc-math
  • ctype
  • curl
  • dom
  • gd, ImageMagick 6.3.7 (or later) or both
  • intl
  • mbstring
  • mcrypt
  • hash
  • openssl
  • PDO/MySQL
  • SimpleXML
  • soap
  • spl
  • libxml
  • xsl
  • zip
  • json
  • iconv

For this guide, we will install PHP-FPM packages from the PPA repository. We will be using the 'ondrej/php' repository.

Install the 'software-properties-common' package and add the 'ondrej/php' repository using commands below.

sudo apt install software-properties-common -y
sudo add-apt-repository ppa:ondrej/php -y

Install PHP 7.1

Now install PHP-FPM 7.1 with all extensions needed.

sudo apt install php7.1-fpm php7.1-mcrypt php7.1-curl php7.1-cli php7.1-mysql php7.1-gd php7.1-xsl php7.1-json php7.1-intl php-pear php7.1-dev php7.1-common php7.1-mbstring php7.1-zip php7.1-soap php7.1-bcmath -y

After the installation is complete, check the PHP version and installed extensions using PHP commands.

php -v
php -me

Check PHP installation

Next, we will configure the php.ini file for the PHP-FPM and PHP-CLI.

Edit the php.ini files using vim.

vim /etc/php/7.1/fpm/php.ini
vim /etc/php/7.1/cli/php.ini

Change the value of those lines as below.

memory_limit = 512M
max_execution_time = 180
zlib.output_compression = On

Save and exit.

Now restart the PHP-fpm service and enable it to launch every time at system boot.

systemctl restart php7.1-fpm
systemctl enable php7.1-fpm

The PHP-FPM 7.1 installation and configuration has been completed, check the service using netstat command.

netstat -pl | grep php

And you will get the PHP-fpm socks file as below.

Check PHP-FPM socket

Step 3 - Install and Configure MySQL Server

The Magento software requires MySQL 5.6.x, and the Magento 2.1.2 or later require the MySQL 5.7.x. In this tutorial, we will install latest MySQL server 5.8 on the Ubuntu 18.04 system.

Install MySQL 5.8 using the apt command below.

sudo apt install mysql-server mysql-client -y

After the installation is complete, start the MySQL service and enable it to launch every time at system boot.

systemctl start mysql
systemctl enable mysql

Now we will configure the MySQL root password using 'mysql_secure_installation' command.

mysql_secure_installation

In this MySQL 5.8 version, there is a security improvement for the MySQL password policy. You need to choose the password policy - 0 for the LOW policy, 1 for the MEDIUM policy, and 2 for a STRONG password policy.

For this guide, we will be using the 'MEDIUM' password policy, and it's recommended to use the 'STRONG' password policy on the production server.

Choose number '1' and press Enter, then type your new MySQL 'root' password.

Secure MySQL installation

 Remove anonymous users? (Press y|Y for Yes, any other key for No) : Y
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : Y
Remove test database and access to it? (Press y|Y for Yes, any other key for No) : Y
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : Y

The MySQL root password has been set up.

Next, we will create a new database for our Magento installation. We will create a new database named  'magentodb' with user 'magentouser' and the password is '[email protected]#'.

Login to the MySQL shell using the root user.

mysql -u root -p

Now run MySQL queries below to create the database and user.

create database magentodb;
create user [email protected] identified by '[email protected]#';
grant all privileges on magentodb.* to [email protected] identified by '[email protected]#';
flush privileges;

The MySQL server installation and configuration for the Magento installation has been completed.

Create MySQL database and user for Magento

Step 4 - Install and Configure Magento 2

In this step, we will install Magento 2.2.4 latest version from Github repository. We will install the PHP composer for installing the Magento components, download Magento from Github repository, configure Nginx virtual host for Magento, and install Magento using the web-based post installation.

- Install PHP Composer

Install PHP Composer on ubuntu 18.04 using the apt command below.

sudo apt install composer -y

After the installation is complete, check the composer version installed on the system.

composer -V

Install PHP composer

The latest version PHP Composer has been installed.

- Download Magento 2

Go to the '/var/www' directory and download the Magento archive source code from Github using wget command.

cd /var/www/
wget https://github.com/magento/magento2/archive/2.2.4.tar.gz

Now extract the Magento archive file and rename the directory to 'magento2'.

tar -xf 2.2.4.tar.gz
mv magento2-2.2.4/ magento2/

The Magento source code has been downloaded, and the '/var/www/magento2' directory will be the web root for the Magento site.

- Install Magento Components

Install Magento components using the PHP composer. Go to the 'magento2' directory and install all the PHP components needed by Magento using the 'composer' command.

cd /var/www/magento2
composer install -v

After the installation is complete, you will get the result as shown below.

Check composer version

- Generate SSL Letsencrypt

We will secure our Magento installation using SSL from Letsencrypt. Install the Letsencrypt using the apt command below.

sudo apt install letsencrypt -y

After the installation is complete, stop the nginx service.

systemctl stop nginx

Now generate the SSL certificates for the domain name using certbot command as below.

certbot certonly --standalone -d magento.hakase-labs.pw

Type your email address, accept the Letsencrypt TOS, then type 'N' for email sharing.

Enable Let's encrypt SSL certificate

When it's complete, you will get the result as below.

SSL cert issues successfully

The Letsencrypt SSL certificate files have been generated to the '/etc/letsencrypt/live' directory.

- Configure Nginx Virtual Host

Go to the '/etc/nginx/sites-available' directory and create new virtual host file 'magento' using vim.

cd /etc/nginx/sites-available/
vim magento

Paste the following configuration there.

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

server {
    listen 80;
    listen [::]:80;
    server_name magento.hakase-labs.pw;
    return 301 https://$server_name$request_uri;
}

server {

        listen 443 ssl;
        server_name magento.hakase-labs.pw;

        ssl on;
        ssl_certificate /etc/letsencrypt/live/magento.hakase-labs.pw/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/magento.hakase-labs.pw/privkey.pem;

        set $MAGE_ROOT /var/www/magento2;
        set $MAGE_MODE developer;
        include /var/www/magento2/nginx.conf.sample;
}

Save the configuration and exit.

Now activate the virtual host by creating the symbolic link for the Magento virtual host file to the 'sites-enabled' directory.

ln -s /etc/nginx/sites-available/magento /etc/nginx/sites-enabled/

Test nginx configuration file and make sure there is no error.

nginx -t

Now restart the PHP-FPM and Nginx service.

systemctl restart php7.1-fpm
systemctl restart nginx

And change the owner of Magento web-root directory to the 'www-data' user and group.

chown -R www-data:www-data /var/www/magento2/

The nginx virtual host for Magento has been added.

- Magento Post-Installation

Open the web browser and type the Magento URL. Mine is:

https://magento.hakase-labs.pw/

For the 'Terms and Agreement', click the 'Agree and Setup Magento' button.

Magento web installer

Now check all system and server configuration for Magento 'Readlines Check', and make sure it 'passes' all system and configuration check as below.

Check prerequisites

Now click 'Next' button.

Database configuration for Magento - type all our database info and click 'Next'.

Database configuration

For the web configuration, change the 'store address' to HTTPS, 'Magento Admin Address' with your admin path URL and uncheck the 'Apache Rewrites', because we're using the Nginx web server.

Web configuration

Click the 'Next' button again.

Leave the 'Customize Your Store' as default and click 'Next'.

Customize Magento store

Type your admin user and password, then click 'Next'.

Setup the admin account

And click 'Install Now' button to install Magento.

Start Magento installation

And when installation is complete, you will get the 'success' result as below.

Magento installation successful

Now we need to disable write access for the '/var/www/magento2/app/etc' directory. Run the command below.

sudo chmod -w /var/www/magento2/app/etc

Magento has been installed on to the Ubuntu 18.04 Bionic Beaver server.

Step 5 - Testing

Type the Magento URL home address and make sure you get the Magento default home page. Mine is: https://magento.hakase-labs.pw/

Magento homepage

Now login to the Magento admin dashboard by visiting the URL defined during the installation 'admin_hakase'. Mine is:

https://magento.hakase-labs.pw/admin_hakase/

Magento backend login

Type the username and password, then click the 'Sign in' button.

And you will get the Magento admin dashboard as below.

Magento dashboard

Magento 2 has been installed on Ubuntu 18.04 with Nginx web server, MySQL database, and PHP-FPM 7.1.

Additional:

If you get an error about a missing Magento indexer cronjob, then you can solve it by generating the crontab script using the command below.:

cd /var/www/magento2
sudo -u www-data php bin/magento cron:install --force

Now check the list crontab script for the 'www-data' user.

crontab -u www-data -l

Setup Magento indexer cronjob

Reference

Share this page:

Suggested articles

8 Comment(s)

Add comment

Comments

By: Ralfa at: 2018-06-21 05:30:35

I ran into problem, I installed nginx, mysql as specified above but didn't install SSL, my config for nginx is as follows

"upstream fastcgi_backend {

     server  unix:/run/php/php7.1-fpm.sock;

 }

server {

        listen 80;

        server_name www.mysite.com;

        set $MAGE_ROOT /var/www/html/mysite;

        include /var/www/html/mysite/nginx.conf.sample;

}"

And when i enter www.mysite.com in browser, its not resolved. Anything wrong?

By: Pietro at: 2018-06-29 13:34:27

Wow this guide is amazing, but how can I setup my site to work even with http because right now I appears only with https

By: Pietro at: 2018-07-02 15:32:17

But I got a problem after a simple bin/magento setup:upgrade, I get the error HTTP ERROR 500 can you please help me ?is it something about file permissions ?

By: shaju at: 2018-07-07 21:38:12

 use 

 chown -R www-data /var/www/magento2                        solve the probleam

By: Raphael at: 2018-07-20 20:16:36

Ok, this worked verry well.  I changed 2.2.4 to 2.2.5 now that it is out.  Some of the instructions are missing "sudo" and caused hickups. adding them where the command failed seemed to resolve the issue.  I was hoping to install with sample data but the sample-data archive does not seem to have the json files needed.  

Thank you for this write-up. it is verry helpful.

 

By: Raphael at: 2018-07-20 20:38:16

Did I miss something about Let's Encrypt certificate renewal?  I thought we needed to set a schedule to do this...  thanks

By: till at: 2018-07-23 11:08:08

There is nothing missing. Ubuntu renews Let's encrypt certs automatically, there is a system-wide cronjob in /etc/cron.d/.

By: Alexeii at: 2018-11-24 20:55:26

Amazing guide thank you!