How to install Drupal 8.1.10 on Ubuntu 16.04

Install Drupal 8.1.10


Drupal is a content-management framework written in PHP and distributed under the GNU GPL. It can be used for any type of site, from personal blogs to multinational corporate sites. It’s basic part is named Drupal Core, and it can be extended with plugins.
This tutorial explains how to install and configure Drupal on a Ubuntu 16.04 server running Nginx.

Install Nginx

Install Nginx. In Ubuntu, it is available in repositories:

# apt install nginx

Next, install packages required by Drupal Core,



php-gd extension


# apt install php7.0-fpm php7.0-cli php7.0-gd php7.0-mysql php7.0-xml

Configure Nginx

Configure Nginx to use php-fpm. With a text editor, edit


. Uncomment line 760, and change from 1 to 0, so you’ll have: cgi.fix_pathinfo=0
Next, modify Nginx virtual host configuration for enabling php-fpm; the file is


. There, uncomment lines 51, 52, 57, 58. After that, you’ll have:

# pass the PHP scripts to FastCGI server listening on
        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
        #       # With php7.0-cgi alone:
        #       fastcgi_pass;
        #       # With php7.0-fpm:
                fastcgi_pass unix:/run/php/php7.0-fpm.sock;

Save, exit, and test Nginx:

# nginx -t

If you read:

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

everything went well.

Restart Nginx and PHP-FPM:

# systemctl restart nginx
# systemctl restart php7.0-fpm

Now, check if php-fpm is working correctly with nginx. Create the file


and write:


Save and close the file, and then, with your browser, visit the URL



As you can see, everything is up and running.

Configure MariaDB

If you don’t have MariaDB, install and start it with the following commands:

# apt install mariadb-client mariadb-server
# systemctl start mysql

Configure a root account with:

# mysql_secure_installation

Next, login to MariaDB as root:

# mysql -u root -p

Configure a new database and a new user for Drupal:

MariaDB> CREATE DATABASE mydrubaldb;
MariaDB> CREATE USER myuser@localhost IDENTIFIED BY 'myuser@';
MariaDB> GRANT ALL PRIVILEGES ON mydrubaldb.* TO myuser@localhost IDENTIFIED BY 'myuser@';
MariaDB> EXIT;

Generate a SSL certificate

Create the directory


. Next, execute the commands:

# cd /etc/nginx/ssl
# openssl req -x509 -nodes -days 365 -newkey rsa:4096 -keyout /etc/nginx/ssl/drupal.key -out /etc/nginx/ssl/drupal.crt

You’ll be asked some questions:
Change the permission of the generated key:

# chmod 600 drupal.key

Configure Virtual Host for Drupal



create a directory named “drupal8”:

# mkdir /var/www/drupal8

Drupal will be installed there, with the domain name “”. Of course, use the name you need and/or want.
Create a new file, “drupal8”, in


. In that new file, paste the following text:

server {
    root /var/www/drupal8; ## <-- Your only path reference.

    location = /favicon.ico {
        log_not_found off;
        access_log off;

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;

    # Very rarely should these ever be accessed outside of your lan
    location ~* \.(txt|log)$ {
        deny all;

    location ~ \..*/.*\.php$ {
        return 403;

    location ~ ^/sites/.*/private/ {
        return 403;

    # Allow "Well-Known URIs" as per RFC 5785
    location ~* ^/.well-known/ {
        allow all;

    # Block access to "hidden" files and directories whose names begin with a
    # period. This includes directories used by version control systems such
    # as Subversion or Git to store control files.
    location ~ (^|/)\. {
        return 403;

    location / {
        # try_files $uri @rewrite; # For Drupal <= 6
        try_files $uri /index.php?$query_string; # For Drupal >= 7

    location @rewrite {
        rewrite ^/(.*)$ /index.php?q=$1;

    # Don't allow direct access to PHP files in the vendor directory.
    location ~ /vendor/.*\.php$ {
        deny all;
        return 404;

    # In Drupal 8, we must also match new paths where the '.php' appears in
    # the middle, such as update.php/selection. The rule we use is strict,
    # and only allows this pattern with the update.php front controller.
    # This allows legacy path aliases in the form of
    # blog/index.php/legacy-path to continue to route to Drupal nodes. If
    # you do not have any paths like that, then you might prefer to use a
    # laxer rule, such as:
    #   location ~ \.php(/|$) {
    # The laxer rule will continue to work if Drupal uses this new URL
    # pattern with front controllers other than update.php in a future
    # release.
    location ~ '\.php$|^/update.php' {
        fastcgi_split_path_info ^(.+?\.php)(|/.*)$;
        # Security note: If you're running a version of PHP older than the
        # latest 5.3, you should have "cgi.fix_pathinfo = 0;" in php.ini.
        # See for details.
        include fastcgi_params;
        # Block httpoxy attacks. See
        fastcgi_param HTTP_PROXY "";
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param QUERY_STRING $query_string;
        fastcgi_intercept_errors on;
        # PHP 5 socket location.
        #fastcgi_pass unix:/var/run/php5-fpm.sock;
        # PHP 7 socket location.
        fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;

    # Fighting with Styles? This little gem is amazing.
    # location ~ ^/sites/.*/files/imagecache/ { # For Drupal <= 6
    location ~ ^/sites/.*/files/styles/ { # For Drupal >= 7
        try_files $uri @rewrite;

    # Handle private files through Drupal. Private file's path can come
    # with a language prefix.
    location ~ ^(/[a-z\-]+)?/system/files/ { # For Drupal >= 7
        try_files $uri /index.php?$query_string;

    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
        expires max;
        log_not_found off;

Save and exit.
Next, activate the Drupal Virtual Host and restart Nginx:

# ln -s /etc/nginx/sites-available/drupal8 /etc/nginx/sites-enabled/
# systemctl restart nginx

Install and configure Drupal

Now, everything is ready for Drupal installation. In


execute wget:

# wget

Next, extract the archive and move Drupal files to the main directory:

# tar xzf drupal-8.1.10.tar.gz
# drupal-8.1.10/* .
# rm -r drupal-8.1.10



, go to


directory and:

# cp services.yml
# cp default.settings.php settings.php

and then:

# mkdir files
# chmod a+w *

Remove the “default” symlink in


, then, with your browser, navigate to the URL you specified in drupal8 Virtual Host file; Drupal installer page will show up.

Starting from here, the configuration is all “graphical”; you just have to enter the MariaDB user data, and your website information.


That’s all. The Drupal content-management framework is ready to be used, on a server running Ubuntu 16.04, with Nginx and SSL.