Jacques Douguet
Architecte d'Entreprise
Jacques Douguet
Architecte d'Entreprise

Articles du blog

Installer WordPress, Nginx, MariaDB et PHP sur Freenas 11.3

12 avril 2020 Tutoriels
Installer WordPress, Nginx, MariaDB et PHP sur Freenas 11.3

Introduction

Dans cet article, je vous explique comment installer une stack complète pour faire fonctionner la dernière version de WordPress avec Freenas 11.3:

Nous utiliserons les composants suivants :

  • Nginx comme serveur web
  • MariaDB comme base de données
  • PHP-FPM comme interpréteur

Créer une jail Iocage

Tout d’abord, créez une nouvelle jail Iocage dans Freenas :

Paramétrer vos dataset

Je vous conseille ensuite de créer deux datasets :

  • Un dataset « nominstance-www » pour les fichiers WordPress (html, php)
  • Un dataset « nominstance-db » pour la base de données.

Dans mon cas, toutes mes jails sont situées dans un pool zfs nommé « jails ».

Assurez vous de créer vos datasets avec le paramètre Atime à « off ».
Pour le dataset db, vous devriez paramétrer une taille de bloc de 16K (record size) et ne cacher que les metadata avec l’aide de la commande zfs set primarycache=metadata poolname/db

Ensuite, montez vos dataset aux emplacements /mnt/www et /var/db/mysql comme dans l’exemple ci-dessous :

Installer MariaDB

MariaDB est la base de données que je recommande avec WordPress : elle offre des performances légèrement meilleures et est complètement open-source alors que MySQL dépend essentiellement du support d’Oracle depuis son rachat de Sun Microsystems.

Pour commencer, vérifiez la dernière version de MariaDB disponible dans les ports FreeBSD avec la commande pkg search mariadb :

root@wordpress-maloya:~ # pkg search mariadb
mariadb-connector-c-3.0.10_1   MariaDB database connector for C
mariadb-connector-odbc-3.0.9   MariaDB database connector for odbc
mariadb101-client-10.1.44      Multithreaded SQL database (client)
mariadb101-server-10.1.44      Multithreaded SQL database (server)
mariadb102-client-10.2.31      Multithreaded SQL database (client)
mariadb102-server-10.2.31      Multithreaded SQL database (server)
mariadb103-client-10.3.22      Multithreaded SQL database (client)
mariadb103-server-10.3.22      Multithreaded SQL database (server)
mariadb104-client-10.4.12      Multithreaded SQL database (client)
mariadb104-server-10.4.12      Multithreaded SQL database (server)
mariadb55-client-5.5.67        Multithreaded SQL database (client)
mariadb55-server-5.5.67        Multithreaded SQL database (server)
rubygem-azure_mgmt_mariadb-0.17.2 Microsoft Azure Microsoft Azure MariaDB Library for Ruby Client Library for Ruby

Puis, utilisez cette commande pour installer la dernière version (ici v10.4):
pkg install mariadb104-server mariadb104-client

Après l’installation, utilisez les commandes suivantes pour activer le server MySQL sur le système :

sysrc mysql_enable="YES"
service mysql-server start

L’étape suivante consiste à sécuriser votre installation à l’aide du script mysql_secure_installation embarqué dans MariaDB. A son lancement, ce script vous posera quelques questions afin d’augmenter le niveau de sécurité, choisissez « Y » pour toutes les questions et entrez un nouveau mot de passe root à conserver précieusement :

root@wordpress-maloya:~ # mysql_secure_installation 

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
haven't set the root password yet, you should just press enter here.

Enter current password for root (enter for none): 
OK, successfully used password, moving on...

Setting the root password or using the unix_socket ensures that nobody
can log into the MariaDB root user without the proper authorisation.

You already have your root account protected, so you can safely answer 'n'.

Switch to unix_socket authentication [Y/n] Y
Enabled successfully!
Reloading privilege tables..
 ... Success!


You already have your root account protected, so you can safely answer 'n'.

Change the root password? [Y/n] Y
New password: 
Re-enter new password: 
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] Y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] Y
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] Y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] Y
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

Une fois le script terminé, à partir de la version 10.4 de MariaDB vous pourrez vous connecter directement avec la commande mysql sans renseigner votre mot de passe grâce à l’authentification UNIX native. En revanche, si vous utilisez une interface web telle que PhpMyAdmin, vous aurez besoin du mot de passe que vous avez renseigné.

La commande sockstat permet de constater que MariaDB écoute les connexion en provenance de n’importe quelle adresse IP :

root@wordpress-maloya:~ # sockstat -l -4
USER     COMMAND    PID   FD PROTO  LOCAL ADDRESS         FOREIGN ADDRESS      
mysql    mysqld     4690  20 tcp4   *:3306                *:*

Nous allons interdire les connexions externes avec la commande suivante :
sysrc mysql_args="--bind-address=127.0.0.1"

