2

urlL’articolo che segue, più che un tutorial passo passo, vuole essere un promemoria, una sorta di linea guida per l’installazione di un Web Server Lamp in produzione, scritta in modo da non dimenticare passaggi e comandi che uno sviluppatore web esegue solo sporadicamente. Se trovate inesattezze, o volete aggiungere qualcosa, commenti in proposito sono più che benvenuti.

Installare la distribuzione di linux

In questa guida andremo ad implementare un server lamp basato su Ubuntu 12.04, versione long term support del noto so unix basato su Debian. Per seguirne i passaggi senza mettere le mani su un server in produzione potete scaricare l’immagine preconfigurata di Ubuntu 12.04 lts per Virtualbox ( User: ubuntu – Password: reverse ) a questo indirizzo.

Ora colleghiamoci in SSH alla nostra macchina ed iniziamo…

Creare un utente senza permessi di root

Se abbiamo accesso Root alla macchina dobbiamo creare un utente con privilegi limitati con cui configurare il Web Server (potete saltare questa operazione se l’utente è gia impostato).

root@ubuntu:~$ adduser web_user

Ora che abbiamo creato l’utente dobbiamo aggiungerlo alla lista dei sudoers ovvero degli utenti che possono accedere ai privilegi di root previo inserimento della password, per farlo è sufficiente digitare:

root@ubuntu:~$ visudo

Che aprirà una sessione di nano (editor testuale unix) in cui dovrete aggiungere:

# User privilege specification
web_user     ALL=(ALL:ALL) ALL

Per salvare è sufficiente usare la combinazione di tasti Ctrl + X seguita da Y e INVIO.

Ora è sufficiente uscire dalla sessione con exit e riloggarsi con le credenziali del nostro web_user.

Effettuare gli aggiornamenti

Come prima cosa installiamo tutti gli aggiornamenti:

web_user@ubuntu:~$ sudo apt-get update
web_user@ubuntu:~$ sudo apt-get upgrade
web_user@ubuntu:~$ sudo apt-get dist-upgrade

Se ci viene chiesto di riavviare la macchina possiamo farlo con il comando:

web_user@ubuntu:~$ sudo reboot

Oppure possiamo spegnere il server con:

web_user@ubuntu:~$ sudo halt

Configurare hostname e timezone

Configurare l’hostname non è essenziale a questo stadio ma possiamo comunque dare un nome al nostro server modificando il file hostname:

web_user@ubuntu:~$ sudo nano /etc/hostname

e caricando il nuovo hostname con:

web_user@ubuntu:~$ sudo /etc/init.d/hostname start

Non ci rimane che configurare il timezone (essenziale per un web server) con il comando interattivo:

web_user@mywebserver:~$ sudo dpkg-reconfigure tzdata

Installare i servizi lamp con APC (Alternative PHP cache) e PhpMyAdmin

web_user@mywebserver:~$ sudo apt-get install apache2 mysql-server php5 php-pear php5-mysql php-apc phpmyadmin

Durante l’installazione ci verranno chieste diverse informazioni come la password di Root di MySql (impostate una password complessa), il web server da configurare (apache2), se configurare phpmyadmin con dbconfig-common (yes), la password di root di MySql per phpmyadmin (quella impostata precedentemente), una nuova password per PhpMyAdmin (se non impostata ne verrà creata una casuale).

Non ci rimane che installare postfix per l’invio delle email.

web_user@mywebserver:~$ sudo apt-get install postfix

Durante l’installazione ci verrà chiesto come configurare Postfix (Internet Site) e il domain name di default della posta in uscita.

Configurare Apache

Modificare il nome dell’host di apache modificando apache2.conf:

web_user@mywebserver:~$ sudo nano /etc/apache2/apache2.conf

Ed aggiungiamo in fondo al file quanto segue:

# Personalizzazioni Apache 
ServerName myws
ServerTokens ProductOnly
ServerSignature Off
Header unset Server
RequestHeader unset Server

La prima riga elimina l’errore “apache2: Could not reliably determine the server’s fully qualified domain name, using 127.0.1.1 for ServerName” tipido di Apache su Ubuntu. Le righe successive servono a nascondere la versione di Apache dall’header.

Ora abilitiamo i moduli di Apache mod_rewrite, headers, expires:

web_user@mywebserver:~$ sudo a2enmod rewrite
web_user@mywebserver:~$ sudo a2enmod headers
web_user@mywebserver:~$ sudo a2enmod expires

Scaricare ed installare Google pagespeed_module, per architettura a 64 bit scaricare:

