Installeer en configureer Drupal 8 met Nginx en Let’s Encrypt op CentOS 8

Drupal is een gratis, open-source en schaalbaar inhoud-beheersysteem dat door particulieren gebruikt kan worden om allerlei soorten websites te maken en te beheren. Het is geschreven in PHP en gebruikt MySQL/MariaDB om zijn gegevens op te slaan. Drupal biedt een rijke reeks mogelijkheden die met duizenden add-ons kunnen worden uitgebreid. Drupal ondersteunt een heleboel webservers, waaronder, Apache, Nginx, IIS, Lighttpd en de databases MySQL, MariaDB, MongoDB, SQLite, PostgreSQL, en MS SQL server. Drupal heeft een eenvoudige en gebruiksvriendelijke web-gebruikersinterface, waarmee je websites kunt maken zonder enige kennis van coderen.

In deze handleiding laten we je zien hoe je Drupal 8 op CentOS 8 server kunt installeren en beveiligen met Let’s Encrypt gratis SSL.

Vereisten

  • Een server die CentOS 8 draait.
  • Een geldige domeinnaam die wijst naar het IP van je server
  • Een root wachtwoord is op de server ingesteld.

Installeer Nginx, MariaDB en PHP

Voor je begint, moet je de LEMP server op je server installeren. Je kunt het installeren door het volgende commando uit te voeren:

dnf install nginx mariadb-server php php-fpm php-cli php-mbstring php-gd php-xml php-curl php-mysqlnd php-pdo php-json php-opcache -y

Start na de installatie de Nginx, MariaDB en php-fpm dienst en zet ze aan om te starten na een herstart van het systeem met het volgende commando:

systemctl start nginx
systemctl start php-fpm
systemctl start mariadb
systemctl enable nginx
systemctl enable php-fpm
systemctl enable mariadb

Database configureren

MariaDB is standaard niet beveiligd, dus je zult het moeten beveiligen. Je kunt het beveiligen door het volgende commando uit te voeren:

mysql_secure_installation

Beantwoord alle vragen zoals hieronder aangegeven:

Enter current password for root (enter for none):
Set root password? [Y/n] Y
New password:
Re-enter new password:
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y

Als je klaar bent, log je in op MariaDB shell met het volgende commando:

mysql -u root -p

Geef je root wachtwoord als daarom gevraagd wordt en maak dan een database en gebruiker voor Drupal met het volgende commando:

MariaDB [(none)]> CREATE DATABASE drupaldb CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
MariaDB [(none)]> CREATE USER [email protected] IDENTIFIED BY "password";

Verleen vervolgens alle privileges aan drupaldb met het volgende commando:

MariaDB [(none)]> GRANT ALL ON drupaldb.* TO [email protected] IDENTIFIED BY "password";

Spoel vervolgens de privileges door en verlaat de MariaDB shell met het volgende commando:

MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> EXIT;

Drupal downloaden

Eerst moet je de nieuwste versie van Drupal downloaden van hun officiële website. Je kunt het downloaden met het volgende commando:

wget https://ftp.drupal.org/files/projects/drupal-8.7.10.tar.gz

Eenmaal gedownload pak je het gedownloade bestand uit met het volgende commando:

tar -xvzf drupal-8.7.10.tar.gz

Verplaats vervolgens de uitgepakte map naar de Nginx web root map met het volgende commando:

mv drupal-8.7.10 /var/www/html/drupal

Maak vervolgens een directory om de website bestanden in op te slaan en hernoem het bestand default.settings.php zoals hieronder:

mkdir /var/www/html/drupal/sites/default/files
cp /var/www/html/drupal/sites/default/default.settings.php /var/www/html/drupal/sites/default/settings.php

Verander vervolgens het eigendom van de Drupal directory in nginx zoals hieronder:

chown -R nginx:nginx /var/www/html/drupal/

Configureer Nginx voor Drupal

Maak eerst een php-fpm configuratiebestand voor Drupal met het volgende commando:

nano /etc/php-fpm.d/drupal.conf

Voeg de volgende regels toe:

[drupal]
user = nginx
group = nginx
listen.owner = nginx
listen.group = nginx
listen = /run/php-fpm/drupal.sock
pm = ondemand
pm.max_children =  50
pm.process_idle_timeout = 10s
pm.max_requests = 500
chdir = /

Sla het bestand op en sluit het als je klaar bent. Maak dan een Nginx virtual host configuratiebestand voor Drupal:

nano /etc/nginx/conf.d/drupal.conf

Voeg de volgende regels toe:

