====== Serveurs Web PHP ====== De nombreux serveurs utilisent le langage [[https://www.freshports.org/lang/php72|php]] pour créer des pages dynamiquement. Ceci se fait par le biais d'un canal [[https://fr.wikipedia.org/wiki/Common_Gateway_Interface|fastcgi]] de votre serveur web: ''php-fpm''. Comme souvent, nous allons en isoler les mécanismes dans une [[::jails:zfs|jail]]. C'est dans celle-ci que vous installerez vos clients, comme ce [[https://www.freshports.org/www/dokuwiki/|dokuwiki]]. ===== Jail ===== Sa configuration est simple, mais comme la plupart des clients php réclame ''/dev/null'' our ''dev/random'', intallez le ''devfs''. php { host.hostname = php; # Hostname # ip4 = disable; # update/install ended: lock out the jail ip4.addr = "lo1|192.168.0.12"; # IP address of the jail path ="/jails/php"; # Path to the jail mount.devfs; # /dev/random pour ssl exec.start = "/bin/sh /etc/rc"; # Start command exec.stop = "/bin/sh /etc/rc.shutdown"; # Stop command } On assure le démarrage au //reboot//: sysrc jail_enable="YES" sysrc jail_list+="php" Installez ici la version de ''php'' que vous désirez: jail -c php pkg -j php install lang/php83 sysrc -j php php_fpm_enable=yes Vous aurez probablement besoin de ceux-là pour vos clients: pkg -j php install lang/php83-extensions Notez que '''lang/php83-extensions''' produit un grand nombre d'extensions par défaut. La plupart des extensions requises sont accessibles par ce port ou individuellement. Si vous installez un [[https://www.freebsd.org/doc/handbook/ports.html|port]] ce sera fait automatiquement, mais vous pouvez souvent vous contenter de cloner un dépôt. ===== Configuration ===== Configurez ''php'' à partir d'un fichier exemple: cp /usr/local/etc/php.ini-production /usr/local/etc/php.ini Configurez ''php-fpm'' pour qu'il écoute soit sur un port TCP, sur l'adresse de votre ''jail'', soit sur une ''socket unix''. ; listen = 192.168.0.12:9000 listen = /var/run/php-fpm.sock listen.owner = www listen.group = www listen.mode = 0660 Dans ce cas, on utilise une socket unix. Il est alors inutile de donner une ip à la jail, vous pouvez - supprimer la ligne ''ip4.addr'' de la configuration de la ''jail'' - et préciser ''ip4=disable''. Démarrez: service -j php php-fpm start Programmez newsyslog(8) pour nettoyer les journaux: /var/log/php-fpm.log 600 7 1000 * J /var/run/php-fpm.pid ==== Messagerie ==== Par défaut, //php// utilise les fonctions de sendmail(8) pour envoyer des messages. Si vous avez besoin de cette fonction, activer le [[jails:zfs#mail|service de transport de sendmail]] dans votre ''jail'' et précisez vos paramètres dans le fichier de configuration, *Soit dans le fichier général de ''php'', --- usr/local/etc/php.ini-production 2020-04-19 16:29:28.000000000 +0200 +++ usr/local/etc/php.ini 2020-05-07 14:07:14.400227000 +0200 @@ -1056,7 +1056,7 @@ ; For Unix only. You may supply arguments as well (default: "sendmail -t -i"). ; http://php.net/sendmail-path -;sendmail_path = +sendmail_path = /usr/sbin/sendmail -t -i ; Force the addition of the specified parameters to be passed as extra parameters ; to the sendmail binary. These parameters will always replace the value of * Soit dans le fichier dédié à votre service: php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i php_flag[display_errors] = off php_admin_value[error_log] = /var/log/fpm-php.www.log php_admin_flag[log_errors] = on php_admin_value[memory_limit] = 32M ===== Serveur Web ===== Il suffit de transférer les requêtes via ''fastcgi'', avec un piège, les scripts ne seront pas situé au même endroit, selon qu'ils soient vu du serveur web ou de la ''jail''. Prenons le classique [[:ports:nginx|nginx]], server { http2 on; listen [::]:80; listen 80; server_name popeye.lapinbilly.eu; # Replace with your hostname root /jails/php/usr/local/www/; index .php; client_max_body_size 15M; client_body_buffer_size 128K; location / { try_files $uri $uri/ @; } location @ { rewrite ^/_media/(.*) /lib/exe/fetch.php?media=$1 last; rewrite ^/_detail/(.*) /lib/exe/detail.php?media=$1 last; rewrite ^/(.*) /.php?id=$1&$args last; } location ~ \.php$ { try_files $uri $uri/ /.php; # fastcgi_pass 192.168.0.12:9000; fastcgi_pass unix:/jails/php/var/run/php-fpm.sock; fastcgi_param REDIRECT_STATUS 200; include fastcgi_params; fastcgi_param SCRIPT_FILENAME /usr/local/www//$fastcgi_script_name; } Ceci est tiré de l'exemple de ce wiki, les directives sont en général données par les notices d'installation de l'outil web que vous voulez installer. C'est bien souvent le ''fastcgi_param'' qu'il faut adapter à la ''jail'' au lieu d'utiliser un ''$document_root''. Par exemple,ce dokuwiki: include drop.conf; client_max_body_size 15M; client_body_buffer_size 128k; location / { try_files $uri $uri/ @dokuwiki; } location ~ \.php$ { try_files $uri $uri/ /doku.php; fastcgi_pass unix:/jails/php/var/run/php-fpm.sock; fastcgi_param REDIRECT_STATUS 200; include fastcgi_params; fastcgi_param SCRIPT_FILENAME /usr/local/www/dokuwiki/$fastcgi_script_name; } location @dokuwiki { rewrite ^/_media/(.*) /lib/exe/fetch.php?media=$1 last; rewrite ^/_detail/(.*) /lib/exe/detail.php?media=$1 last; rewrite ^/_export/([^/]+)/(.*) /doku.php?do=export_$1&id=$2 last; rewrite ^/(.*) /doku.php?id=$1&$args last; } # Block access to data folders location ~ /(data|conf|bin|inc)/ { deny all; } # Block access to .htaccess files location ~ /\.ht { deny all; } Vous trouverez des explications [[https://www.nginx.com/resources/wiki/start/topics/recipes/dokuwiki/|sur le site de nginx]]. ===== Versions ===== Attention, les ports dépendant de php sont gérés par les [[https://docs.freebsd.org/en/books/porters-handbook/flavors/|flavors]]. Pensez à l'indiquer dans le nom des //ports// à télécharger ou à construire. De même, précisez la version par défaut de php dans votre ''Make.conf'': DEFAULT_VERSIONS+=php=8.2 Pour la connaître: root@php: php << EOF ? ===== Migration ===== Il suffit de suivre le manuel du [[https://mwl.io/archives/22357 | sieur Lucas]]