web_user@mywebserver:~$ wget https://dl-ssl.google.com/dl/linux/direct/mod-pagespeed-stable_current_amd64.deb

Per architettura a 32 bit scaricare:

web_user@mywebserver:~$ wget https://dl-ssl.google.com/dl/linux/direct/mod-pagespeed-stable_current_i386.deb

Per procedere eseguire nell’installazione eseguire i comandi:

web_user@mywebserver:~$ dpkg -i mod-pagespeed-*.deb
web_user@mywebserver:~$ apt-get -f install

Ora eseguire i comandi che seguono per assegnare i permessi adeguati alla cartella /var/www/ che contiene i nostri siti web:

web_user@mywebserver:~$ sudo addgroup webdev
web_user@mywebserver:~$ sudo chgrp -R webdev /var/www/
web_user@mywebserver:~$ sudo chown -R www-data /var/www/
web_user@mywebserver:~$ sudo chmod -R g+rw /var/www/
web_user@mywebserver:~$ sudo find /var/www -type d -exec chmod +s {} \;
web_user@mywebserver:~$ sudo usermod -a -G webdev www-data
web_user@mywebserver:~$ sudo usermod -a -G webdev web_user

Nel dettaglio “webdev” è il nome del gruppo che ha permessi sulla cartella var/www a cui andiamo ad aggiungere l’utente di Apache (www-data) e l’utente corrente (nel nostro caso web_user).

Configurare PHP

Modifichiamo il nostro file php.ini:

web_user@mywebserver:~$ sudo nano /etc/php5/apache2/php.ini

Impostare le seguenti opzioni:

expose_php Off
short_open_tag = On
max_execution_time = 30
memory_limit = 128M
error_reporting = E_ALL & ~E_DEPRECATED
display_errors = Off
log_errors = On
post_max_size = 8M
upload_max_filesize = 8M
date.timezone = Europe/Rome   ; Vedi: http://php.net/date.timezone

Aggiungiamo un link simbolico al file virtualhost di phpmyadmin per potervi accedere dal browser:

web_user@mywebserver:~$ sudo ln -s /etc/phpmyadmin/apache.conf /etc/apache2/conf.d/phpmyadmin.conf

A questo punto phpmyadmin sarà accessibile da http://x.x.x.x/phpmyadmin . Può essere una buona idea aggiungere un livello ulteriore di sicurezza attraverso un file htaccess. Per farlo andiamo ad abilitare AllowOverride sulla cartella:

web_user@mywebserver:~$ sudo nano /etc/phpmyadmin/apache.conf

Nella sezione Directory /usr/share/phpmyadmin aggiungiamo la linea “AllowOverride All” in questo modo:

<Directory /usr/share/phpmyadmin>
Options FollowSymLinks
DirectoryIndex index.php
AllowOverride All

Ora creiamo il file .htaccess per la cartella:

web_user@mywebserver:~$ sudo nano /usr/share/phpmyadmin/.htaccess

ed inseriamo all’interno il codice che segue, modificando la cartella in base alla home del vostro utente:

AuthType Basic
AuthName "Restricted Files"
AuthUserFile /home/web_user/.htpasswd
Require valid-user

Ora creiamo il nostro file password, sostituendo username con il nome utente desiderato (vi verrà poi richiesta la password da associarvi):

web_user@mywebserver:~$ sudo htpasswd -c /home/web_user/.htpasswd username

Riavviate apache con il solito:

web_user@mywebserver:~$ sudo service apache2 restart

Configurare APC

Modifichiamo il file di configurazione di APC.

web_user@mywebserver:~$ sudo nano /etc/php5/conf.d/apc.ini

Aggiungiamo:

extension = apc.so
apc.shm_size = 128M

Ed infine riavviamo Apache:

web_user@mywebserver:~$ sudo service apache2 restart

Mettere al sicuro MySql

MySql di default viene installato in una sorta di modalità sviluppatore. Per metterlo al sicuro è necessario eseguire il comando che segue:

web_user@mywebserver:~$ sudo /usr/bin/mysql_secure_installation

Che vi guiderà passo passo nel mettere al sicuro il vostro server.

Abilitare il monitoraggio e le notifiche di eventuali malfunzionamenti del server

Tenere sotto controllo un server in produzione è d’obbligo per cui andiamo ad installare monit:

web_user@mywebserver:~$ sudo apt-get install monit

Modifichiamo il contenuto del file di configurazione di monit come segue (possiamo usare Ctrl + K per eliminare velocemente le righe esistenti) ricordandoci di modificare i parametri specificati:

web_user@mywebserver:~$ sudo nano /etc/monit/monitrc
################################################################################
## Monit control file
################################################################################

