Read in 8 minutes

last updated 

How to Install Magento 2 on Ubuntu 18.04

Magento is leading enterprise-class e-commerce platform built on open source technology combining powerful features with flexibility and user friendly interface.

With features like Engaging Shopping Experiences, Flexible Modular Architecture and Enterprise-grade Scalability and Performance Magento is a platform of choice for most online merchants.

In this tutorial we will show you how to install Magento 2.3 on an Ubuntu 18.04 machine. We’ll be using Nginx as a web server, the latest PHP 7.2 and MySQL/MariaDB as a database server.

Prerequisites

Ensure that you have met the following prerequisites before continuing with this tutorial:

  • Have a domain name pointing to your public server IP. In this tutorial we will use example.com.
  • Nginx is installed on your Ubuntu server by following these instructions.
  • Have an SSL certificate installed for your domain to encrypt user’s information. You can install a free Let’s Encrypt SSL certificate by following these instructions.

To be able to access to the Magento 2 code repository you’ll need to generate authentication keys. If you don’t have a Magento Marketplace account, you can create one here. Once you create the account, please check these instructions on how to generate a new set of authentication keys.

Update the system packages to the latest versions and install the unzip utility:

sudo apt update && sudo apt upgrade
sudo apt install unzip

Creating MySQL database

If you have MySQL or MariaDB installed on your server you can skip this step, if not you can install the MySQL 5.7 server package from the Ubuntu’s default repositories by typing:

sudo apt install mysql-server mysql-client

For fresh MySQL installations, it is recommended to run the mysql_secure_installation command to improve the security of your MySQL server.

Login to the MySQL shell using the following command:

sudo mysql

From inside the mysql console, run the following SQL statement to create a new database named magento:

CREATE DATABASE magento;

Next, create a MySQL user account named magento and grant the necessary permissions to the user by running the following command:

GRANT ALL ON magento.* TO 'magento'@'localhost' IDENTIFIED BY 'change-with-strong-password';

Make sure you change change-with-strong-password with a strong password.

Once done, exit the mysql console by typing:

EXIT;

Creating System User

Create a new user and group, which will be Magento file system owner , for simplicity we will name the user magento:

sudo useradd -m -U -r -d /opt/magento magento

Add the www-data user to the magento group and change the /opt/magento directory permissions so that the Nginx can access the Magento installation:

sudo usermod -a -G magento www-data
sudo chmod 750 /opt/magento

Installing and Configuring PHP

PHP 7.2 which is the default PHP version in Ubuntu 18.04 is fully supported and recommended for Magento 2.3. Since we will be using Nginx as a web server we’ll also install the PHP-FPM package.

Run the following command to install PHP and all required PHP modules:

sudo apt install php7.2-common php7.2-cli php7.2-fpm php7.2-opcache php7.2-gd php7.2-mysql php7.2-curl php7.2-intl php7.2-xsl php7.2-mbstring php7.2-zip php7.2-bcmath php7.2-soap

PHP-FPM service will automatically start after the installation process is complete, you can verify it by printing the service status:

sudo systemctl status php7.2-fpm

The output should indicate that the fpm service is active and running.