Redémarrez MariaDB avec cette commande :
service mysql-server restart

Installer Nginx

Nginx est un navigateur léger et performant qui s’installe très facilement. Vous pouvez connaître la dernière version disponible avec la commande pkg search nginx :

root@wordpress-maloya:~ # pkg search nginx
modsecurity3-nginx-1.0.1       Instruction detection and prevention engine / nginx Wrapper
nginx-1.16.1_12,2              Robust and small WWW server
nginx-devel-1.17.9             Robust and small WWW server
nginx-full-1.16.1_4,2          Robust and small WWW server (full package)
nginx-lite-1.16.1_12,2         Robust and small WWW server (lite package)
nginx-naxsi-1.16.1_12,2        Robust and small WWW server (plus NAXSI)
nginx-prometheus-exporter-0.6.0 Prometheus exporter for NGINX and NGINX Plus stats
nginx-ultimate-bad-bot-blocker-4.2020.03.2005 Nginx bad bot and other things blocker
nginx-vts-exporter-0.10.3      Server that scraps NGINX vts stats and export them via HTTP
p5-Nginx-ReadBody-0.07_1       Nginx embeded perl module to read and evaluate a request body
p5-Nginx-Simple-0.07_1         Perl 5 module for easy to use interface for Nginx Perl Module
p5-Test-Nginx-0.26             Testing modules for Nginx C module development
py27-certbot-nginx-1.3.0       NGINX plugin for Certbot
py37-certbot-nginx-1.3.0       NGINX plugin for Certbot
rubygem-passenger-nginx-6.0.4_1 Modules for running Ruby on Rails and Rack applications

Ensuite installer Nginx :
pkg install nginx

Une fois l’installation de Nginx terminée, vous pouvez activer et démarrer le service avec les commandes suivantes :

sysrc nginx_enable="yes"
service nginx start

Comme pour MariaDB, vous pourrez vérifier que le service tourne bien avec la commande sockstat :

root@wordpress-maloya:~ # sockstat -l -4
USER     COMMAND    PID   FD PROTO  LOCAL ADDRESS         FOREIGN ADDRESS      
mysql    mysqld     8163  19 tcp4   127.0.0.1:3306        *:*
www      nginx      4608  7  tcp4   *:80                  *:*
root     nginx      4607  7  tcp4   *:80                  *:*

Et vous devriez voir la page suivante lorsque vous entrez l’adresse IP de votre Jail dans un navigateur web :

Installer PHP

Nginx ne peut pas analyser directement les scripts PHP de WordPress : pour cela il doit utiliser la passerelle FastCGI PHP-FPM qui se chargera de les interpréter et de les exécuter.

La dernière version en date de PHP est la 7.4 et est pleinement compatible avec WordPress. Plusieurs extensions sont utiles à installer, je vous en ai mis quelques unes :

pkg install php74 php74-xml php74-dom php74-curl php74-ctype php74-json php74-ftp php74-session php74-pecl-imagick php74-pecl-memcached php74-tokenizer php74-mbstring php74-fileinfo php74-exif php74-openssl php74-filter php74-zip php74-zlib php74-mysqli php74-iconv php74-gd

Une fois l’installation de PHP terminée, créez un fichier de configuration php.ini basé sur la configuration de production par défaut :

ln -s /usr/local/etc/php.ini-production /usr/local/etc/php.ini

Puis modifiez le paramètre mysqli.default_socket comme suit :

mysqli.default_socket = "/var/run/mysql/mysql.sock"

Puis dans le fichier /usr/local/etc/php-fpm.d/www.conf décommentez les paramètres suivants :

listen.allowed_clients = 127.0.0.1

env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp

Ajoutez également les paramètres suivants à la fin du fichier /usr/local/etc/php-fpm.d/www.conf

php_admin_value[post_max_size] = 13M
php_admin_value[upload_max_filesize] = 13M
php_admin_value[date.timezone] = "Europe/Paris"

Enfin, activez et démarrez le service php-fpm avec ces commandes :

sysrc php_fpm_enable="yes"
service php-fpm start

Configurer Nginx pour PHP et WordPress

Pour la configuration de Nginx, je partirai de l’hypothèse que vos pages http/https sont servies à vos clients derrière une jail reverse proxy SSL. Par conséquent, il ne sera pas nécessaire de configurer SSL sur votre Nginx : je détaillerai dans un autre article comment créer cette jail en utilisant le serveur web Caddy pour le renouvellement automatique des certificats SSL.

Nous aurons donc uniquement besoin des 3 fichiers suivants :

  • /usr/local/etc/nginx/php_handlers.conf: Le fichier utilisé pour configurer la redirection de vos requêtes vers php
  • /usr/local/etc/nginx/conf.d/<mondomaine.tld.conf>: le fichier utilisé pour configurer votre hôte WordPress
  • /usr/local/etc/nginx/nginx.conf: Le fichier de configuration principal

