Comment installer une pile Nginx, MySQL et PHP (FEMP) sur FreeBSD 10.1

introduction

Nginx, MySQL et PHP peuvent être combinés facilement en une puissante solution de gestion de contenu dynamique sur le Web. Ces trois logiciels peuvent être installés et configurés sur une machine FreeBSD pour créer ce qu’on appelle une * pile FEMP *.

Dans ce guide, nous montrerons comment installer une pile FEMP sur un serveur FreeBSD 10.1. Nous allons installer le logiciel à l’aide de packages afin de pouvoir fonctionner plus rapidement. Ces packages fournissent des valeurs par défaut raisonnables qui fonctionnent bien pour la plupart des serveurs.

Installer les composants

Pour commencer, nous allons installer tous les logiciels dont nous avons besoin en utilisant le système de paquets FreeBSD. La commande "install" mettra à jour notre copie locale des packages disponibles, puis installera les packages que nous avons demandés:

sudo pkg install nginx mysql56-server php56 php56-mysql

Cela téléchargera et installera un serveur Web Nginx pour servir notre contenu, un serveur de base de données MySQL utilisé pour stocker des informations et le langage de traitement PHP pour traiter le contenu dynamique.

Une fois l’installation terminée, assurez-vous d’exécuter la commande + rehash + si vous exécutez le shell + tcsh + par défaut. Cela rend le shell conscient des nouvelles applications que vous avez installées:

rehash

Lorsque vous avez terminé, vous pouvez passer à l’activation et à la configuration de vos composants.

Activer tous les services

Dans la dernière section, nous avons téléchargé trois services distincts devant s’exécuter sur notre serveur.

Pour que FreeBSD les lance en tant que services conventionnels, nous devons dire à FreeBSD que nous voulons les activer. Cela nous permettra de les gérer comme des services plutôt que comme des applications uniques et cela configurera également FreeBSD pour les démarrer automatiquement au démarrage.

Premièrement, nous devons connaître le paramètre rc correct à définir pour chaque service. Les scripts de service, situés dans le répertoire + / usr / local / etc / rc.d +, définissent le paramètre à utiliser pour activer chaque serveur à l’aide de la variable + rcvar +. Nous pouvons voir ce que chaque service + rcvar + est défini en tapant:

