Introduction
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,
and
:
# 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 127.0.0.1:9000 # location ~ \.php$ { include snippets/fastcgi-php.conf; # # # With php7.0-cgi alone: # fastcgi_pass 127.0.0.1:9000; # # 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:
<?php phpinfo(); ?>
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> FLUSH PRIVILEGES; 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
In
create a directory named “drupal8”:
# mkdir /var/www/drupal8
Drupal will be installed there, with the domain name “mydomain.me”. 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 { server_name mydomain.me; 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)$ { allow 192.168.1.0/16; 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 http://serverfault.com/q/627903/94922 for details. include fastcgi_params; # Block httpoxy attacks. See https://httpoxy.org/. 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 https://ftp.drupal.org/files/projects/drupal-8.1.10.tar.gz
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
, go to
directory and:
# cp default.services.yml 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.
Conclusion
That’s all. The Drupal content-management framework is ready to be used, on a server running Ubuntu 16.04, with Nginx and SSL.