Installare Apache https e PHP-FPM in Debian

Galleria: 
Apache in Debian

Installiamo il webserver Apache con https il primo dello stack LAMP, che si occuperà di servire i contenuti
Per ottimizzare le performance del webserver, consigliamo di utilizzare PHP-FPM, mpm_event e http2
La maggior parte dei siti web, utilizza connessioni sicure, vedremo come generare un certificato https valido e gratuito con Let's Encrypt
Di default, è previsto il modulo multiprocessi, mpm_prefork, che permette di utilizzare mod_php o php7.0, l'interprete interno
Questo approccio è sconsigliato, sui siti molto visitati, arrivati al numero di thread massimi, il webserver, smette di rispondere fino alla liberazione di un thread che possa servire i contenuti

apt install apache2
a2dismod mpm_prefork
a2enmod mpm_event http2
service apache2 restart

Installare PHP-FPM

PHP-FPM è un implementazione alternativa a PHP FastCGI, nota per la velocità, tre volte superiore al classico modulo e le feature aggiuntive
FPM è un vero e proprio demone, resta in ascolto per le richieste php, tramite una porta o un socket UNIX
Rappresenta la P del nostro LAMP

apt install php-fpm libapache2-mod-fcgid
a2enmod actions proxy_fcgi alias headers
service php7.0-fpm restart
service apache2 restart

E' ora possibile configurare per tutti i virtual host apache2 l'uso di FPM aggiungendo questo handler nella loro definizione

<FilesMatch \.php$>
        SetHandler "proxy:unix:/run/php/php7.0-fpm.sock|fcgi://localhost/"
</FilesMatch>

Test di php con info.php:

<?php
phpinfo();
phpinfo(INFO_MODULES);
?>

Installiamo i moduli necessari, php-MySQL e alcuni dei più comuni

apt-get install php7.0-mysql php7.0-curl php7.0-gd php7.0-intl php-pear \
php7.0-imap php7.0-mcrypt php7.0-ps php7.0-pspell php7.0-recode php7.0-snmp \
php7.0-sqlite php7.0-tidy php7.0-xmlrpc php7.0-xsl

Possiamo anche usare i moduli presenti in plesk

apt-get install php7.0-bcmath php7.0-enchant php7.0-imap php7.0-ldap php7.0-mysql \
php7.0-curl php7.0-curl php7.0-dba php7.0-enchant php7.0-gd php7.0-intl \
php7.0-json php7.0-ldap php7.0-mbstring php7.0-mcrypt php7.0-odbc \
php7.0-opcache php7.0-pgsql php7.0-sqlite3 php7.0-pspell php7.0-soap \
php7.0-tidy php7.0-xml php7.0-xmlrpc php7.0-xsl php7.0-zip

Let's Encrypt certificati SSL validi e gratuiti

Grazie all'ottimo Let's Encrypt, è possibile generare dei certificati SSL, universalmente riconosciuti, sicuri e gratuiti
E' necessario configurare il nome DNS del sito web che andremo a ospitare in modo da raggiungere l'IP del nostro server

Esempio configurazione DNS

Per configurare il DNS, è necessario accedere al pannello del nostro fornitore e registrare un nome di questo tipo

mydomain.ext                  A      1.1.1.1

Installiamo Let's Encrypt e generiamo i certificati SSL e TLS

apt-get install certbot python-certbot-apache
# Creazione e configurazione di apache2
certbot --apache
# Test renew dei certificati
certbot renew --dry-run
# Cron di revewal
cat /etc/cron.d/certbot

Se non ci sono stati problemi nella risoluzione del nostro dominio, i nostri virtual host risponderanno in https, restituendoci il famoso "luchetto verde" sul browser

I Virtualhost apache2

Virtual host http

Per configurare un virtualhost http, possiamo utilizzare una definizione molto semplice, come questa listata
E' disponibile nella directory /etc/apache2/sites-available vhost di default, da cui possiamo partire

<VirtualHost *:80>
        ServerAdmin [email protected]
        DocumentRoot /var/www/html
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Virtual host https

I virtual host https, includono i path necessari per l'utilizzo di SSL e l'attivazionedi PHP

<VirtualHost *:443>
    ServerAdmin [email protected]
    DocumentRoot "/var/www/data/online"
    ServerName mydomain.ext
    ServerAlias www.mydomain.ext
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
    Protocols h2 h2c http/1.1
    SSLEngine on
    Include /etc/letsencrypt/options-ssl-apache.conf
        SSLCertificateFile /etc/letsencrypt/live/mydomain.ext/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/mydomain.ext/privkey.pem
    <FilesMatch \.php$>
        SetHandler "proxy:unix:/run/php/php7.0-fpm.sock|fcgi://localhost/"
    </FilesMatch>
</VirtualHost>