set daemon  120                           # Check services at 2-minute intervals
set logfile syslog facility log_daemon    # Set logging to the systemlog
set alert <email_address>                 # Set your email address

set mailserver localhost
   with timeout 15 seconds

set httpd port 2812 and
   allow <user_name>:<password>    # set user name and password here

################################################################################
## Services
################################################################################

check system <hostname>
   if loadavg (1min) > 4 then alert
   if loadavg (5min) > 2 then alert
   if memory usage > 80% then alert
   if cpu usage (user) > 70% then alert
   if cpu usage (system) > 30% then alert
   if cpu usage (wait) > 20% then alert

check process apache with pidfile /var/run/apache2.pid
   start program = "/etc/init.d/apache2 start" with timeout 60 seconds
   stop program  = "/etc/init.d/apache2 stop"
   if cpu > 60% for 2 cycles then alert
   if cpu > 90% for 5 cycles then restart
   if totalmem > 512.0 MB for 5 cycles then alert
   # if totalmem > 512.0 MB for 5 cycles then restart
   if children > 250 then restart
   if failed host localhost port 80 protocol http then restart
   if 3 restarts within 5 cycles then timeout

check process mysql with pidfile /var/lib/mysql/<hostname>.pid
   group mysql
   start program = "/etc/init.d/mysql start"
   stop program = "/etc/init.d/mysql stop"
   if failed host localhost port 3306 then restart
   if 5 restarts within 5 cycles then timeout

check process sshd with pidfile /var/run/sshd.pid
   start program "/etc/init.d/ssh start"
   stop program "/etc/init.d/ssh stop"
   if failed port 22 protocol ssh then restart
   if 5 restarts within 5 cycles then timeout

Non ci rimane che modificare il file di avvio di monit per l’avvio automatico:

web_user@mywebserver:~$ sudo nano /etc/default/monit

Aggiungendo al file quanto segue:

# You must set this variable to for monit to start
startup=1

Ed infine avviare il servizio con:

web_user@mywebserver:~$ sudo /etc/init.d/monit start

Impostare il firewall UFW

UFW è il firewall di default di Ubuntu, per installarlo, se non è gia presente è sufficiente eseguire:

web_user@mywebserver:~$ sudo apt-get install ufw

Una volta installato andiamo ad aggiungere le regole principali (per maggiori informazioni sulla configurazione del firewall potete dare un’occhiata qua).

web_user@mywebserver:~$ sudo ufw allow 22
web_user@mywebserver:~$ sudo ufw allow 80
web_user@mywebserver:~$ sudo ufw allow 443
web_user@mywebserver:~$ sudo ufw allow 2812
web_user@mywebserver:~$ sudo ufw default deny
web_user@mywebserver:~$ sudo ufw enable

Automatizzare gli aggiornamenti

Anche se fare gli aggiornamenti manualmente non comporta uno sforzo particolare è possibile abilitare la loro installazione automatica. Per farlo è necessario installare unattended-upgrades con il comando che segue:

web_user@mywebserver:~$ sudo apt-get install unattended-upgrades

Eseguire la prima configurazione con:

web_user@mywebserver:~$ sudo dpkg-reconfigure unattended-upgrades

Impostare l’email e le fonti sicure attraverso il comando:

web_user@mywebserver:~$ sudo nano /etc/apt/apt.conf.d/50unattended-upgrades

Modificare il file come segue:

// Automatically upgrade packages from these (origin, archive) pairs
Unattended-Upgrade::Allowed-Origins {
    "Ubuntu lucid-security";
    // "Ubuntu lucid-updates";
};

// List of packages to not update
Unattended-Upgrade::Package-Blacklist {
    // "vim";
    // "libc6";
    // "libc6-dev";
    // "libc6-i686";
};

// Send email to this address for problems or packages upgrades
// If empty or unset then no email is sent, make sure that you
// have a working mail setup on your system. The package 'mailx'
// must be installed or anything that provides /usr/bin/mail.
    Unattended-Upgrade::Mail "";

// Do automatic removal of new unused dependencies after the upgrade
// (equivalent to apt-get autoremove)
    //Unattended-Upgrade::Remove-Unused-Dependencies "false";

// Automatically reboot *WITHOUT CONFIRMATION* if a
// the file /var/run/reboot-required is found after the upgrade
    Unattended-Upgrade::Automatic-Reboot "false";

// Use apt bandwidth limit feature, this example limits the download
// speed to 1024kb/sec
    Acquire::http::Dl-Limit "1024";

Per abilitare unattended-upgrades è necessario infine modificare il file:

