FreeBSD, Caddy e PHP: un connubio perfetto

| 5 settembre 2022

Caddy

Caddy è un ottimo server web. È più facile da configurare rispetto a nginx e gestisce autonomamente e automaticamente le richieste/rinnovi dei certificati ssl, quindi non è necessario utilizzare certbot/cron. A volte si potrebbe preferire usare Caddy invece di Nginx/Apache/Lighttpd/etc. FreeBSD e Caddy funzionano molto bene insieme per siti web statici/reverse proxy, ma spesso abbiamo a che fare con siti web dinamici. Aggiungere PHP alla “ricetta” è abbastanza facile.

Iniziamo con l’installare e abilitare Caddy:

pkg install caddy
service caddy enable

Ora installiamo PHP - per esempio, PHP 8.1 - e abilitiamo php-fpm:

pkg install php81
service php-fpm enable

Quando possibile preferisco utilizzare php-fpm tramite socket locali, se il server web e php-fpm sono in esecuzione sullo stesso host. Modifichiamo quindi alcune configurazioni editando il file /usr/local/etc/php-fpm.d/www.conf:

Sostituiamo

listen = 127.0.0.1:9000

in

listen = /var/run/php81.sock

Quindi, modifichiamo il proprietario del socket. Basta decommentare le righe seguenti:

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

Avviamo ora php-fpm:

service php-fpm start

Modifichiamo ora /usr/local/etc/caddy/Caddyfile. Aggiungiamo qualcosa del genere:

my.website.com {
root * /usr/local/www/website
php_fastcgi unix//var/run/php81.sock
file_server
}

Questo configurerà un virtualhost chiamato my.website.com (e Caddy cercherà di ottenere un certificato), con la sua radice su /usr/local/www/website e processerà qualsiasi richiesta di file .php tramite il socketphp. La direttiva file_server assicura che i file statici possano essere serviti dal percorso root. Avviamo ora Caddy:

service caddy start

Questo è tutto. Naturalmente si tratta di una configurazione molto elementare, ma può essere usata come bozza per setup più avanzati. Per esempio, si può aggiungere qualcosa del tipo:

    @disallowed {
        path /xmlrpc.php
        path *.sql
        path /wp-content/uploads/*.php
    }

    rewrite @disallowed '/index.php'

Tradotto dall’originale in inglese sul blog https://it-notes.dragas.net