Come creare un hosting professionale con debian

Spesso si ha l'esigenza di avere un server web con svariati servizi, in modo da poter evitare di appoggiarsi a quelle costosissime aziende di hosting.
Dovremo cominciare partendo da un'installazione base e minimale di debian.

La premessa è che molti consigliano di compilare manualmente i pacchetti fondamentali come apache e mysql, io non concordo in quanto i pacchetti standard hanno molti accorgimenti di compilazione per le sicurezze.

Ora installeremo i software base da utilizzare:

GESTIONE QUOTE SPAZIO DISCO:
sudo apt-get -y install quota quotatool
DATABASES:
sudo apt-get -y install sqlite3 mysql-client mysql-server postgresql-8.1 postgresql-client-8.1
WEBSERVER:
sudo apt-get -y install apache2 openssl php-pear php5 php5-cgi php5-cli php5-common php5-curl php5-gd php5-ldap libgd2-xpm php5-mcrypt php5-mysql php5-odbc php5-imap php5-xmlrpc libapache2-mod-fcgid libapache2-mod-jk libapache2-mod-perl2 libapache2-mod-ruby libapache2-svn libapache2-mod-python libapache2-mod-php5 libapache2-reload-perl ruby rdoc rake rails libfcgi-ruby libpgsql-ruby libmysql-ruby libsqlite3-ruby gem gems phpmyadmin libcrypt-passwdmd5-perl makepasswd
Installeremo anche i moduli pear per php:
sudo pear config-set auto_discover yes
sudo pear config-set preferred_state beta
sudo pear install Archive_Tar Cache Cache_Lite Config Console_Getopt DB Date FSM Fileinfo Gtk_FileDrop Gtk_ScrollingLabel Gtk_Styled HTML_Javascript HTTP HTTP_Request Log MDB2 MDB2_Driver_mysql MIME_Type Mail Net_SMTP Net_Socket Net_URL Numbers_Roman PEAR Payment_Clieop Payment_DTA QA_Peardoc_Coverage Stream_SHM Stream_Var Structures_Graph XML_Parser XML_Query2XML XML_RPC XML_RPC2 XML_RSS XML_SVG XML_Tree XML_Util XML_Wddx
WEBSERVER JAVA:
(personalmente consiglio di scaricare gli ultimi binari dal sito della sun e di jboss)


Sarà necessaria la jdk:
sudo apt-get -y install sun-java5-jdk
potrete scegliere se installare una tecnologia semplice (tomcat) :
sudo apt-get -y install tomcat5.5 tomcat5.5-admin tomcat5.5-webapps
oppure la nuova generazione di J2EE (jbossAS):
sudo apt-get -y install jbossas4 libjboss-j2ee-java libjboss-connector-java libjboss-deployers-java libjboss-deployment-java libjboss-jms-java libjboss-managed-java libjboss-messaging-java libjboss-naming-java libjboss-security-java libjboss-server-java libjboss-system-java libjboss-transaction-java libjtds-java libjboss-webservices-java libehcache-java libajaxtags-java libaopalliance-java
SERVER DI POSTA:
sudo apt-get -y install postfix fetchmail procmail courier-imap courier-imap-ssl courier-pop courier-pop-ssl courier-authdaemon courier-authlib sasl2-bin gsasl libsasl2-modules pyzor spamassassin spamc
SERVER LDAP GESTIONE UTENTI:
sudo apt-get -y install ldap-utils phpldapadmin slapd
SERVER DNS:
sudo apt-get -y install bind9
sudo echo "nameserver 127.0.0.1" > /etc/resolv.conf

editate il file /etc/bind/named.conf.options rendendolo come segue:
options {
directory "/var/cache/bind";
// query-source address * port 53;
forward first;
forwarders {
151.99.0.100;
151.99.125.1;
// 62.211.69.150;
// 212.48.4.15;
};

auth-nxdomain no; # conform to RFC1035
listen-on-v6 { any; };
};

