How To

Install Drupal on Ubuntu 18.04 with Composer, Nginx, and PHP

Drupal is one of the most widely used open-source CMS platforms in the world. Written in PHP, it powers everything from personal blogs to large government and enterprise sites. Its strength comes from flexible content types, a granular permissions system, and thousands of contributed modules that extend it in almost any direction.

This guide shows you how to install Drupal on Ubuntu 18.04 using Composer and the official drupal-project template, with Nginx, PHP 7.2, and MySQL.

Prerequisites:

  • A domain name pointing to your server’s public IP
  • Nginx installed with an SSL certificate (Let’s Encrypt recommended)
  • Sudo access

Install Drupal on Ubuntu: Set Up the Database, PHP, and Composer

Update your system packages before starting:

bashsudo apt update && sudo apt upgrade

Set up the MySQL database. Log into MySQL and create a dedicated database and user:

bashmysql -u root -p
sqlCREATE DATABASE drupal CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, CREATE TEMPORARY TABLES ON drupal.* TO 'drupaluser'@'localhost' IDENTIFIED BY 'change-with-strong-password';

Replace the password with a strong one. The GRANT statement gives the user only the permissions Drupal needs and nothing more.

Install PHP 7.2 with all the modules Drupal requires:

bashsudo apt install php7.2-cli php7.2-fpm php7.2-mysql php7.2-json php7.2-opcache php7.2-mbstring php7.2-xml php7.2-gd php7.2-curl

PHP-FPM starts automatically after installation. Confirm it is running with systemctl status php7.2-fpm.

Install Composer globally to manage Drupal’s PHP dependencies:

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

Verify with composer --version before continuing.

Download Drupal with Composer and Configure Nginx

Create a new Drupal project using the official Composer template:

bashsudo composer create-project drupal-composer/drupal-project:8.x-dev /var/www/my_drupal --stability dev --no-interaction

This downloads Drupal and all required PHP packages. The process may take a few minutes.

Install Drupal using Drush, passing in the database credentials you created earlier:

bashcd /var/www/my_drupalsudo vendor/bin/drush site-install --db-url=mysql://drupaluser:change-with-strong-password@localhost/drupal

When the installer finishes, Drush prints the admin username and a generated password. Note these down before closing the terminal.

Set file ownership so Nginx and PHP-FPM can read and write site files:

bashsudo chown -R www-data: /var/www/my_drupal

Create an Nginx server block at /etc/nginx/sites-available/example.com. The config requires three server blocks: one to redirect HTTP to HTTPS, one to redirect www to the non-www domain, and a main block with its root set to /var/www/my_drupal/web. The main block passes PHP requests to the PHP-FPM socket at unix:/run/php/php7.2-fpm.sock and blocks access to vendor PHP files, private directories, and hidden dot files. Use the official Drupal Nginx recipe for the complete config and replace example.com with your domain and your actual SSL certificate paths.

Enable the site, test the configuration, and restart Nginx:

bashsudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/sudo nginx -tsudo systemctl restart nginx

Open your domain in a browser. The Drupal welcome screen confirms the installation worked.

Install Modules and Keep Drupal Updated

Modules and themes are managed through Composer. To add a module, navigate to the project directory and run:

bashcd /var/www/my_drupalsudo -u www-data composer require drupal/pathauto

Composer installs the module and resolves all of its dependencies automatically.

Before updating Drupal core, always back up your files and database first:

bashsudo rsync -a /var/www/my_drupal/ /var/www/my_drupal_$(date +%F)mysqldump -u root -p drupal > /var/www/my_drupal_database_$(date +%F).sql

Then run the core update:

bashsudo -u www-data composer update drupal/core webflo/drupal-core-require-dev symfony/* --with-dependencies

The --with-dependencies flag updates all related packages at the same time, preventing version conflicts between Drupal core and its dependencies.

Drupal 8 is now installed on your Ubuntu 18.04 server. Visit the Drupal User Guide to learn how to manage content, configure settings, and build your site. Leave a comment below if you run into any issues.

Cyber Defence

Recent Posts

Nginx Commands in Linux: Start, Stop, Reload, Test, and Log

Nginx is a high-performance web server and reverse proxy trusted by some of the largest…

5 hours ago

ufw Command in Linux: Manage Firewall Rules with Examples

ufw (Uncomplicated Firewall) sits on top of iptables (or nftables on newer systems) and replaces…

5 hours ago

who Command in Linux: Show All Logged-In Users and Sessions

When you share a server with a team or investigate unexpected activity, the first question…

5 hours ago

file Command in Linux: Identify File Types Without Extensions

The file command inspects the actual contents of a file and reports its type — regardless of…

2 days ago

chattr Command in Linux: Set File Attributes with lsattr

chattr sets and removes special file attributes that operate at the filesystem level, separate from standard…

2 days ago

env Command in Linux: Show and Set Environment Variables

env prints the current environment, sets or removes variables for a single command, and can start…

2 days ago