● php7.2-fpm.service - The PHP 7.2 FastCGI Process Manager
   Loaded: loaded (/lib/systemd/system/php7.2-fpm.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2018-12-12 15:47:16 UTC; 5s ago
     Docs: man:php-fpm7.2(8)
 Main PID: 16814 (php-fpm7.2)
   Status: "Ready to handle connections"
    Tasks: 3 (limit: 505)
   CGroup: /system.slice/php7.2-fpm.service

Set the required and recommended PHP options:

sudo sed -i "s/memory_limit = .*/memory_limit = 1024M/" /etc/php/7.2/fpm/php.ini
sudo sed -i "s/upload_max_filesize = .*/upload_max_filesize = 256M/" /etc/php/7.2/fpm/php.ini
sudo sed -i "s/zlib.output_compression = .*/zlib.output_compression = on/" /etc/php/7.2/fpm/php.ini
sudo sed -i "s/max_execution_time = .*/max_execution_time = 18000/" /etc/php/7.2/fpm/php.ini
sudo sed -i "s/;date.timezone.*/date.timezone = UTC/" /etc/php/7.2/fpm/php.ini
sudo sed -i "s/;opcache.save_comments.*/opcache.save_comments = 1/" /etc/php/7.2/fpm/php.ini

Next we need to create a FPM pool for the magento user.

Open your text editor and create the following file:

sudo nano /etc/php/7.2/fpm/pool.d/magento.conf
/etc/php/7.2/fpm/pool.d/magento.conf
[magento]
user = magento
group = www-data
listen.owner = magento
listen.group = www-data
listen = /var/run/php/php7.2-fpm-magento.sock
pm = ondemand
pm.max_children =  50
pm.process_idle_timeout = 10s
pm.max_requests = 500
chdir = /

Restart the PHP-FPM service for changes to take effect:

systemctl restart php7.2-fpm

Verify whether the PHP socket was successfully created by running:

ls -al /var/run/php/php7.2-fpm-magento.sock

The output should look something like this:

srw-rw---- 1 magento www-data 0 Dec 12 16:07 /var/run/php/php7.2-fpm-magento.sock=

Installing Composer

Composer is a dependency manager for PHP and we will be using it to download the Magento core and install all necessary Magento components.

To install composer globally, download the Composer installer with curl and move the file to the /usr/local/bin directory:

curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer

Verify the installation by printing the composer version:

composer --version

The output should look something like this:

Composer version 1.8.0 2018-12-03 10:31:16

Installing Magento

There are several ways to install Magento 2. Avoid installing Magento from the Github repository because that version is intended for development and not for production installations.

At the time of writing this article, the latest stable version of Magento is version 2.3.0. In this tutorial we will install Magento from their repositories using composer.

Switch over to the magento user by typing:

sudo su - magento

Start the installation by downloading magento files to the /opt/magento/public_html directory:

composer create-project --repository-url=https://repo.magento.com/ magento/project-community-edition /opt/magento/public_html

You’ll be prompted to enter the access keys, copy the keys from your Magento marketplace account and store them in the auth.json file, so later when updating your installation you don’t have to add the same keys again.

    Authentication required (repo.magento.com):
      Username: e758ec1745d190320ca246e4e832e12c
      Password: 
Do you want to store credentials for repo.magento.com in /opt/magento/.config/composer/auth.json ? [Yn] Y

The command above will fetch all required php packages. The process may take few minutes and if it is successful the end of the output should look like the following:

Writing lock file
Generating autoload files

Once the project is created we can start the Magento installation. We can install Magento either from the command line or using the web Setup Wizard. In this tutorial we’ll install Magento using the command line.

We will use the following options to install the Magento store:

  • Base and Base secure URLs are set to https://example.com, change it with your domain.
  • Magento administrator:
    • John Doe as first and last name.
    • [email protected] as email.
    • john as username and j0hnP4ssvv0rD as password.
  • Database name magento, username magento, password change-with-strong-password and the database server is on the same host as the web server.
  • en_US, US English as default language.
  • USD dollars as default currency.
  • America/Chicago as time zone.

You can find all the installation options here.

Change to the Magento ~/public_html directory:

cd ~/public_html

Run the following command to start the installation:

php bin/magento setup:install --base-url=https://example.com/ \
        --base-url-secure=https://example.com/ \
        --admin-firstname="John" \
        --admin-lastname="Doe" \
        --admin-email="[email protected]" \
        --admin-user="john" \
        --admin-password="j0hnP4ssvv0rD" \
        --db-name="magento" \
        --db-host="localhost" \
        --db-user="magento" \
        --currency=USD \
        --timezone=America/Chicago \
        --use-rewrites=1 \
        --db-password="change-with-strong-password"

Don’t forget to change the password (j0hnP4ssvv0rD) to something more secure.

The process may take few minutes and once completed you will be presented with a message that contains the URI to the Magento admin dashboard.

[Progress: 773 / 773]
[SUCCESS]: Magento installation complete.
[SUCCESS]: Magento Admin URI: /admin_13nv5k
Nothing to import.

Creating Magento crontab

Magento uses cron jobs to schedule tasks like re-indexing, notifications, sitemaps, emails and more.

To create the Magento crontab run the following command as magento user:

php ~/public_html/bin/magento cron:install
Crontab has been generated and saved

Verify that the crontab is installed by typing:

crontab -l
#~ MAGENTO START adc062915d7b30804a2b340095af072d
* * * * * /usr/bin/php7.2 /opt/magento/public_html/bin/magento cron:run 2>&1 | grep -v "Ran jobs by schedule" >> /opt/magento/public_html/var/log/magento.cron.log
* * * * * /usr/bin/php7.2 /opt/magento/public_html/update/cron.php >> /opt/magento/public_html/var/log/update.cron.log
* * * * * /usr/bin/php7.2 /opt/magento/public_html/bin/magento setup:cron:run >> /opt/magento/public_html/var/log/setup.cron.log
#~ MAGENTO END adc062915d7b30804a2b340095af072d

Configuring Nginx

By now, you should already have Nginx with SSL certificate installed on your Ubuntu server, if not check the prerequisites for this tutorial.

We are going to include the default Nginx configuration shipped with Magento.

Switch over to your sudo user, open your text editor and create the following file:

sudo nano /etc/nginx/sites-available/example.com
/etc/nginx/sites-available/example.com
upstream fastcgi_backend {
  server   unix:/var/run/php/php7.2-fpm-magento.sock;
}

server {
    listen 80;
    server_name example.com www.example.com;

    include snippets/letsencrypt.conf;
    return 301 https://example.com$request_uri;
}

server {
    listen 443 ssl http2;
    server_name www.example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
    include snippets/ssl.conf;
    include snippets/letsencrypt.conf;

    return 301 https://example.com$request_uri;
}

server {
    listen 443 ssl http2;
    server_name example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
    include snippets/ssl.conf;
    include snippets/letsencrypt.conf;

    set $MAGE_ROOT /opt/magento/public_html;
    set $MAGE_MODE developer; # or production

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

    include /opt/magento/public_html/nginx.conf.sample;
}

Don’t forget to replace example.com with your Magento domain and set the correct path to the SSL certificate files. The snippets used in this configuration are created in this guide .

Before restarting the Nginx service make a test to be sure that there are no syntax errors:

sudo nginx -t

If there are no errors the output should look like this:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Finally, restart the Nginx service by typing:

sudo systemctl restart nginx

Verifying the Installation

Open your browser, type your domain and assuming the installation is successful, a screen similar to the following will appear:

You can now go to the Magento Admin URI, login as the admin user and start customizing your new Magento installation.

Conclusion

Congratulations, you have successfully installed Magento 2.3 on your Ubuntu 18.04 server. You can now start customizing your store.

Magento 2.3 Developer Documentation is a good starting place to learn more about how to manage your Magento installation.

If you have questions feel free to leave a comment below.