zone "workgroup" in
{
type master;
file "/etc/bind/db.workgroup";
};

zone "wifi" in
{
type master;
file "/etc/bind/db.wifi";
};
SERVER DI COLLEGAMENTO:
sudo apt-get -y install vsftpd subversion ssh
SERVER ADS CONTROLLO SICUREZZE:
sudo apt-get -y install aide snort snort-rules snort-rules-default denyhosts
NEL CASO NON AVESTE IP PUBBLICO REGISTRATEVI A DYNDNS.ORG E:
sudo apt-get -y install ddclient
CONFIGURAZIONE:
Ora basterà configurare il tutto.
Di default i pacchetti debian spesso sono già funzionanti appena installati, anche se spesso non avranno una configurazione ottimale.

Per quanto riguarda il databases l'installer installerà senza password di root, dovrete come prima cosa impostarla tramite l'indirizzo web http://localhost/phpmyadmin.
Sconsiglio di abilitare eventuali connessioni esterne al database e di lasciare le autorizzazzioni di default (solo localhost), ma se volete potete abilitare il networking per mysql editando /etc/mysql/my.cfg e commentando (aggiungere un # davanti) o meglio eliminando completamente la riga seguente:
bind-address = 127.0.0.1
APACHE:
Per quanto riguarda apache il mio consiglio è di creare un'unico virtualhost dinamico, che quindi direzionerà le richieste http alle varie cartelle in base all'url.
Lascieremo il default per le richieste eventualmente non riconosciute, e ne creremo uno aggiuntivo editate /etc/apache2/sites-avaiable/default-php (createlo) ed inseritevi:
NameVirtualHost *:80

LogFormat "%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
CustomLog /var/www/%0/logs/access_log combined
ServerAdmin webmaster@%0
VirtualDocumentRoot /var/www/%0
VirtualScriptAlias /var/www/%0/cgi-bin

Options Indexes FollowSymLinks MultiViews ExecCGI
AllowOverride All
Order allow,deny
allow from all

Order Allow,Deny

RewriteEngine On
RewriteMap lowercase int:tolower
RewriteCond %{REQUEST_URI} !^/cgi-bin/
RewriteCond ${lowercase:%{SERVER_NAME}} ^www\.[a-z-]+\.isp\.com\.it\.net\.eu\.biz\.info$
RewriteRule ^(.+) ${lowercase:%{SERVER_NAME}}$1 [C]
RewriteRule ^www\.([a-z-]+)\.isp\.com/(.*) /var/www/$1/$2
Ora cancellate tutto all'interno della directory /var/www, poi ammettendo di voler creare un virtualhost per il dominio example.com, basterà creare la cartella in modo opportuno:
sudo mkdir /var/www/example.org
sudo chown -R www-data: /var/www/example.org
Così facendo NON avete alcun bisogno di riavviare apache per creare nuovi virtualhost, riducendo al minimo i disguidi tecnici ed eventuali down.

Ora aggiungiamo un'altro virtualhost dinamico per i siti ROR
Create un nuovo sito dinamico:
sudo mkdir /var/rails
sudo chown -R www-data: /var/rails
sudo cp /etc/apache2/sites-avaiable/default /etc/apache2/sites-avaiable/default-rails
ora editate /etc/apache2/sites-avaiable/default-rails rendendolo come segue:
NameVirtualHost *:80

LogFormat "%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
CustomLog /var/rails/%0/logs/access_log combined
ServerAdmin webmaster@%0
VirtualDocumentRoot /var/rails/%0/application/public
VirtualScriptAlias /var/rails/%0/cgi-bin

AddHandler fcgid-script .fcgi
AddHandler cgi-script .cgi
Options +FollowSymLinks +ExecCGI
AllowOverride all
Order allow,deny
Allow from all
RewriteEngine On
RewriteBase /
RewriteRule ^$ index.html [QSA]
RewriteRule ^([^.]+)$ $1.html [QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]

Options Indexes FollowSymLinks MultiViews ExecCGI
AllowOverride All
Order allow,deny
allow from all
Order Allow,Deny

RewriteEngine On
RewriteMap lowercase int:tolower
RewriteCond %{REQUEST_URI} !^/cgi-bin/
RewriteCond ${lowercase:%{SERVER_NAME}} ^www\.[a-z-]+\.isp\.com\.it\.net\.eu\.biz\.info$
RewriteRule ^(.+) ${lowercase:%{SERVER_NAME}}$1 [C]
RewriteRule ^www\.([a-z-]+)\.isp\.com/(.*) /var/www/$1/$2
Controllate anche il file /etc/apache2/mods-enabled/fcgid.conf, cancellate tutto (o createlo) ed inseriteci:
AddHandler fcgid-script .fcgi fcg fcgi fpl
DefaultInitEnv RAILS_ENV development
IdleTimeout 600
ProcessLifeTime 3600
MaxProcessCount 8
DefaultMinClassProcessCount 3
DefaultMaxClassProcessCount 3
IPCConnectTimeout 8
IPCCommTimeout 48
Ma ricordatevi che una volta completate le fasi di test e sviluppo dell'aplicatiovo ruby on rails dovrete sostituire :
DefaultInitEnv RAILS_ENV development
Con
DefaultInitEnv RAILS_ENV production
E riavviare apache.

Ora potrete creare l'applicazione rails:
cd /var/rails
sudo rails example.org
sudo chown -R www-data: example.org
Come ultima cosa prima di riavviare (quindi per la vostra ultima volta) apache2, dovrete abilitare i moduli necessari e i siti creati:
sudo a2ensite default-rails
sudo a2ensite default-php
sudo a2enmod proxy_http rewrite proxy setenvif alias cache autoindex dav deflate env fcgid include jk log_forensic mime_magic perl php5 proxy proxy_ajp ssl vhost_alias
Ora riavviate apache:
sudo /etc/init.d/apache2 restart
E verificate il funzionamento dell'apache e dei moduli alle url http://localhost/server-status e http://localhost/server-info, le disattiveremo in seguito (vedi PULIZIA).

Per limitare l'accesso via ssh solo ad un'utente (che potrà usare il comando su per diventare root) dovrete aggiungere al file /etc/ssh/sshd_config:
AllowUsers nomeutente1 nomeutente2
Ora per non rischiare di essere auto-bannati da denyhosts inserite il vostro ip del client in /etc/hosts.allow

Per il server FTP vi basterà editare /etc/vsftpd.conf, cancellare tutto ed inserire:
listen=YES
anonymous_enable=YES
local_enable=YES
local_umask=022
anon_upload_enable=NO
anon_mkdir_write_enable=NO
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/vsftpd.log
ftpd_banner=Welcome to FTP service.
chroot_local_user=YES
chroot_list_file=/etc/vsftpd.chroot_list
ls_recurse_enable=YES
secure_chroot_dir=/var/run/vsftpd
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/certs/vsftpd.pem
Poi per abilitare un utente all'uso ftp dovrete inserirlo nel file /etc/vsftpd.chroot_list.

Per il server di posta dovrete aggiungere in fondo al file /etc/postfix/main.cf :
home_mailbox = Maildir/
E per creare le caselle postali basterà lanciare i seguenti comandi per ogni utente:
su - nomeutente
maildirmake.courier Maildir
exit
Ora create il file /etc/fetchmailrc come segue:
set daemon 300
set no bouncemail
set no syslog
set logfile /var/log/fetchmail.log
defaults:
antispam -1
batchlimit 100
## Caselle di posta
#poll mail.host.xx with protocol pop3 user USERNAME@example.org there is #NOMEUTENTELOCALE here with password 'POPPASSWORD' options keep;
Gli ads non hanno bisogno di configurazioni particolari.

Abilitiamo ora le quote disco, che ci serviranno per poter ridimensionare le dimensioni delle cartelle dei siti (come se fossero hard disk fisici) senza bisogno di creare dei down.
Modificate /etc/fstab come indicato (le parti in rosso non vanno modificate e possono dipendere dall'installazione eseguita):

/dev/sda1 / ext3 defaults,usrquota,grpquota 0 1
Creo i files che conterranno le indicazioni quote disco:

sudo touch /aquota.user
sudo touch /aquota.group
sudo chmod 600 /aquota.user
sudo chmod 600 /aquota.group
Rimontiamo ora i filesystem con le nuove impostazioni:
sudo mount -o remount /dev/sda1
Editiamo /etc/mtab come segue (stessa modifica dell fstab):
/dev/sda1 / ext3 defaults,usrquota,grpquota 0 1
Editiamo /etc/modules per caricare il modulo quota all'avvio:
sudo echo quota_v2 >> /etc/modules
Controlliamo il tutto con l'apposto tool del pacchetto installato:
sudo quotacheck -vgum /
Se tutto è ok ora potrete impostare la dimensione come per le quote di windows.

PULIZIA:
Terminata la configurazione vi consiglio di rimuovere tutto il non necessario es:
sudo apt-get --purge remove sudo phpmyadmin
sudo apt-get clean
sudo a2dismod status info
sudo a2dissite default
Riavviate il tutto e dovreste avere un ottimo server web adatto a molti siti web.

Ultima cosa può essere creare alcuni script bash per la creazione automatica di tutto che potrete andare a richiamare con funzioni php come "exec".

Create quindi la cartella /usr/local/scripts
sudo mkdir /usr/local/scripts
ed ora al suo interno potete inserire gli script da richiamare, una linea guida sugli script da creare potrebbe essere:

1)
Generazione Password utente:
makepasswd > /usr/local/scripts/password_utente-`date +%Y%m%d`
export PASSWORD_UTENTE="$(cat /usr/local/scripts/password_utente
-`date +%Y%m%d`)"
Creazione databases
echo "CREATE DATABASE `date +%Y%m%d`-nome_utente" | mysql -u root -ppassword
Creazione utente mysql
echo "GRANT ALL PRIVILEGES ON `date +%Y%m%d`-nome_utente.* TO ‘nome_utente’@'%’ IDENTIFIED BY ‘$PASSWORD_UTENTE’ WITH GRANT OPTION;" | mysql -u root -ppassword
Creazione cartella sito php
sudo mkdir /var/www/nomedominio.estensione
Creazione cartella sito rails
sudo mkdir /var/rails/nomedominio.estensione
cd /var/rails/nomedominio.estensione
sudo rails application
Creazione utente fisico (con la homecorrispondente alla cartella del sito)
sudo useradd -o -c clientevirtual -d /var/www/nomedominio.estensione -g www-data -p $PASSWORD_UTENTE -u 33 nome_utente
2)
Impostazione permessi home
sudo chmod -R 644 /var/www/nomedominio.estensione
sudo chown -R nomeutente /var/www/nomedominio.estensione
Impostazioni permessi database
echo "FLUSH PRIVILEGIES;" | mysql -u root -ppassword
3)
Come altri passaggi si potrebbe fare un script che in base alla scelta del cliente lasci la home vuota oppure vi decomprima all'interno un cms opensource.
Consiglio i seguenti pacchetti da poter fornire ai propri clienti
Joomla10 (cms) , Joomla15 (cms) , Magento (e-commerce) , Drupal (cms) , WordPress (blog) , SMF (forum)
Posso segnalarvi anche "redhat el5 ES" per sviluppare una piattaforma web, in quanto molto stabile ed ora con una gestione di pacchetti più vicina a debian che a rpm tramite YUM. Ottima se cercate supporto per qualche applicativo proprietario.

Ciao A tutti
Swipon