web_user@mywebserver:~$ sudo nano /etc/apt/apt.conf.d/10periodic

Come segue:

APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::AutocleanInterval "5";
APT::Periodic::Unattended-Upgrade "1";

Disabilitare il login in ssh come utente root

Impostazione utile per evitare attacchi bruteforce sull’utente root. Modificate il file di configurazione del server ssh:

web_user@mywebserver:~$ sudo nano /etc/ssh/sshd_config

Modificare la linea che segue:

PermitRootLogin no

Salvare il file e riavviare il demone SSH con:

web_user@mywebserver:~$ sudo /etc/init.d/ssh restart

Come creare un host virtuale

Arrivati a questo punto il vostro server è funzionante e andando all’indirizzo http://x.x.x.x (sostituire con l’ip della macchina) visualizzerete il contenuto della cartella /var/www/. In realtà la maggior parte delle volte ad un web server corrispondono più siti identificati da diversi domini. Per realizzare questo indirizzamento dominio->sito è necessario creare un virtual host.

Andiamo a creare la struttura a cartelle del nostro virtual host:

web_user@mywebserver:~$ sudo mkdir -p /var/www/example.com/public_html

Dove example.com è un dominio fittizio che utilizzeremo ai fini della guida. Chiaramente i record DNS del dominio andranno puntati all’indirizzo ip della nostra macchina.

Ora creiamo una pagina di test da visualizzare quando andremo con il nostro browser all’indirizzo http://www.example.com.

web_user@mywebserver:~$ sudo nano /var/www/example.com/public_html/index.html

All’interno della pagina inseriamo questo codice di test e salviamo:

<html>
  <head>
    <title>La tua pagina di test</title>
  </head>
  <body>
    <h1>Successo: Hai settato correttamente il tuo Virtual Host</h1>
  </body>
</html>

Ora creiamo un nuovo file di configurazione del virtual host copiandolo da quello di default:

web_user@mywebserver:~$ sudo cp /etc/apache2/sites-available/default /etc/apache2/sites-available/example.com

E modifichiamolo in modo che corrisponda alle nostre necessità:

web_user@mywebserver:~$ sudo nano /etc/apache2/sites-available/example.com

Modifichiamo il contenuto come segue:

<VirtualHost *:80>
        ServerAdmin micc83@gmail.com
        ServerName example.com
        ServerAlias www.example.com

        DocumentRoot /var/www/example.com/public_html
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/example.com/public_html>
                Options FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        # Error log
        ErrorLog /var/www/example.com/apache.error.log

        # Possible values include: debug, info, notice, warn, error, crit, alert, emerg.
        LogLevel warn

        # Access Log
        CustomLog /var/www/example.com/apache.access.log common

        # Php errors
        php_value error_log /var/www/example.com/php.error.log

</VirtualHost>

Ora non vi resta che attivare il nuovo host con:

web_user@mywebserver:~$ sudo a2ensite example.com

e riavviare il server apache con:

web_user@mywebserver:~$ sudo service apache2 restart

Alcuni programmi utili per amministrare il server

Eseguendo il comando che segue andrete ad installare alcuni programmi utili all’amministrazione del server:

web_user@mywebserver:~$ sudo apt-get install bwm-ng htop whois

Nell’ordine:

  • bwm-ng – Informazioni in tempo reale sulla rete
  • htop – Task manager semi grafico
  • whois – Richiesta whois domini

Altri comandi utili per amministrare il vostro server, infine, li potete trovare in questo articolo.

  1. Per quanto riguarda il log rotate hai qualche consiglio?

    Su un server che aveva frequenti accessi ho creato in /etc/cron.hourly
    un file chiamato php con uno script che mi cancellasse i file di sessione che per qualche motivo non si cancellavano. Non sono riuscito a capire da dove arrivavano i frequenti accessi ma ho risolto. Esiste un sistema migliore?
    Ecco il listato dello script

    #!/bin/bash
    
    max=24
    tmpdir=/var/lib/php5/session
    
    nice find ${tmpdir} -type f -name 'sess_*' -mmin +${max} -delete
    
    1. Buongiorno Marco,

      Purtroppo non mi è mai capitato di dover gestore un log rotate per cui non so consigliarti in proposito. Speriamo che passi qualche buon anima da queste parti a illuminarci in proposito. Per quanto concerne l’installazione del server LAMP, invece, avresti qualcosa da aggiungere o qualcosa che avresti fatto diversamente? Io nasco come sviluppatore web ma cerco di interessarmi all’argomento a 360° per cui ogni consiglio è ben accetto!

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *