Installazione e configurazione di un server LAMP (Linux Apache Mysql Server) con host virtuali multipli

Ci sono moltissimi pannelli di controllo in grado di configurare un server LAMP generico con qualsiasi distribuzione linux o quasi. Altri a pagamento sono compatibili anche con altre piattaforme come windows.

Molti comandi in questa guida possono essere aggregati in uno solo, tuttavia i preferisco dividerli per aiutarti ad identificare eventuali errori. Questa guida è stata testata passo passo ed assume che tu hai installato un sistema centos 7 pulito con la rete configurata.

Se hai il comando sudo installato e sei connesso come utente normale, puoi semplicemente inserire la parola “sudo” prima dei comandi.

Configurare il firewall

Prima di tutto devi essere sicuro che il tuo server accetti determinate richieste in determinate porte. Se il firewall non è installato non installarlo a meno che tu non sappia cosa stai facendo o se hai la macchina fisica di fronte a te. Se hai un router o una rete più complessa, ti consiglio di leggere un articolo riguardante la teoria delle reti o un articolo su come configurare i virtual servers su un router per instradare il traffico su determinate porte. Qui io assumo che hai un indirizzo pubblico in un server disponibile su internet. Quindi, tu dovresti scrivere questi comandi sul tuo prompt (shell).

firewall-cmd --permanent --zone=public --add-port=80/tcp
firewall-cmd --permanent --zone=public --add-port=443/tcp
firewall-cmd --runtime-to-permanent
firewall-cmd --reload

Installare Apache2

Abbiamo aperto le porte per accettare le connessioni tcp nelle porte http (80) ed httpd (443) predefinite di apache. Adesso dobbiamo installare apache2 come semplice web server scrivendo questo comando:

rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install epel-release
yum -y install httpd

Avviamento ed Abilitazione Apache2

Dopo aver installato apache, devi avvare ed abilitare il servizio (demone) con questo comando

systemctl start httpd
systemctl enable httpd

Se metti l’indirizzo ip del server su un browser dovresti vedere la pagina di benvenuto di apache e centos.

Configurare gli hosts virtuali

Per configurare gli hosts virtuali su CentOS dovresti disabilitare il selinux oppure riceverai un errore. Per disabilitarlo temporaneamente evitando così di dover riavviare il sistema, tu puoi scrivere

setenforce 0
echo 0 > /sys/fs/selinux/enforce

Per essere sicuro che questa modifica perduri anche dopo il reboot dovresti modificare il file /etc/sysconfig/selinux ed essere sicuro che la linea riguardante selinux sia disabilitata come mostrato in questo esempio:

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three two values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.

Adesso dobbiamo solo creare il file di configurazione per l’host virtuale che metteremo all’interno della cartella /etc/httpd/conf.d/. In questo articolo useremo a titolo di esempio il dominio example.com. Tu dovrai sostituire il nome di dominio example.com con il tuo nome di dominio.

Crea quindi il file di configurazione /etc/httpd/conf.d/example.com.conf ed inserisci le seguenti righe:

<VirtualHost *:80>
ServerName www.example.com
DocumentRoot /var/www/example.com
ServerAlias example.com
ErrorLog /var/log/httpd/www.example.com.error.log
CustomLog /var/log/httpd/www.example.com.requests.log combined
<Directory /var/www/example.com>
Options FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
</VirtualHost>

Ovviamente devi creare anche la cartella di destinazione del sito e dei log se non esiste:

mkdir -p /var/www/example.com
mkdir -p /var/log/httpd

A questo punto devi riavviare apache

apachectl restart

Se il tuo dominio punta al server correttamente, dovresti vedere la pagina di benvenuto.

Considerazioni: I ho letto in molti articoli riguardanti la configurazione di hosts virtuali con CentOS che raccomandano di creare una cartella specifica contenente i siti disponibili ed un’altra contenente i siti abilitati. Questo metodo è usato nelle distribuzioni basate su debian e consente di disabilitare ed abilitare un sito semplicemente agendo sui link simbolici. Ma questo articolo parla di CentOS e quindi noi seguiremo la via delle distribuzioni basate su RedHat.

Installazione e configurazione di Certbot (letsencrypt) per il supporto https (opzionale ma raccomandato)

Se il sito è dinamico, normalmente potrebbe trasportare delle informazioni sensibili e quindi è una buona idea quella di criptarle. Acquistare un certificato valido, una volta era un’operazione costosa ma adesso c’è un sistema per acquisirne uno completamente gratis.

Assicurati che il tuo DNS punti al tuo server.

La prima cosa che devi fare è installare i moduli di apache per il supporto ssl

yum -y install mod_ssl
yum -y install openssl

Ed installare il programma certbot

yum -y install python-certbot-apache

Per funzionare, in fase di avvio, il protocollo https deve avere un certificato valido. Possiamo creare questo certificato nel seguente modo:

