====== Nginx, MariaDB, php, multi-sites dont Wordpress, plusieurs versions de php ====== * Objet : Un how to pour installer rapidement un serveur nginx avec une base de données (MariaDB), php pluri-versions et Wordpress. * Niveau requis : {{tag>débutant avisé}} * Commentaires : Un how to pour installer rapidement un serveur nginx avec une base de données (MariaDB), php pluri-versions et Wordpress. * Débutant, à savoir : [[:doc:systeme:commandes:le_debianiste_qui_papillonne|Utiliser GNU/Linux en ligne de commande, tout commence là !.]] :-) * Suivi : {{tag>à-placer}} * Création par [[user>cyrille]] 23/12/2021 * Testé par [[user>cyrille]] le 23/12/2021 * Commentaires sur le forum : [[https://debian-facile.org/viewtopic.php?pid=372196 | Lien vers le forum concernant ce tuto]] ((N'hésitez pas à y faire part de vos remarques, succès, améliorations ou échecs !)) ===== Introduction ===== Un how to pour installer rapidement **un serveur nginx avec une base de données (MariaDB), php pluri-version et Wordpress**. Cette documentation expliquera aussi comment faire **du multi-sites avec nginx** et l'installation de **Wordpress**. Attention, les configurations proposées le sont dans le cas** d’un serveur de développement**, pas de production. A noter que l’aspect sécurité ne sera ici pas abordé, la finalité de ce guide est de disposer d’un environnement de travail fonctionnel pour ceux qui veulent travailler le développement web dynamique. A savoir, dans la configuration de nginx (**/etc/nginx/**), il y a deux dossiers importants : **sites-available** et **sites-enabled**. **sites-available**: Ce dossier contient les fichiers de configurations de vos sites. Ce dossier est un dépôt ; les fichiers de configuration qui y sont ne sont pas pris en compte. **sites-enabled**: Dossier de liens symboliques vers les fichiers de site-available que vous souhaitez activer. Pour éditer les fichiers de configuration, il est utilisé ici le paquet **micro** car ses raccourcis clavier sont plus instinctifs que ceux de **nano**, **vi**, **vim**... Pour l'installer : apt install micro ===== Installation des paquets ===== Installer les paquets suivants apt install nginx php-cli php-fpm php-mysql php-json php-opcache php-mbstring php-xml php-gd php-curl mariadb-server Démarrer et activer le démarrage automatique des services suivants systemctl start nginx.service systemctl enable nginx.service systemctl start mariadb.service systemctl enable mariadb.service A cette étape nginx est opérationnel {{/file-Reaee6401e4cf2738e247f39c334f13db.png?700}} Sécuriser la base données MariaDB mysq_secure_installation Répondre de la manière suivante Enter current password for root (enter for none): --> saisie du mot de passe root Switch to unix_socket authentication [Y/n] --> n Change the root password? [Y/n] --> n 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 Si tout se passe bien, vous obtenez ce message : All done! If you've completed all of the above steps, your MariaDB installation should now be secure. Thanks for using MariaDB! ===== Configurer nginx : créer son premier bloc de serveur ===== Nginx n'utilise pas des répertoires virtuels (**Virtual Hosts**, terme d'Apache) mais des "**server block**s", ici traduit en **blocs de serveur**, qui utilisent les directives **server_name** et **listen** pour se lier aux sockets tcp **(2)**. Créer votre premier répertoire de publication web mkdir -p /var/www/html/site1 Adapter les droits Nginx utilise l'user et le groupe **www-data**. Si vous voulez que votre utilisateur puisse écrire dans ce répertoire, il devra faire partie du groupe www-data et les fichiers et dossiers devront appartenir également à ce groupe chown -R www-data:www-data /var/www/html/site1/ chmod -R 775 /var/www/html/site1/ Ajouter votre utilisateur au groupe www-data adduser www-data (remplacer par le login du compte qui doit faire parti du groupe www:data Se déconnecter et se relogguer pour que la modification soit prise en compte Après reconnexion, on vérifie que l'utilisateur est bien dans le groupe www-data groups ragnarok cdrom floppy audio dip www-data video plugdev netdev bluetooth lpadmin scanner Configurer votre bloc de serveur micro /etc/nginx/sites-available/site1.conf server { listen 80; root /var/www/html/site1; index index.php index.html index.htm; server_name site1.local; error_log /var/log/nginx/site1.local_error.log; access_log /var/log/nginx/site1.local_access.log; client_max_body_size 100M; location / { try_files $uri $uri/ /index.php?$args; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php7.4-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } } Attention, pour la ligne fastcgi_pass unix:/run/php/php7.4-fpm.sock; Bien vérifier que la version php-fpm est la bonne par la commande suivante /var/run/php/ php7.4-fpm.pid php7.4-fpm.sock php-fpm.sock Supprimer l'ancienne config de nginx rm /etc/nginx/sites-enabled/default /etc/nginx/sites-available/default Activer le bloc de serveur ln -s /etc/nginx/sites-available/site1.conf /etc/nginx/sites-enabled/ Vérifier la bonne configuration de votre premier bloc de serveur nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful Recharger la configuration du serveur service nginx reload Créer un fichier php à l'intérieur de votre répertoire de publication web. Exemple de syntaxe Site 1"; phpinfo(); ?> Vérifier dans votre navigateur {{/file-Rf876a0b89e66940491d0688f62521673.png?700}} Le fichier /etc/hosts Si vous voulez accéder à votre site, via son entrée **server_name** de votre bloc de serveur, alors insérer la ligne suivante dans votre fichier **/etc/hosts** 127.0.0.1 site1.local Ce qui donne un fichier de ce style 127.0.0.1 localhost 127.0.1.1 debian11Vbox 127.0.0.1 site1.local # The following lines are desirable for IPv6 capable hosts ::1 localhost ip6-localhost ip6-loopback ff02::1 ip6-allnodes ff02::2 ip6-allrouters ===== Nginx et plusieurs blocs de serveur ===== 1. Copier votre répertoire de publication web cp -R /var/www/html/site1 /var/www/html/site2 2. Adapter les droits et permissions chown -R www-data:www-data /var/www/html/site2 chmod -R 775 /var/www/html/site2/ 2. Adapter le fichier index.php Site 2"; phpinfo(); ?> 3. Copier le bloc de serveur site1.conf vers site2.conf et l'adapter cp /etc/nginx/sites-available/site1.conf /etc/nginx/sites-available/site2.conf Modifier /etc/nginx/sites-available/site2.conf de la manière suivante server { listen 80; root /var/www/html/site2; index index.php index.html index.htm; server_name site2.local; error_log /var/log/nginx/site2.local_error.log; access_log /var/log/nginx/site2.local_access.log; client_max_body_size 100M; location / { try_files $uri $uri/ /index.php?$args; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php7.4-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } } 4. L'activer, tester la configuration de nginx et la recharger ln -s /etc/nginx/sites-available/site2.conf /etc/nginx/sites-enabled/ nginx -t service nginx reload 5. Adpater le fichier /etc/hosts Ajouter la ligne 127.0.0.1 site2.local 6. Tester en saisissant dans votre navigateur site1.local puis site2.local {{/file-R131d849f7a6bb0f4fb06ff8d74b79548?700.png?700}} ===== Installer Wordpress ===== MariaDB étant installé, il faut configurer la base de données pour Wordpress. Se connecter au serveur de la base de données, créer une base de données et un utilisateur Wordpress et ajuster les privilèges mysql -u root -p Saisir les commandes SQL suivantes CREATE DATABASE BDDWPress; GRANT ALL ON BDDWPress.* TO 'wp-admin'@'localhost' IDENTIFIED BY 'wp-mot-de-passe-1'; quit Récupérer la dernière version de wordpress et l'installer cd /var/www/html/ wget https://wordpress.org/latest.tar.gz tar xzfv latest.tar.gz rm latest.tar.gz cd wordpress mv wp-config-sample.php wp-config.php micro wp-config.php {{/file-R999aec188e95543fc39de41ebe583db7.png?700}} Modifier ce fichier en précisant le nom de la base de données, le nom de l'administrateur wordpress précédemment créé et son mot de passe. // ** MySQL settings - You can get this info from your web host ** // /** The name of the database for WordPress */ define( 'DB_NAME', 'BDDWPress' ); /** MySQL database username */ define( 'DB_USER', 'wp-admin' ); /** MySQL database password */ define( 'DB_PASSWORD', 'wp-mot-de-passe-1' ); Adapter les droits et les permissions de ce nouveau répertoire de publication web chown -R www-data:www-data /var/www/html/wordpress chmod -R 755 /var/www/html/wordpress (PS ici les droits sont en 755, le groupe www:data n'ayant pas besoin (sauf usage avancé de WP) d'écrire dans ce répertoire.) Il ne reste pas qu'à créer le fichier du bloc de serveur de nginx. En voici un exemple : micro /etc/nginx/sites-available/blog.conf server { listen 80; root /var/www/html/wordpress; index index.php index.html index.htm; server_name blog.local ; error_log /var/log/nginx/blog.local_error.log; access_log /var/log/nginx/blog.local_access.log; client_max_body_size 100M; location / { try_files $uri $uri/ /index.php?$args; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php7.4-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } } Tester la configuration de ce fichier, l'activer et recharger nginx. nginx -t ln -s /etc/nginx/sites-available/blog.conf /etc/nginx/sites-enabled/ service nginx reload Reste à adapter le fichier /etc/hosts en ajoutant la ligne suivante micro /etc/hosts Et ajouter la ligne 127.0.0.1 blog.local {{/file-Rd318befa1ed320bc4f4a9f661fce2165.png?700}} {{/file-Rfa6484856918f41dfa4ee99f9821be1e.png?700}} {{/file-Ra2293a704ce7514eee87cfb7f366e266.png?700}} {{/file-Ra0e0e1458476106945556ba469715eaf.png?700}} {{/file-Rf140b1181df1652ad373619366115521.png?700}} ===== Faire tourner plusieurs versions de PHP ===== Installer les paquets suivants apt install -y lsb-release ca-certificates apt-transport-https software-properties-common gnupg2 Ajouter cette entrée aux dépôts APT de la machine. Cette entrée sera identifiée dans un fichier spécifique : sury-php.list echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | tee /etc/apt/sources.list.d/sury-php.list Vérifier la bonne création de ce fichier cat /etc/apt/sources.list.d/sury-php.list deb https://packages.sury.org/php/ bullseye main Importer la clef de contrôle de ce dépôt wget -qO - https://packages.sury.org/php/apt.gpg | apt-key add - Mettre à jour la base de données APT apt update Vérifier que les paquets php8 sont bien présents apt search php Limiter aux paquets php-fpm apt search php8 | grep fpm Installer php8.1 fpm et quelques utilitaires apt install php8.0-{mysql,cli,common,imap,ldap,xml,fpm,curl,mbstring,zip} Vérifier que les 2 versions de php soient bien prises en compte ls /run/php/ php7.4-fpm.pid php7.4-fpm.sock php8.1-fpm.pid php8.1-fpm.sock php-fpm.sock Activer une version de php 8.1 dans un bloc de serveur nginx. On utilisera ici le bloc de serveur précédemment créé : site2 micro /etc/nginx/sites-available/site2.conf Et modifier la ligne fastcgi_pass unix:/run/php/php7.4-fpm.sock; doit devenir fastcgi_pass unix:/run/php/php8.1-fpm.sock; Sauvegarder Vérifier la syntaxe de nginx et recharger sa configuration nginx -t service nginx reload Dans le navigateur internet, vérifier que le site2 renvoie bien la nouvelle configuration. {{/file-R9cee640b345ad48c8522a3728bf483ac.png?700}} Dès lors vous avez donc site1 --> interprète du php 7.4 site2 --> interprète du php 8.1 ===== Conclusions ===== Voilà donc un premier aperçu de la prise en main de nginx afin d’un serveur web dynamique, pluri-sites et gérant différentes versions de php. (2) [[https://www.nginx.com/resources/wiki/start/topics/examples/server_blocks/ | Nginx Server Blocks ]]