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, php7.0-fpm and 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 /etc/php/7.0/fpm/php.ini. 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 /etc/nginx/sites-available/default. 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 /var/www/html/info.php and write:


Save and close the file, and then, with your browser, visit the URL your_IP_Server/info.php.

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 /etc/nginx/ssl. 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

In /var/www 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 /etc/nginx/sites-available/. 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 /var/www/drupal8 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

From /var/www/drupal8, go to sites/default directory and:

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

and then:

# mkdir files
# chmod a+w *

Remove the “default” symlink in /etc/nginx/sistes-enabled, 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.

  • tucker-claire

    I’ve earned $104k last year by freelancing on-line a­­n­­d I was able to do it by w­o­r­k­i­n­g part-time for few hours daily. I used an earning opportunity I stumbled upon online and I am so happy that i earned so much extra income. It’s newbie friendly a­n­d I’m just so blessed that I found out about this. Here is what i do… STATICTAB.COM/owgxpdb

  • I have made $104,000 in last 12 months by working online a­­n­­d I was able to do it by working in my own time f­­o­­r 3+ h each day. I used a business model I found online and I am so thrilled that i made so much money. It’s newbie-friendly and I am just so grateful that i found it. Check out what I do… STATICTAB.COM/r2tyhgi


    I have made 104,000 bucks in last twelve months by working on-line from my house a­n­d I did that by wor­king part-time f­­o­­r few hours /day. I used an earning model I was introduced by this web-site i found on-line and I am happy that i was able to make so much money on the side. It’s very user friendly and I am just so happy that I found out about this. Check out what I did… STATICTAB.COM/astkxim

  • I profited 104,000 bucks in last 12 months by freelancing from home a­­n­­d I did it by wor­king part-time f­­o­­r 3+ h daily. I’m using a business model I stumbled upon online and I am so thrilled that i made so much extra income. It’s beginner friendly a­­n­­d I am just so grateful that i found it. Here is what i did… STATICTAB.COM/gpfvgtj


    I profited 104 thousand dollars previous year by working from my house and I did it by wor­king in my own time for several hrs daily. I’m using work opportunity I was introduced by this company i found on-line and I am so amazed that i earned so much money. It’s very user friendly a­n­d I’m so grateful that I found out about it. Here’s what I do… STATICTAB.COM/h8vxywm

  • I got paid 104,000 bucks last year by working on-line and I did it by w­o­r­k­i­n­g part-time f­­o­­r several hours /day. I was following a money making model I was introduced by this company i found online and I am amazed that I was able to earn such great money. It’s so user-friendly and I’m just so grateful that i discovered it. Here is what i did… please visit my account for webpage