mkdir -p /etc/ssl/private
chmod 700 /etc/ssl/private
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/apache-selfsigned.key -out /etc/ssl/certs/apache-selfsigned.crt

Per questa volta, puoi lasciare in bianco tutte le risposte e dovrai aspettare la fine della generazione del certificato. Dal momento che certbot controlla se la configurazione di apache è congrua, dobbiamo aggiungere le istruzioni per l’host virtuale anche per il protocollo https alla fine del file /etc/httpd/conf.d/example.com.conf

<VirtualHost *:443>
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem
ServerName www.example.com
DocumentRoot /var/www/example.com
ServerAlias example.com
ErrorLog /var/log/httpd/www.example.com.error.ssl.log
CustomLog /var/log/httpd/www.example.com.requests.ssl.log combined
<Directory /var/www/example.com>
Options FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
</VirtualHost>

Adesso possiamo creare il certificato con certbot. Ricorda che se tu usi un servizio come per esempio Cloudflare dovrai metterlo in pausa temporaneamente.

apachectl stop
certbot certonly --standalone -d example.com -d www.example.com
apachectl start

Adesso il tuo dominio dovrebbe essere visibile da https://www.example.com . Se vuoi che gli utenti vengano automaticamente reindirizzati su https, dovrai modificare le istruzioni del tuo host virtuale per quanto riguarda il protocollo http aggiungendo la linea Redirect “/” “https://www.example.com/” al file di configurazione  /etc/httpd/conf.d/example.com.conf come mostrato in questo esempio

<VirtualHost *:80>
ServerName www.example.com
DocumentRoot /var/www/example.com
ServerAlias example.com
Redirect "/" "https://www.example.com/"

ErrorLog /var/log/httpd/www.example.com.error.log
CustomLog /var/log/httpd/www.example.com.requests.log combined
<Directory /var/www/example.com>
Options FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
</VirtualHost>

Se usi servizi come cloudflare o altri metodi di redirect non inserire questa riga o essa genererà un loop infinito di indirizzamenti che restituirà alla fine un errore sul browser.

Installazione MariaDB (per Mysql)

Per installare il server mysql MariaDB devi scrivere questo comando

yum -y install mariadb-server mariadb

Quindi dovrai avviare ed abilitare il server

systemctl start mariadb
systemctl enable mariadb

Adesso mariadb è installato ma tu dovresti procedere alla messa in sicurezza automatica di base perchè così com’è, il servizio è configurato con meno limitazioni possibili affinchè sia più comodo per gli sviluppatori. Puoi fare questo con il comando

mysql_secure_installation

Dovrai scegliere tutte le opzioni raccomandate e dovrai inserire una password per il tuo account root di mysql.

Considerazioni: CentOS ha scelto di usare MariaDB quale server mysql predefinito. Comunque devo dirti che questo è un fork del classico server mysql e potrebbero esserci dei problemi di incompatibilità in fase di importazione di dati. Se non sai la differenza fra mariadb e mysql community edition ti consiglio di leggere un articolo su come migrare i dati da un server mysql community release ad un server mariadb o come migrare i dati da un server mariadb ad un server mysql community release.

Installazione di PHP e dei moduli utilizzati dai CMS più comuni.

Per usare mysql, apache necessita di un programma intermedio che nel nostro caso è php. Per installare php con il supporto mysql ed i relativi moduli più utilizzati dai CMS più diffusi digita questi comandi

yum -y install php
yum -y install php-opcache
yum -y install php-common
yum -y install php-fpm
yum -y install php-pear
yum -y install php-mysql
yum -y install php-cli
yum -y install php-gd
yum -y install php-odbc
yum -y install php-xml
yum -y install php-xmlrpc
yum -y install php-mbstring
yum -y install php-snmp
yum -y install php-soap
yum -y install php-mcrypt

Se ti serve installare altri moduli puoi cercali tramite il comando

yum search php-

Puoi anche filtrare i risultati con il comando grep. Se per esempio, i voglio visualizzare i moduli con la scritta pecl all’interno del nome devo solo scrivere

yum search php- | grep pecl

Considerazioni: CenOS è una distribuzione linux stabile e conservatrice. I pacchetti che puoi installare con i repository tradizionali sono testati. Per installare le ultime versioni, ti dovresti importare altri repository. Se tu non hai la necessità di installare l’ultima versione di php, ti consiglio di rispettare la scelta di CentOS. Se hai la necessità di installare la versione 7 di php, ti consiglio di leggere un articolo riguardante l’installazione e la configurazione di un LAMP (Linux Apache Mysql Php 7) server con hosts virtuali multipli su CentOS 7.

# DISCLAIMER (perchè non si sa mai): Se tu non sai esattamente quello che stai facend, dovresti provare questa procedura prima su un server di test per evitare danni. I non sono responsabile in nessun caso ed applicherai questa guida a tuo rischio e pericolo.

Rispondi