Ricerca nel sito web

Come installare e configurare Caddy Web Server con PHP su Fedora 34/CentOS 8


Su questa pagina

  1. Prerequisiti
  2. Passaggio 1 - Configurazione del firewall
  3. Passaggio 2 - Installa Caddy
  4. Passaggio 3 - Nozioni di base sulla configurazione del caddy
    1. Configurazione di Caddy per un sito Web HTML di base
    2. Configurazione di più siti in Caddy
    3. Configurazione dei siti PHP
    4. Configurazione del proxy inverso

    1. Abilitazione dell'autenticazione HTTP
    2. Rafforzare la sicurezza del sito e abilitare HSTS

    Caddy è un server web open source scritto nel linguaggio Go. Fornisce supporto HTTP/3, TLS v1.3, configurazione SSL automatica con Lets Encrypt, proxy inverso e supporta più plug-in per estenderne le funzionalità. Ha il vantaggio che tutta la sua configurazione viene servita da un singolo file, indipendentemente dal numero di siti che devi ospitare.

    Questo tutorial riguarderà l'installazione e la configurazione di Caddy e PHP su server basati su Fedora 34 e CentOS 8. Tratteremo come ospitare siti singoli e multipli e come utilizzare il proxy inverso insieme ad alcune altre funzionalità di sicurezza.

    Prerequisiti

    • Fedora 34 or CentOS 8 based server

    • A non-root user with sudo privileges

    • A domain name pointing to the server IP address

    • SELinux is disabled.

      $ sudo setenforce 0
      
    • Make sure everything is updated.

      $ sudo dnf update
      

    Passaggio 1: configurazione del firewall

    Il primo passo è configurare il firewall per aprire le porte HTTP e HTTPS. Fedora e CentOS vengono forniti con il firewall Firewalld preinstallato.

    Controlla se il firewall è in esecuzione.

    $ sudo firewall-cmd --state
    

    Dovresti ottenere il seguente output.

    running
    

    Controlla gli attuali servizi/porte consentiti.

    $ sudo firewall-cmd --permanent --list-services
    

    Dovrebbe mostrare il seguente output.

    dhcpv6-client mdns ssh
    

    Consenti porte HTTP e HTTPS.

    $ sudo firewall-cmd --permanent --add-service=http
    $ sudo firewall-cmd --permanent --add-service=https
    

    Ricontrolla lo stato del firewall.

    $ sudo firewall-cmd --permanent --list-services
    

    Dovresti vedere un output simile.

    dhcpv6-client http https mdns ssh
    

    Ricarica il firewall.

    $ sudo systemctl reload firewalld
    

    Passaggio 2: installa Caddy

    Il primo passo è installare il server. I passaggi di installazione rimangono gli stessi sia per Fedora 34 che per CentOS 8.

    $ sudo dnf install 'dnf-command(copr)'
    $ sudo dnf copr enable @caddy/caddy
    $ sudo dnf install caddy
    

    È possibile verificare l'installazione con il seguente comando.

    $ caddy version
    v2.4.3 h1:Y1FaV2N4WO3rBqxSYA8UZsZTQdN+PwcoOcAiZTM8C0I=
    

    Passaggio 3: nozioni di base sulla configurazione del caddy

    Caddy utilizza JSON come formato principale per l'archiviazione o la scrittura della configurazione. È il modo più flessibile per scrivere la configurazione e supporta tutte le funzionalità di Caddy. Ma se non sai come scrivere file JSON, Caddy offre un modo più semplice sotto forma di Caddyfile.

    Il pacchetto Fedora/CentOS include un Caddyfile in /etc/caddy/Caddyfile. Dovrebbe essere simile al seguente (ignorando i commenti)

    :80 {
            root * /usr/share/caddy
            file_server
    }
    

    Abilita e avvia il demone caddy.

    $ sudo systemctl enable --now caddy
    

    Puoi aprire l'URL http://youripaddress per verificare. Dovresti vedere la seguente pagina di benvenuto.

    Caddy offre molte funzionalità e configurazioni, quindi andremo solo con quelle importanti per servire il nostro sito web. La configurazione predefinita serve su HTTP, che è specificato come :80. La direttiva root dice a Caddy di cercare i file da servire nella directory /usr/share/caddy.

    La direttiva file_server dice a Caddy di agire come un file server, il che significa che servirà solo file statici sull'indirizzo predefinito.

    Configurazione di Caddy per un sito Web HTML di base

    Creiamo un file di configurazione caddy di base per servire un sito web statico.

    Crea una directory per ospitare il tuo sito Web e archiviare i tuoi file di registro.

    $ sudo mkdir -p /var/www/example.com/html
    $ sudo mkdir /var/log/caddy
    

    Imposta la proprietà della directory su Caddy.

    $ sudo chown caddy:caddy /var/www/example.com/html -R
    $ sudo chown caddy:caddy /var/log/caddy
    

    Crea un file HTML per testarlo e aprilo per la modifica.

    $ sudo nano /var/www/example.com/html/index.html
    

    Aggiungi il seguente codice.

    <!DOCTYPE html>
    <html>
    <head>
    <title>Hello from Caddy!</title>
    </head>
    <body>
    <h1>Hello, from Caddy!</h1>
    </body>
    </html>
    

    Premi Ctrl + X per chiudere l'editor e premi Y quando ti viene chiesto di salvare il file.

    Apri il Caddyfile per la modifica.

    $ sudo nano /etc/caddy/Caddyfile
    

    Sostituire il codice esistente con il seguente.

    example.com {
        root * /var/www/example.com/html
        file_server
        encode gzip
    
        log {
            output file /var/log/caddy/example.access.log
        }
    
        @static {
            file
            path *.ico *.css *.js *.gif *.jpg *.jpeg *.png *.svg *.woff *.pdf *.webp
        }
        header @static Cache-Control max-age=5184000
    
        tls 
    }
    

    Premi Ctrl + X per chiudere l'editor e premi Y quando ti viene chiesto di salvare il file.

    Esaminiamo tutte le direttive nel file. La direttiva encode gzip dice a Caddy di comprimere i file usando la compressione Gzip.

    La direttiva log emette il log di accesso per il sito nel file /var/log/caddy/example.access.log. Per impostazione predefinita, Caddy ruota i file di registro quando raggiungono i 100 MB. I file ruotati vengono eliminati dopo 90 giorni o quando sono presenti più di 10 registri ruotati. È possibile modificare i parametri predefiniti nel modo seguente.

    log {
        output file /var/log/caddy/example.access.log {
            roll_size 10MB
            roll_keep 5
            roll_keep_for 240h
        }
    }
    

    Nel codice precedente, i file di registro ruotati sono limitati a 10 MB ed eliminati dopo 10 giorni (240 ore) o quando sono presenti più di 5 registri ruotati.

    Caddy genererà e installerà automaticamente il certificato SSL senza alcun intervento. La direttiva tls ci consente di fornire opzioni extra per configurare HTTPS come l'indirizzo e-mail utilizzato per ottenere i report Lets Encrypt.

    La direttiva header abilita il controllo della cache su tutti i file statici (immagini/javascript/file CSS). Puoi aggiungere più estensioni di file o copiare il codice per impostare una durata diversa per diversi formati di file. Dovrai cambiare il valore static in qualcosa di diverso perché è un riferimento con nome.

    Una volta terminato, puoi convalidare la tua configurazione usando il seguente comando.

    $ caddy validate --adapter caddyfile --config /etc/caddy/Caddyfile
    

    Dobbiamo usare l'opzione --adapter caddyfile perché, per impostazione predefinita, il comando convalida solo le configurazioni JSON.

    Se ricevi il seguente avviso, puoi risolverlo facilmente con un singolo comando.

    WARN    input is not formatted with 'caddy fmt' {"adapter": "caddyfile", "file": "/etc/caddy/Caddyfile", "line": 2}
    

    Eseguire il seguente comando per correggere l'errore.

    $ caddy fmt --overwrite /etc/caddy/Caddyfile
    

    Il comando precedente formatta e sovrascrive il Caddyfile.

    Riavvia Caddy per abilitare la configurazione. Sarà necessario riavviare il server ogni volta che si apporta una modifica alla configurazione.

    $ sudo systemctl restart caddy
    

    Apri nel tuo browser e dovresti vedere la seguente pagina che significa che la configurazione sta funzionando.

    Configurazione di più siti in Caddy

    Puoi configurare più siti in un singolo file caddy. Per fare ciò, crea blocchi separati per ciascun sito nel modo seguente.

    example1.com {
    	root * /var/www/example1.com/html
    	...
    }
    
    example2.com {
    	root * /var/www/example2.com/html
    	...
    }
    

    Questo metodo va bene per un paio di siti, ma uno singolo può diventare piuttosto grande e difficile da mantenere se si ospitano più siti.

    Crea la directory \\/etc/caddy/caddyconf.

    $ sudo mkdir /etc/caddy/caddyconf
    

    Ora puoi importare i file di configurazione dalla directory nel tuo /etc/caddty/caddyfile nella parte superiore del file.

    import caddyconf/*.conf
    

    Il passaggio finale consiste nel creare singoli file di configurazione per ciascun sito.

    Configurazione siti PHP

    Finora abbiamo parlato solo di servire siti statici usando Caddy. Puoi utilizzare Caddy altrettanto facilmente per servire anche siti PHP dinamici. Per abilitare il supporto PHP, aggiungi il seguente codice all'interno del blocco del tuo sito.

    example1.com {
    	root * /var/www/example1.com/html
    	...
    	php_fastcgi unix//run/php-fpm/www.sock
    }
    

    Dovrai anche installare PHP.

    $ sudo dnf install php-fpm php-cli php-gd
    

    Puoi installare qualsiasi modulo PHP aggiuntivo di cui hai bisogno. Dovrai anche configurare il file /etc/php-fpm.d/www.conf. Apri il file per la modifica.

    $ sudo nano /etc/php-fpm.d/www.conf
    

    Dobbiamo impostare l'utente Unix/gruppo di processi PHP su caddy. Trova le righe user=apache e group=apache nel file e modificale in nginx.

    ...
    ; Unix user/group of processes
    ; Note: The user is mandatory. If the group is not set, the default user's group
    ;       will be used.
    ; RPM: apache user chosen to provide access to the same directories as httpd
    user = caddy
    ; RPM: Keep a group allowed to write in log dir.
    group = caddy
    ...
    

    Trova la riga listen.acl_users=apache,nginx e cambia il suo valore come segue.

    ...
    listen.acl_users = apache,nginx,caddy
    ...
    

    Salva il file premendo Ctrl + X e inserendo Y quando richiesto.

    Avvia il processo PHP-fpm.

    $ sudo systemctl start php-fpm
    

    Per testare la configurazione di PHP, crea un file test.php nella cartella html.

    $ sudo nano /var/www/example.com/html/test.php
    

    Aggiungi il seguente contenuto e salva il file premendo Ctrl + X e inserendo Y quando richiesto.

    <?php phpinfo();
    

    Avvia http://example.com/test.php nel tuo browser web e dovresti vedere quanto segue.

    Configurazione del proxy inverso

    Caddy può anche essere utilizzato come server proxy inverso. Per configurarlo, utilizzare il seguente codice.

    example1.com {
    	...
    	reverse_proxy localhost:8000 {
    		header_up Host {http.reverse_proxy.header.X-Forwarded-Host}
    	}
    }
    

    Passaggio 4: opzioni globali Caddy

    Il Caddyfile ti consente di impostare alcune opzioni che saranno applicabili a livello globale, ovvero si applicheranno a tutti i tuoi siti. È vantaggioso definire opzioni globali in modo da non doverle dichiarare nuovamente in ogni blocco del server.

    Dovresti includere le opzioni globali nella parte superiore del tuo Caddyfile. Ci sono molte opzioni che puoi impostare a livello globale. Ne esamineremo solo alcuni importanti. Per il resto, dovresti fare riferimento alla documentazione di Caddy.

    Ecco alcune opzioni predefinite che puoi utilizzare nel tuo Caddyfile.

    {	
    	#TLS Options
    	email 
    
    	servers	:443 {
    		protocol {
    			experimental_http3
    		}
    		max_header_size 5mb
    	}
    	
    	servers :80 {
    		protocol {
    			allow_h2c
    		}
    		max_header_size 5mb
    	}
    }
    

    Nel codice precedente email specifica l'ID e-mail utilizzato per la registrazione del certificato SSL con l'autorità Lets Encrypt. La pinzatura OCSP migliora le prestazioni dei siti HTTPS fornendo automaticamente informazioni sulla revoca dei certificati ai browser. L'opzione max_header_size specifica la dimensione delle intestazioni della richiesta HTTP del client da analizzare.

    Abbiamo anche abilitato il protocollo HTTP/3 per i siti HTTPS e il supporto HTTP/2 per i siti HTTP. Queste sono funzionalità sperimentali e probabilmente verranno rimosse alla fine, quindi fai attenzione prima di abilitarle.

    Passaggio 5: miglioramento della sicurezza

    Abilitazione dell'autenticazione HTTP

    È possibile abilitare l'autenticazione HTTP semplice per determinate directory. Innanzitutto, devi creare le credenziali di autenticazione per esso.

    Caddy accetta solo password con hash nella configurazione. Quindi, devi prima creare una password con hash. Esegui il seguente comando per farlo.

    $ caddy hash-password
    Enter password:
    Confirm password:
    JDJhJDEwJEVCNmdaNEg2Ti5iejRMYkF3MFZhZ3VtV3E1SzBWZEZ5Q3VWc0tzOEJwZE9TaFlZdEVkZDhX
    

    Una volta che hai la password pronta, inserisci il seguente codice nel tuo Caddyfile.

    basicauth /secret/* {
    	John JDJhJDEwJEVCNmdaNEg2Ti5iejRMYkF3MFZhZ3VtV3E1SzBWZEZ5Q3VWc0tzOEJwZE9TaFlZdEVkZDhX
    }
    

    Il comando precedente proteggerà la directory /secret con le credenziali appena create.

    Rafforzare la sicurezza del sito e abilitare HSTS

    Esistono altre configurazioni di sicurezza che puoi aggiungere per proteggere i tuoi siti. Per questo, creeremo un altro file /etc/caddy/caddy_security.conf.

    $ sudo nano /etc/caddy/caddy_security.conf
    

    Aggiungi il seguente codice ad esso.

    header {
        Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
        X-Xss-Protection "1; mode=block"
        X-Content-Type-Options "nosniff"
        X-Frame-Options "DENY"
        Permissions-Policy "interest-cohort=()"
        Content-Security-Policy "upgrade-insecure-requests"
        Referrer-Policy "strict-origin-when-cross-origin"
        Cache-Control "public, max-age=15, must-revalidate"
        Feature-Policy "accelerometer 'none'; ambient-light-sensor 'none'; autoplay 'self'; camera 'none'; encrypted-media 'none'; fullscreen 'self'; geolocation 'none'; gyroscope 'none'; magnetometer 'none'; microphone 'none'; midi 'none'; payment 'none'; picture-in-picture *; speaker 'none'; sync-xhr 'none'; usb 'none'; vr 'none'"
    }
    

    Il codice precedente abilita/implementa quanto segue.

    1. Abilita il supporto HSTS per il sito e tutti i suoi sottodomini.
    2. Abilita il filtro XSS.
    3. Previene lo sniffing di contenuto/MIME.
    4. Impedisce che il tuo sito venga caricato all'interno di un IFRAME.
    5. Impedisce al tuo sito di essere incluso nelle prove di tracciamento FLOC.
    6. Aggiunge una politica di sicurezza dei contenuti su come gli agenti utente trattano gli URL non sicuri.
    7. Implementa una politica di referrer in modo che solo il referrer venga inviato per richieste cross-origin se il protocollo dice lo stesso.
    8. I criteri sulle funzionalità forniscono un meccanismo per abilitare e disabilitare determinate funzionalità del browser.

    Successivamente, importa il file in uno qualsiasi dei blocchi del sito che desideri.

    example.com {
    	...
    	import /etc/caddy/caddy_security.conf
    }
    

    Riavvia il server per implementare la modifica.

    Conclusione

    Questo conclude il tutorial sull'installazione e la configurazione del server web Caddy su server basati su Fedora 34/CentOS 8. Se hai domande, pubblicale nei commenti qui sotto.