grep rcvar /usr/local/etc/rc.d/*

Vous devriez obtenir une liste comme celle-ci:

/usr/local/etc/rc.d/avahi-daemon:rcvar=avahi_daemon_enable
/usr/local/etc/rc.d/avahi-dnsconfd:rcvar=avahi_dnsconfd_enable
/usr/local/etc/rc.d/dbus:rcvar=dbus_enable
/usr/local/etc/rc.d/mysql-server:
/usr/local/etc/rc.d/nginx:rcvar=
/usr/local/etc/rc.d/php-fpm:rcvar=
/usr/local/etc/rc.d/rsyncd:rcvar=rsyncd_enable

Comme vous pouvez le constater, cela nous permet d’imprimer facilement le paramètre que nous devons définir pour chacun de nos services. Le nom du script lui-même (le dernier composant du chemin d’accès jusqu’au caractère deux-points) est également remarquable car il nous indique le nom réel utilisé par FreeBSD pour le service.

Pour activer ces services, nous allons éditer le fichier + / etc / rc.conf + avec les privilèges sudo:

sudo vi /etc/rc.conf

À l’intérieur, nous ajouterons une ligne pour chacun des services que nous souhaitons démarrer. Nous pouvons utiliser le paramètre + rcvar + que nous avons découvert pour chaque service et le régler sur «YES» pour activer chacun d’eux:

mysql_enable="YES"
nginx_enable="YES"
php_fpm_enable="YES"

Enregistrez et fermez le fichier lorsque vous avez terminé.

Configurer PHP

Ensuite, nous allons configurer notre service PHP-FPM, qui sera responsable du traitement des requêtes PHP envoyées depuis notre serveur Web.

Pour commencer, allez dans le répertoire + / usr / local / etc +, où sont stockés les fichiers de configuration de nos programmes facultatifs:

cd /usr/local/etc

Il y a un certain nombre de fichiers de configuration PHP dans ce répertoire que nous voudrons modifier. Nous allons commencer par le fichier de configuration PHP-FPM lui-même. Ouvrez-le avec les privilèges + sudo +:

sudo vi php-fpm.conf

À l’intérieur, nous voulons ajuster quelques options différentes. Tout d’abord, nous voulons configurer PHP-FPM pour utiliser un socket Unix au lieu d’un port réseau pour la communication. Ceci est plus sécurisé pour les services qui communiquent au sein d’un seul serveur.

Trouvez la ligne qui ressemble à ceci:

listen = 127.0.0.1:9000

Changez ceci pour utiliser un socket dans le répertoire + / var / run +:

listen =

Ensuite, nous allons configurer le propriétaire, le groupe et le jeu d’autorisations du socket qui sera créé. Il existe un groupe d’options commentées qui gère cette configuration et qui ressemble à ceci:

;listen.owner = www
;listen.group = www
;listen.mode = 0660

Activez-les en supprimant le marqueur de commentaire au début:

listen.owner = www
listen.group = www
listen.mode = 0660

Enregistrez et fermez le fichier lorsque vous avez terminé.

Ensuite, nous devons créer un fichier + php.ini qui configurera le comportement général de PHP. Deux exemples de fichiers ont été inclus et peuvent être copiés dans le fichier + php.ini lu par PHP.

Le fichier + php.ini-production sera plus proche de ce dont nous avons besoin, nous allons donc l’utiliser. Copiez la version de production dans le fichier que PHP vérifie pour:

sudo cp php.ini-production php.ini

Ouvrez le fichier pour l’éditer avec les privilèges + sudo +:

sudo vi php.ini

À l’intérieur, nous devons trouver une section qui configure le comportement + cgi.fix_pathinfo +. Il sera commenté et réglé sur «1» par défaut. Nous devons décommenter cela et le régler sur «0». Cela empêchera PHP d’essayer d’exécuter des parties du chemin si le fichier qui a été transmis au processus n’est pas trouvé. Cela pourrait être utilisé par des utilisateurs malveillants pour exécuter du code arbitraire si nous n’empêchons pas ce comportement.

Décommentez la ligne + cig.fix_pathinfo + et réglez-la sur «0»:

cgi.fix_pathinfo=0

Enregistrez et fermez le fichier lorsque vous avez terminé.

Maintenant que PHP-FPM est complètement configuré, nous pouvons démarrer le service en tapant:

sudo service php-fpm start

Nous pouvons maintenant passer à la configuration de notre instance MySQL.

Configurer MySQL

Pour commencer à configurer MySQL, nous devons démarrer le service MySQL:

sudo service mysql-server start

La première fois que vous exécutez cette commande, la structure de répertoires requise sera créée dans le système de fichiers et les fichiers de base de données nécessaires seront installés. Il lancera ensuite le processus du serveur MySQL.

Une fois le service démarré, nous devons sécuriser l’installation. Ceci peut être accompli via un script appelé + mysql_secure_installation +. Exécutez ceci avec les privilèges + sudo + pour verrouiller certaines valeurs par défaut non sécurisées:

sudo mysql_secure_installation
. . .

Enter current password for root (enter for none):

Le script commence par vous demander le mot de passe actuel du compte racine MySQL. Comme nous n’avons pas encore défini de mot de passe pour cet utilisateur, nous pouvons appuyer sur «ENTER» pour ignorer cette invite.

Set root password? [Y/n]

Ensuite, il vous demandera si vous souhaitez définir le mot de passe du compte racine MySQL. Appuyez sur «ENTER» pour accepter cette suggestion. Choisissez et confirmez un mot de passe administratif.

Le script contiendra ensuite des suggestions supplémentaires qui aideront à inverser certaines conditions non sécurisées dans l’installation par défaut de MySQL. Appuyez simplement sur «ENTREE» à travers toutes ces invites pour effectuer toutes les actions suggérées.

Nous pouvons redémarrer le service MySQL pour nous assurer que notre instance implémente immédiatement les modifications de sécurité:

sudo service mysql-server restart

Notre instance MySQL est maintenant opérationnelle et fonctionne comme nous le voulons afin que nous puissions passer à autre chose.

Configurez Nginx

Notre prochaine tâche consiste à configurer Nginx. Pour commencer, nous devons démarrer le serveur Web:

sudo service nginx start

Maintenant, nous pouvons commencer à configurer Nginx en allant dans le répertoire + nginx + dans le répertoire + / usr / local / etc +:

cd /usr/local/etc/nginx

Ici, nous devons ouvrir le fichier de configuration principal de Nginx avec les privilèges + sudo +:

sudo vi nginx.conf

À l’intérieur, nous pouvons commencer à apporter des modifications afin que notre instance Nginx puisse fonctionner avec nos autres composants.

Pour commencer, décommentez et modifiez la directive + utilisateur + en haut du fichier. Nous avons besoin du serveur Web pour fonctionner en tant qu’utilisateur + www +, car c’est ce que recherche notre instance PHP-FPM:

user www;

Nous devrions également définir le paramètre + worker_processus + en fonction du nombre de processeurs ou de cœurs de votre système. (Pour connaître le nombre de processeurs de votre serveur, tapez + sysctl hw.ncpu + à partir de la ligne de commande):

worker_processes ;

Ensuite, nous allons définir la verbosité et l’emplacement de l’erreur en utilisant la directive + error_log +. Nous allons nous connecter à un emplacement + / var / log / nginx / error.log + au niveau du journal + info +:

error_log ;

Dans le bloc + http +, nous allons également configurer un journal d’accès. Ce sera situé dans + / var / log / nginx / access.log +:

access_log /var/log/nginx/access.log;

Dans le bloc + serveur +, nous devons modifier la directive + nom_serveur + pour utiliser le nom de domaine ou l’adresse IP de notre serveur. Nous pouvons faire en sorte que notre serveur réponde au nom d’hôte + www + en ajoutant cela après le domaine principal:

server {
   listen          80;
   server_name      www.;

   . . .

Configurez les directives + root et` + index` dans le bloc + serveur + principal. La racine de notre document sera + / usr / local / www / nginx + et notre directive index devrait essayer de servir les fichiers + index.php + avant de revenir aux fichiers + index.html + ou + index.htm + `.

Puisque nous avons défini ces directives dans le contexte + serveur +, nous n’en avons pas besoin dans le bloc + location / +. Dans ce bloc, nous allons plutôt configurer une directive + try_files + pour essayer de répondre aux demandes des utilisateurs sous forme de fichier, puis de répertoire avant de revenir en arrière avec une erreur 404:

server {

   . . .




   location / {

   }

   . . .

Enfin, nous devons configurer un bloc d’emplacement qui gérera les fichiers PHP. Ce bloc correspond à toute demande se terminant par + .php. Il ne traitera que les fichiers eux-mêmes, en renvoyant une erreur 404 si le fichier est introuvable.

Nous allons utiliser le socket que nous avons configuré dans le fichier + php-fpm.conf + plus tôt. Nous allons également configurer d’autres options de proxy FastCGI, en partie en lisant les paramètres du fichier + fastcgi_params +. Nous devons définir explicitement le paramètre + SCRIPT_FILENAME + afin que PHP sache quels fichiers exécuter:

server {

   . . .

   location ~ \.php$ {
       try_files $uri =404;
       fastcgi_split_path_info ^(.+\.php)(/.+)$;
       fastcgi_pass unix:/var/run/php-fpm.sock;
       fastcgi_index index.php;
       fastcgi_param SCRIPT_FILENAME $request_filename;
       include fastcgi_params;
   }

Tous ensemble, avec les commentaires supprimés, le fichier devrait ressembler à ceci:

worker_processes  ;


events {
   worker_connections  1024;
}

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



   sendfile        on;
   keepalive_timeout  65;

   server {
       listen       80;
       server_name   www.;



       location / {

       }

       error_page      500 502 503 504  /50x.html;
       location = /50x.html {
           root /usr/local/www/nginx-dist;
       }









   }
}

Enregistrez et fermez le fichier lorsque vous avez terminé.

Nous devons maintenant créer le répertoire du journal et les fichiers que nous avons référencés dans notre fichier. Commencez par créer le répertoire + / var / log / nginx:

sudo mkdir -p /var/log/nginx

Ensuite, nous pouvons créer les fichiers journaux vides:

sudo touch /var/log/nginx/access.log
sudo touch /var/log/nginx/error.log

Nous sommes maintenant prêts à configurer notre racine de document. Nous avons configuré notre racine comme suit: '+ / usr / local / www / nginx + , mais il s’agit actuellement d’un lien symbolique vers le répertoire + / usr / local / www / nginx-dist + `pouvant être mis à jour par un paquet. opération dans le futur.

Nous devrions détruire le lien et créer à nouveau le répertoire non lié:

sudo rm /usr/local/www/nginx
sudo mkdir /usr/local/www/nginx

Comme nous avons encore besoin de tester notre serveur Web, nous pouvons copier le fichier + index.html dans notre nouvelle racine Web:

sudo cp /usr/local/www/nginx-dist/index.html /usr/local/www/nginx

Pendant que nous sommes ici, nous devrions également créer un fichier temporaire + info.php + que nous pourrons utiliser pour tester la capacité de Nginx à transmettre des requêtes à PHP-FPM. Créez le fichier à la racine du document avec les privilèges + sudo +:

sudo vi /usr/local/www/nginx/info.php

Dans le fichier, tapez le contenu suivant. Cela générera une page HTML avec des informations sur votre configuration PHP:

<?php phpinfo(); ?>

Enregistrez et fermez le fichier lorsque vous avez terminé.

Nous sommes maintenant prêts à redémarrer Nginx pour tirer parti de notre nouvelle configuration. Commencez par tester les erreurs de syntaxe dans votre fichier de configuration en tapant:

sudo nginx -t

Si votre fichier de configuration n’a pas d’erreur de syntaxe détectable, vous devriez voir quelque chose qui ressemble à ceci:

nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful

Si la commande ci-dessus renvoie des erreurs, rouvrez le fichier de configuration Nginx à l’emplacement où l’erreur a été détectée et essayez de résoudre le problème.

Lorsque votre configuration est correctement vérifiée, nous pouvons redémarrer Nginx:

sudo service nginx restart

Tester les résultats

Notre pile Web est maintenant terminée. Tout ce qui nous reste à faire est de le tester.

Dans votre navigateur Web, commencez par aller sur votre nom de domaine de base ou sur l’adresse IP du serveur:

http://

Vous devriez voir le contenu du fichier + index.html + que nous avons copié. Cela ressemblera à ceci:

image: https: //assets.digitalocean.com/articles/freebsd_lemp/default_index.png [Index par défaut de FreeBSD Nginx]

Cela indique que Nginx est opérationnel et capable de servir des pages HTML simples.

Ensuite, nous devrions vérifier le fichier + info.php que nous avons créé. Dans votre navigateur, visitez le nom de domaine ou l’adresse IP de votre serveur, suivi de + / info.php:

http:///info.php

Vous devriez voir une page d’informations PHP générée qui ressemble à ceci:

image: https: //assets.digitalocean.com/articles/freebsd lemp / phpinfo.png [page FreeBSD phpinfo]

Si vous pouvez voir cette page, vous avez correctement configuré une pile FEMP sur votre serveur FreeBSD.

Après avoir testé votre configuration, il est judicieux de supprimer le fichier + info.php + de la racine de votre document, car il peut donner des informations sensibles sur votre installation:

sudo rm /usr/local/www/nginx/info.php

Vous pouvez toujours recréer facilement ce fichier ultérieurement.

Conclusion

Vous devriez maintenant disposer d’un serveur Web entièrement fonctionnel, optimisé par Nginx, capable de traiter du contenu PHP dynamique et d’utiliser MySQL pour stocker des données. Cette configuration peut être utilisée comme base pour une variété d’autres configurations et applications Web.