Table des matières

Serveurs Web PHP

De nombreux serveurs utilisent le langage php pour créer des pages dynamiquement. Ceci se fait par le biais d'un canal fastcgi de votre serveur web: php-fpm.

Comme souvent, nous allons en isoler les mécanismes dans une jail. C'est dans celle-ci que vous installerez vos clients, comme ce dokuwiki.

Jail

Sa configuration est simple, mais comme la plupart des clients php réclame /dev/null our dev/random, intallez le devfs.

/etc/jail.conf
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 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.

/usr/local/etc/php-fpm.d/www.conf
; 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
  1. supprimer la ligne ip4.addr de la configuration de la jail
  2. et préciser ip4=disable.

Démarrez:

service -j php php-fpm start

Programmez newsyslog(8) pour nettoyer les journaux:

/etc/newsyslog.conf.d/php.conf
/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 service de transport de sendmail dans votre jail et précisez vos paramètres dans le fichier de configuration,

/usr/local/etc/php.ini
--- 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
/usr/local/etc/php-fpm.d/www.conf
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 nginx,

/usr/local/etc/nginx/nginx.conf
       server {
                http2 on; 
                listen [::]:80; 
                listen 80;
 
                server_name popeye.lapinbilly.eu; # Replace with your hostname
 
 
               root /jails/php/usr/local/www/<site php>;
               index <site php>.php;
 
               client_max_body_size 15M;
               client_body_buffer_size 128K;
 
               location / {
                       try_files $uri $uri/ @<site_php>;
               }
               location @<site_php> {
                       rewrite ^/_media/(.*) /lib/exe/fetch.php?media=$1 last;
                       rewrite ^/_detail/(.*) /lib/exe/detail.php?media=$1 last;
                       rewrite ^/(.*) /<truc php>.php?id=$1&$args last;
               }
 
               location ~ \.php$ {
                       try_files $uri $uri/ /<site php>.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/<site php>/$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:

/usr/local/etc/nginx/dokuwi.conf
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 sur le site de nginx.

Versions

Attention, les ports dépendant de php sont gérés par les 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
? <?php echo 'PHP version: ' . phpversion();
? EOF

Migration

Il suffit de suivre le manuel du sieur Lucas