server {
    listen 80;
    server_name example.com;

    root /var/www/html/drupal;

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

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

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

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

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

    # Block access to scripts in site files directory
    location ~ ^/sites/[^/]+/files/.*\.php$ {
        deny all;
    }
    location ~ (^|/)\. {
        return 403;
    }

    location / {
        try_files $uri /index.php?$query_string;
    }

    location @rewrite {
        rewrite ^/(.*)$ /index.php?q=$1;
    }
    location ~ /vendor/.*\.php$ {
        deny all;
        return 404;
    }


    location ~ '\.php$|^/update.php' {
        fastcgi_split_path_info ^(.+?\.php)(|/.*)$;
        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;
        fastcgi_pass unix:/run/php-fpm/drupal.sock;
    }
    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|svg)$ {
        try_files $uri @rewrite;
        expires max;
        log_not_found off;
    }
}

Bewaar en sluit het bestand. Herstart daarna php-fpm en de Nginx dienst om de veranderingen toe te passen:

systemctl restart php-fpm
systemctl restart nginx

Configureer SELinux en Firewall

Standaard is SELinux ingeschakeld in CentOS 8. Je zult dus SELinux moeten instellen om Drupal correct te laten werken.

Laat eerst Drupal toe te schrijven naar de directories public en private files met het volgende commando:

semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/drupal(/.*)?"
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/drupal/sites/default/settings.php'
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/drupal/sites/default/files'
restorecon -Rv /var/www/html/drupal
restorecon -v /var/www/html/drupal/sites/default/settings.php
restorecon -Rv /var/www/html/drupal/sites/default/files

Vervolgens staat Drupal toe om uitgaande emails te sturen met het volgende commando:

setsebool -P httpd_can_sendmail on

Vervolgens moet je een firewall regel maken om HTTP en HTTPS diensten van externe netwerken toe te staan. Je staat het toe met het volgende commando:

firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload

Beveilig Drupal met Let’s Encrypt SSL

Drupal is nu geïnstalleerd en geconfigureerd. Het is tijd om het te beveiligen met Let’s Encrypt gratis SSL.

Om dat te doen moet je de certbot client op je server downloaden. Je kunt de juiste toestemming downloaden en instellen door het volgende commando uit te voeren:

wget https://dl.eff.org/certbot-auto
mv certbot-auto /usr/local/bin/certbot-auto
chown root /usr/local/bin/certbot-auto
chmod 0755 /usr/local/bin/certbot-auto

Voer nu het volgende commando uit om een SSL certificaat voor je Drupal website te verkrijgen en te installeren.

certbot-auto --nginx -d example.com

Het bovenstaande commando installeert eerst alle vereiste afhankelijkheden op je server. Eenmaal geïnstalleerd wordt je gevraagd een emailadres op te geven en de servicevoorwaarden te accepteren, zoals hieronder:

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator apache, Installer apache
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): [email protected]

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A)gree/(C)ancel: A

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y 


Obtaining a new certificate
Performing the following challenges:
http-01 challenge for example.com
Waiting for verification...
Cleaning up challenges
Deploying Certificate to VirtualHost /etc/nginx/conf.d/drupal.conf

Vervolgens moet je kiezen of je HTTP verkeer al dan niet wilt omleiden naar HTTPS, zoals hieronder:

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2

Typ 2 en druk op Enter om verder te gaan. Als de installatie voltooid is, zou je de volgende uitvoer moeten zien:

Redirecting all traffic on port 80 to ssl in /etc/nginx/conf.d/drupal.conf

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://example.com

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=example.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/example.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/example.com/privkey.pem
   Your cert will expire on 2020-03-23. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot-auto
   again with the "certonly" option. To non-interactively renew *all*
   of your certificates, run "certbot-auto renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Toegang tot Drupal Website

Open nu je web browser en typ de URL https://example.com. Je wordt doorverwezen naar de volgende pagina:

Kies taal

Kies je gewenste taal en klik op de Save and continue knop. Je zou de volgende pagina moeten zien:

Kies installatieprofiel

Kies je installatieprofiel en klik op de bewaar en ga verder knop. Je zou de volgende pagina moeten zien:

Database configuratie

Geef je database gegevens op en klik op de bewaar en vervolg knop. Je zou de volgende pagina moeten zien:

Configureer website

Geef je site naam, admin gebruikersnaam, wachtwoord en klik op de bewaar en ga verder knop. Je zou je Drupal dashboard op de volgende pagina moeten zien:

Welkom op je Drupal site

Gefeliciteerd! je hebt Drupal met succes geïnstalleerd en beveiligd op de CentOS 8 server.