{{tag>tutoriel}} ====== LEMP : un serveur avec Linux, Nginx, MariaDB, PHP ====== **LEMP** ((**L**inux, NGINX (**e**ngine X), **M**ySQL/MariaDB, **P**HP/**P**erl/**P**ython)) est un serveur HTTP composé de : * **[[logiciel:internet:nginx:start]]** * **PHP**, ou plutôt le packet **php-fpm**, interface pour communiquer avec le serveur NGINX et PHP. * **[[logiciel:sql:mariadb:start]]** * **[[logiciel:internet:adminer:start]]** ===== Pré-requis ===== **Pour le cas d'un Raspberry**, procéder en ligne de commande via SSH. * un **PC** sous Linux (ubuntu) (ou un Raspberry Pi) * ou un **Raspberry Pi** accédé via **SSH** * mis à jour :...@...:~$ sudo apt update ...@...:~$ sudo apt upgrade ...@...:~$ sudo apt dist-upgrade ===== Première étape ===== - **Installez** les paquets **[[apt>nginx,php-{fpm,gd,curl,intl,xmlrpc,mbstring,mysql,xml,zip}]]** ou en ligne de commande :...@...:~$ sudo apt install nginx php-{fpm,gd,curl,intl,xmlrpc,mbstring,mysql,xml,zip}Pour gérer les fichiers PHP avec Nginx, nous utilisons **php-fpm** (une version plus rapide de PHP) plutôt que PHP.\\ Cette installation a créé le répertoire **/var/www/html** pour la racine des sites. - **Vérifiez que NGINX est bien démarré** : sur un PC du réseau, ouvrez dans un navigateur l'adresse IP du serveur [[http://]]. Si tout va bien, il s'affiche :{{ tutoriel:internet:lemp:lemp-01.png?400 |}}Vous pouvez aussi vérifier que le service NGINX est bien démarré :...@...:~$ sudo systemctl is-active nginx active - **Sauvegardez les fichiers de configuration** :...@...:~$ sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.dist ===== Autres étapes ===== - **[[tutoriel:internet:serveur:racine:start]]** - **Sauvegardez /etc/nginx/sites-available/default** :...@...:~$ sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.dist - **Éditez avec les droits d'administration le fichier /etc/nginx/sites-available/default** : * **Remplacez la ligne**index index.html index.htm index.nginx-debian.html;parindex index.html index.htm index.php;Cela rajoute une redirection automatique vers les fichiers **index.php** pour les dossiers du site. * **Activez php-fpm** pour Nginx, modifiez les lignes #location ~ \.php$ { # include snippets/fastcgi-php.conf; # # # With php5-cgi alone: # fastcgi_pass 127.0.0.1:9000; # # With php5-fpm: # fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; #}pour obtenir : location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; } - **Modifiez les droits du dossier /var/www/html** pour gérer plus facilement les sites :...@...:~$ sudo chown -R www-data:pi /var/www/html/ ...@...:~$ sudo chmod -R 2770 /var/www/html/ - **Ajoutez un fichier index.php** pour vérifier que PHP fonctionne :...@...:~$ echo "" > /var/www/html/index.php - **Redémarrez Nginx** pour appliquer les modifications :...@...:~$ sudo nginx -s reload - **Vérifiez l'installation de PHP** : * **Version de PHP installée** :...@...:~$ php -v PHP 7.3.19-1~deb10u1 (cli) (built: Jul 5 2020 06:46:45) ( NTS ) ... -> Ici, la version de php installée est 7.3 * **État de PHP** :...@...:~$ sudo systemctl status php7* ● php7.3-fpm.service - The PHP 7.3 FastCGI Process Manager ... Active: active (running) since Tue 2020-10-27 14:14:12 CET; 5min ago ... * **Sur un PC du réseau, ouvrez en http l'adresse IP du serveur** [[http://]]. Si tout va bien, une page affiche les informations de PHP. - **Installez [[logiciel:sql:mariadb:start]]** - **Installez [[logiciel:internet:ftp:vsftpd:start]]** - **Installez [[logiciel:internet:adminer:start]]** - **Sécurisez Nginx** : * **[[tutoriel:internet:nginx:ssl:autosigne:raspi:start]]** * **[[tutoriel:internet:nginx:ssl:letsencrypt:start]]** ==== Désinstallation ==== - **Arrêtez nginx** :...@...:~$ sudo systemctl stop nginx.service - **Démontez /var/www** et **/srv** :...@...:~$ sudo umount /var/www ...@...:~$ sudo umount /srv - **Retirez (commentez) le montage de /var/www et /srv** :...@...:~$ sudo nano /etc/fstab - **Supprimez php-fpm** :...@...:~$ sudo apt purge php-fpm - **Supprimez nginx** :...@...:~$ sudo apt purge nginx* - **Terminez l'effacement** :...@...:~$ sudo apt autoremove - **Effacez /var/www/** et ses sous-répertoires :...@...:~$ sudo rm -R /var/www/ ==== Installation du serveur MariaDB et du client en ligne de commande ==== - Installez le paquet **[[apt>mariadb-server]]** ou en ligne de commande :...@...:~$ sudo apt install mariadb-server - Vérifiez votre installation en lançant le client MariaDB en ligne de commande :...@...:~$ sudo mariadb Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 49 Server version: 10.3.25-MariaDB-0+deb10u1 Raspbian 10 Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> exit Bye Sortez de la session en tapant **exit**\\ C'est cet outil que vous utiliserez pour configurer l'instance de base de données pour votre application PHP. ==== Configuration par défaut de Nginx pour qu'il traite les requêtes PHP ==== - Faites une copie du fichier **/etc/nginx/sites-available/default** :...@...:~$ sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.dist - Répérez le **socket d’écoute de php-fpm** :...@...:~$ ls -l /var/run/php/ total 4 -rw-r--r-- 1 root root 5 oct. 27 08:15 php7.3-fpm.pid srw-rw---- 1 www-data www-data 0 oct. 27 08:15 php7.3-fpm.sock-> Ici, il faudra utiliser /var/run/php/php7.3-fpm.sock dans les fichiers de configuration de nginx. - Éditez avec les droits d'administration le fichier **etc/nginx/sites-available/default** pour le modifier comme ceci : * remplacez # Add index.php to the list if you are using PHP index index.html index.htm index.nginx-debian.html; par # Add index.php to the list if you are using PHP index index.html index.htm index.php index.nginx-debian.html; * remplacez # pass PHP scripts to FastCGI server # #location ~ \.php$ { # include snippets/fastcgi-php.conf; # # # With php-fpm (or other unix sockets): # fastcgi_pass unix:/run/php/php7.3-fpm.sock; # # With php-cgi (or other tcp sockets): # fastcgi_pass 127.0.0.1:9000; #} par # pass PHP scripts to FastCGI server # location ~ \.php$ { include snippets/fastcgi-php.conf; # With php-fpm (or other unix sockets): fastcgi_pass unix:/run/php/php7.3-fpm.sock; } - Redémarrez Nginx ...@...:~$ sudo systemctl restart nginx - Pour vérifier que Nginx exécute PHP, créez le fichier **/var/www/html/index.php** :Dans votre navigateur, allez à [[http://]] :{{ tutoriel:internet:lemp:lemp-02.png?400 |}} ==== Configurer Nginx pour qu'il traite les requêtes PHP pour un nom de domaine ==== Supposons que nous souhaitons répondre aux requêtes PHP pour **abcd1234.com**. Créez avec les droits d'administration le fichier **/etc/nginx/sites-enabled/abcd1234.com.conf** : server { listen 80; ## Your website name goes here. server_name abcd1234.com www.abcd1234.com; root /var/www/abcd1234.com; ## This should be in your http block and if it is, it's not needed here. index index.php; location / { try_files $uri $uri/ /index.php?$args; } location ~ \.php$ { include fastcgi.conf; fastcgi_intercept_errors on; fastcgi_pass unix:/run/php/php7.3-fpm.sock; fastcgi_buffers 16 16k; fastcgi_buffer_size 32k; } } ==== Mise en place de PHP ==== - éditez avec les droits d'administration le fichier **/etc/nginx/sites-available** pour y écrire ceci : # Site framboise4 server { listen 80; server_name framboise4.local; root /var/www/html; location / { index index.php index.html index.htm index.nginx-debian.html; try_files $uri $uri/ =404; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php7.3-fpm.sock; } location ~ /\.ht { deny all; } } server { listen 80; server_name ~^(?P.+)\.framboise4\.local$; root /var/www/html/$sub; location / { index index.php index.html index.htm index.nginx-debian.html; try_files $uri $uri/ =404; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php7.3-fpm.sock; } location ~ /\.ht { deny all; } } - Installez les **modules de php** (remplacez **php7.3** par la version trouvée ci-dessus) :...@...:~$ sudo apt install php7.3-{fpm} * Pour les installer :...@...:~$ sudo apt install php7.4-{fpm,cli,opcache,mbstring,curl,xml,gd,mysql,common,json,bcmath,bz2,intl,zip,pdo,imagick,tidy,xmlrpc,dev,imap,soap} FIXME php7.4-apc n'est pas retrouvé - **Installez [[logiciel:programmation:php:start]]** - [[logiciel:internet:nginx:start]] * **Installez [[logiciel:internet:nginx:raspi:start]]** - **Installez la base de données SQL**, selon le cas : * **MariaDB** : définissez le mot de passe de l'utilisateur root de MariaDb :$ sudo mysql_secure_installationAu début, répondre Entrée car il n'y a pas de mot de passe, puis en donner un). MariaDB est installé et prêt à l'emploi. * **SQLite** :Repérez la version de php installée :...@...:~$ php -v PHP 7.4.3 (cli) (built: May 26 2020 12:24:22) ( NTS ) ...et utilisez-la pour installer sqlite :...@...:~$ sudo apt install sqlite sqlite-doc php7.4-sqlite3 ... Souhaitez-vous continuer ? [O/n] ... - Configurer MariaDB : vérifiez que MariaDb est bien démarré :$ sudo systemctl is-active nginx active ==== Démarrer le gestionnaire de processus FastCGI ==== Affichez la version de php :$ php -v PHP 7.2.19-0ubuntu0.18.04.1 (cli) (built: Jun 4 2019 14:48:12) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies with Zend OPcache v7.2.19-0ubuntu0.18.04.1, Copyright (c) 1999-2018, by Zend Technologies Démarrez le gestionnaire de processus FastCGI en lançant la commande (aidez-vous de l'auto-complétion avec la version trouvée ci-dessus) : $ sudo systemctl enable php7.2-fpm Synchronizing state of php7.2-fpm.service with SysV service script with /lib/systemd/systemd-sysv-install. Executing: /lib/systemd/systemd-sysv-install enable php7.2-fpm PHP-FPM est une alternative à PHP FastCGI. ==== Configurer et démarrer le serveur NGINX ==== Une fois PHP installé, il faut indiquer à NGINX d'exécuter PHP en utilisant PHP-FPM. ++++ Fichier /etc/nginx/sites-available/default d'origine| ## # You should look at the following URL's in order to grasp a solid understanding # of Nginx configuration files in order to fully unleash the power of Nginx. # https://www.nginx.com/resources/wiki/start/ # https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/ # https://wiki.debian.org/Nginx/DirectoryStructure # # In most cases, administrators will remove this file from sites-enabled/ and # leave it as reference inside of sites-available where it will continue to be # updated by the nginx packaging team. # # This file will automatically load configuration files provided by other # applications, such as Drupal or Wordpress. These applications will be made # available underneath a path with that package name, such as /drupal8. # # Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples. ## # Default server configuration # server { listen 80 default_server; listen [::]:80 default_server; # SSL configuration # # listen 443 ssl default_server; # listen [::]:443 ssl default_server; # # Note: You should disable gzip for SSL traffic. # See: https://bugs.debian.org/773332 # # Read up on ssl_ciphers to ensure a secure configuration. # See: https://bugs.debian.org/765782 # # Self signed certs generated by the ssl-cert package # Don't use them in a production server! # # include snippets/snakeoil.conf; root /var/www/html; # Add index.php to the list if you are using PHP index index.html index.htm index.nginx-debian.html; server_name _; location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. try_files $uri $uri/ =404; } # pass PHP scripts to FastCGI server # #location ~ \.php$ { # include snippets/fastcgi-php.conf; # # # With php-fpm (or other unix sockets): # fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; # # With php-cgi (or other tcp sockets): # fastcgi_pass 127.0.0.1:9000; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} } # Virtual Host configuration for example.com # # You can move that to a different file under sites-available/ and symlink that # to sites-enabled/ to enable it. # #server { # listen 80; # listen [::]:80; # # server_name example.com; # # root /var/www/example.com; # index index.html; # # location / { # try_files $uri $uri/ =404; # } #} ++++ Pour cela, dupliquez le fichier /etc/nginx/sites-available/default : $ sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.dist Éditez avec les droits d'administration le fichier **/etc/nginx/sites-available/default** pour le remplacer par ceci : server { listen 80 default_server; listen [::]:80 default_server; root /var/www/html; index index.php index.html index.htm index.nginx-debian.html; server_name _; location / { try_files $uri $uri/ =404; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php7.2-fpm.sock; } location ~ /\.ht { deny all; } } Testez la configuration : $ sudo nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful $ sudo nginx -s stop $ sudo nginx Créez un fichier /var/www/html/test/test.php dans le répertoire web racine de NGINX : Vérification : [[http://localhost/test]] ==== Serveurs virtuels ==== Créez avec les droits d'administration le fichier **/etc/nginx/sites-available/monsite.tld** pour y écrire : server { listen 80; root /var/www/html; index index.php index.html index.htm index.nginx-debian.html; server_name monsite.tld; location / { try_files $uri $uri/ =404; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php7.2-fpm.sock; } location ~ /\.ht { deny all; } } **__Explications__** Voici ce que font ces directives et ces blocs location : ; listen : Port sur lequel Nginx écoute. : 80 = port par défaut pour HTTP ; root : emplacement de la racine du site Web. ; index : fichiers index.php prioritaires ; server_name : nom de domaine ou adresse IP de votre serveur. ; location / : La directive try_files vérifie l’existence de fichiers demandés : Si Nginx ne le trouve pas, il retourne une erreur 404. ; location ~ \.php$ : gère le traitement PHP en pointant Nginx vers le fichier de configuration fastcgi-php.conf et le fichier php7.2-fpm.sock, qui indique le type de socket associé à php-fpm.. ; location ~ /\.ht : bloc location pour les fichiers .htaccess, que Nginx ne traite pas. : La directive deny all ne transmet pas aux visiteurs des éventuels fichiers .htaccess Activez votre site en créant un lien symbolique dans le dossier **/etc/nginx/sites-enable** : $ sudo ln -s /etc/nginx/sites-available/monsite.tld /etc/nginx/sites-enabled/monsite.tld Redémarrez nginx : $ sudo nginx -s reload === Configuration d'hôtes virtuels sur NGinx avec support automatique des sous-domaines, du SSL et de l'authentification === === Configurer Nginx pour gérer automatiquement les sous-domaines locaux === == Création d’un nouveau site nginx == éditez avec les droits d'administration le fichier **/etc/nginx/sites-available/monsite.local** pour y écrire : server { # On écoute le port 80. listen 80; # expression régulière pour récupérer # le sous-domaine dans une variable nommée "sub". server_name ~^(?P.+)\.monsite\.local$; location / { # On définit le chemin local # en utilisant la variable "sub" récupérée précédemment. root /var/www/html/$sub; } } Activez votre site en créant un lien symbolique dans le dossier **/etc/nginx/sites-enable** : $ sudo ln -s /etc/nginx/sites-available/local.dev /etc/nginx/sites-enable/monsite.local Redémarrez le serveur via la commande : $ sudo service nginx restart # Le nom du sous-domaine est mis dans une variable sub, # utilisée ensuite pour définir la racine # Sites dokuwiki server { listen 80; server_name ~^(?Pdoc|perso|site2)\.chateau\.parc$; root /var/www/html/$sub; location / { index index.php index.html index.htm; try_files $uri $uri/ =404; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php7.2-fpm.sock; } location ~ /(data|conf|bin|inc)/ { deny all; } location ~ /\.ht { deny all; } } # Autres sous-domaines server { listen 80; server_name ~^(?P.+)\.chateau\.parc$; root /var/www/html/$sub; location / { index index.php index.html index.htm index.nginx-debian.html; try_files $uri $uri/ =404; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php7.2-fpm.sock; } location ~ /\.ht { deny all; } } === Création des domaines génériques avec dnsmasq === Installez le paquet **[[apt>dnsmasq]]** ou en ligne de commande :$ sudo apt install dnsmask Ouvrez ou créez avec les droits d'administration le fichier **/etc/dnsmasq.d/local.conf** et ajoutez-lui la ligne : address=/mondomaine.tld/127.0.0.1 Dans notre exemple, nous avons donc ajouter: address=/monsite.local/127.0.0.1 On redémarre dnsmasq :$ sudo systemctl restart dnsmasq et on peut constater que nos domaines sont accessibles. Désormais, tous les domaines ***.mondomaine.tld** existent. Vous pouvez le vérifier : * Installez le paquet **[[apt>dnsutils]]** ou en ligne de commande :$ sudo apt install dnsutils * Lancez-le :$ dig test.localhost ; <<>> DiG 9.11.3-1ubuntu1.7-Ubuntu <<>> test.localhost ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 47480 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 65494 ;; QUESTION SECTION: ;test.localhost. IN A ;; ANSWER SECTION: test.localhost. 0 IN A 127.0.0.1 ;; Query time: 0 msec ;; SERVER: 127.0.0.53#53(127.0.0.53) ;; WHEN: Sat May 04 23:35:51 CEST 2019 ;; MSG SIZE rcvd: 59 ===== Conclusion ===== ===== Problèmes connus ===== ??? Erreur 403 forbidden, un classique de Nginx !!! L’erreur 403 est fréquente avec Nginx, mais simple à corriger. - Cela peut signifier que Nginx ne trouve pas de fichier à afficher. Pour tester cela, créez un fichier index.html dans le répertoire **/var/www** :echo 'Nginx marche !' > /var/www/html/index.html et ré-essayez d’accéder à votre site. Si le problème venait de là, vous devriez obtenir une page marquée **Nginx marche !** - Sinon, c'est peut-etre que Nginx ne peut accéder au répertoire **/var/www/html**. Dans ce cas, donne au répertoire **/var/www** les autorisations suffisantes. - Dernière possibilité : vous avez mal activé php. ===== Voir aussi ===== * **(fr)** [[https://web.developpez.com/tutoriels/creer-serveur-web-nginx-php-mariadb/]] * **(fr)** [[https://raspberry-pi.fr/installer-nginx-raspbian-raspberry/]] * **(en)** [[https://www.techcoil.com/blog/how-to-setup-a-raspberry-pi-lemp-server-with-raspbian-buster-lite-for-running-php-applications/|How to setup a Raspberry Pi LEMP server with Raspbian Buster Lite for running PHP applications]] * **(en)** [[https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-on-ubuntu-14-04]] ---- //Basé sur << [[https://web.developpez.com/tutoriels/creer-serveur-web-nginx-php-mariadb/|Créer un serveur Web Nginx + PHP7 + Maria DB (Mysql) + PhpMyAdmin sous Debian 9 Stretch]] >> par Quentin Beauvais.//