Créez le répertoire /usr/local/etc/nginx/conf.d dans lequel vous mettrez le fichier de configuration correspondant à vôtre host WordPress :

mkdir -p /usr/local/etc/nginx/conf.d

Créez et éditez le fichier de configuration /usr/local/etc/nginx/php_handlers.conf:

# PHP Handlers

# WordPress
upstream php_wp {
        # This should match value of the "listen" directive in php-fpm pool for www
        # localhost and port 9000
        server 127.0.0.1:9000;
}

Créez et éditer le fichier de configuration /usr/local/etc/nginx/conf.d/<mondomaine.tld.conf> (remplacez <mondomaine.tld> par l’adresse IP de votre jail ou votre dns) :

# mondomaine.tld - public server
server {
   listen       80;
   server_name  mondomaine.tld;

   root    /mnt/www/mondomaine.tld;
   index  index.php;

   # php max upload limit cannot be larger than this size
   client_max_body_size 13m;

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

   location ~ \.php$ {
        include        fastcgi_params;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $request_filename;
        fastcgi_pass   php_wp;  # php handler for www
        fastcgi_buffers 16 16k;
        fastcgi_buffer_size 32k;
   }

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

} # End of mondomaine.tld server block

Editez le fichier /usr/local/etc/nginx/nginx.conf:

# Load Modules
load_module /usr/local/libexec/nginx/ngx_mail_module.so;
load_module /usr/local/libexec/nginx/ngx_stream_module.so;

user www;
worker_processes auto;

error_log  /var/run/error.log;
#
# service start script is looking here for the pid. don't move it.
pid        /var/run/nginx.pid;

events {
  worker_connections 1024;
}

http {

  # Basic settings
  # ----------

  sendfile on;
  tcp_nopush on;
  keepalive_timeout 65;
  #server_tokens off;

  # Common limits
  # ----------

  include mime.types;
  default_type application/octet-stream;

  # Logs format
  # ----------

  log_format main '$remote_addr - $host [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"'
                  'rt=$request_time ut=$upstream_response_time '
                  'cs=$upstream_cache_status';

  log_format cache '$remote_addr - $host [$time_local] "$request" $status '
                   '$body_bytes_sent "$http_referer" '
                   'rt=$request_time ut=$upstream_response_time '
                   'cs=$upstream_cache_status';

  access_log /var/log/nginx/access.log main;
  error_log /var/log/nginx/error.log warn;

  # GZip config
  # ----------

  gzip on;

  # Cache config
  # ----------

  # PHP Handlers
  # ----------
  include /usr/local/etc/nginx/php_handlers.conf;


  # Virtual host config
  # ----------
  # Only virtual host with the *.conf will be included.
  include /usr/local/etc/nginx/conf.d/*.conf;

}  # End of http block

Ensuite redémarrez Nginx pour prendre en compte les modifications :
service nginx restart

Pour vérifier que votre site est prêt à servir des pages php, nous allons créer un fichier phpinfo.php dans le répertoire /mnt/www/<mondomain.tld> :

mkdir /mnt/www/<mondomain.tld>
echo "<?php phpinfo(); ?>" | tee /mnt/www/<mondomain.tld>/phpinfo.php

Ensuite vous devriez voir une page de ce type dans votre navigateur en accédant à http://<mondomain.tld> :

Créer un schéma SQL pour WordPress

Nous devons créer un schéma de base de données dans MariaDB ainsi qu’un utilisateur qui sera utilisé par WordPress :

Connectez vous à MariaDB avec la commande mysql puis entrez ces commandes en ayant préalablement personnalisé le mot de passe :

MariaDB [(none)]>
create database wordpress;
grant all privileges on wordpress.* to 'wordpress'@'localhost' identified by 'wordpresspassword';
flush privileges;
exit

Installer WordPress

Téléchargez la dernière version de WordPress, décompressez son contenu à la racine de votre répertoire web /mnt/www/<mondomaine.tld> puis affectez à son contenu à à l’utilisateur www :

fetch https://wordpress.org/latest.tar.gz
tar -xf latest.tar.gz --strip-components=1 --directory /mnt/www/<mondomaine.tld>/
chown -R www:www /mnt/www/<mondomain.tld>

Et voilà, vous pouvez désormais continuer l’installation de WordPress depuis votre navigateur !

Réglages WordPress pour Reverse Proxy SSL

Pour faire fonctionner votre site derrière un Reverse Proxy SSL, vous devez modifier le nom de votre site parhttps://mondomaine.tld dans les réglages généraux :

Le site ne fonctionnera plus provisoirement jusqu’à ce que vous ajoutiez ces lignes au début de votre fichier wp-config.php :

// * Réglages Reverse Proxy * //
define('FORCE_SSL_ADMIN', true);
if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
 $_SERVER['HTTPS']='on';

Taggs:
1 Comment
  • Éric 11 h 27 min 15 mai 2020 Répondre

    Ah, merci, c’est un bon rappel ! Surtout la partie engineX !

Write a comment