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';
Ah, merci, c’est un bon rappel ! Surtout la partie engineX !