Archivio

Archivio autore

MySQL Tuning

6 febbraio 2010 Luca Nessun commento

Con l’installazione di default la configurazione del servizio mysql viene impostata ad un livello “standard” che va piu’ o meno bene su tutti i server.
In questo articolo vedremo come ottimizzare il valore associato alle variabili presenti nella configurazione, ottimizzandola in base alla memoria e all’hardware disponibile sul nostro server.

key_buffer_size

Indica la quantita’ di indici (i file con estensione MYI) delle tabelle di tipo MYISAM mantenuti in memoria.
L’ideale sarebbe quello di poter contenere in RAM tutti i file di questo tipo.
Il valore attribuito a questa variabile non deve superare la meta’ di tutta la RAM dedicata al servizio mysqld.
Se non potete mettere in memoria tutti i file MYI potrete fare questa ottimizzazione:

Accedete nella console di mysql ed eseguite questa query

show status like ‘%key_read%’;

Dividete il valore di key_read_requests per key_read;
Il risultato deve essere maggiore di 100.

Si imposta nella sezione [mysql] ad es.

[mysqld]
key_buffer_size = 64M

table_cache

Quando mysql accede ad una tabella, la carica in cache. La migliore delle situazioni sarebbe quella di avere una cache talmente grande da contenere
tutte le tabelle aperte in un dato momento.
Per verificare quante tabelle sono aperte in un determinato istante eseguiamo questa query

show status like ‘open_tables’;

Analizzando questo valore nel tempo, possiamo valutare i picchi massimi

Possiamo verificare anche quante tabelle sono state aperte dall’esecuzione del servizio mysql

show status like ‘opened_tables’;

Avremo modo cosi’ di capire se open_tables e’ “attendibile” oppure momentaneamente superiore/inferiore alla media.

Si imposta nella sezione [mysql] ad es.

[mysqld]
table_cache  = NUMERO

thread_concurrency

Questa variabile limita il numero di thread avviati simultaneamente. Il valore da impostare e’ questo

2 * (numero di CPU)

Si imposta nella sezione [mysql] ad es.

[mysqld]
thread_concurrency  = 4

read_rnd_buffer_size

Viene utilizzata a seguito di una query che prevede un ordinamento delle righe, il classico ORDER BY per intenderci.
E’ consigliabile impostare 1Kb per ogni MB di memoria destinata al servizio mysqld.

Si imposta nella sezione [mysql] ad es.

[mysqld]

read_rnd_buffer_size = 256k

tmp_table_size

Il valore associato a questa variabile indica la dimensione massima delle tabelle temporanee create in memoria.
Si riferisce alle tabelle di tipo MyIsam e quando e’ insufficente la tabella verra’ creata sul disco, con conseguente perdita di performance.
Eseguendo questo comando

mysqladmin -uroot -pPASSWORD processlist -i1

si puo’ verificare se ci sono tabelle temporanee gestite lentamente. Se dovesse essere questo il caso, e’ necessario (memoria permettendo) aumentare tmp_table_size

Si imposta nella sezione [mysql] ad es.

[mysqld]

tmp_table_size = 96M

innodb_buffer_pool_size

Come tmp_table_size ma per le tabelle di tipo InnoDB. Si puo’ impostare questo valore pari al 70/80% della memoria dedicata al servizio mysql

skip-innodb

Se non state utilizzando tabelle di tipo innodb, aggiungete questa direttiva nella sezione [mysqld] della configurazione del servizio

Utilizzare la cache per le query

Per abilitare la cache sulle query impostare

query-cache-type = 1

query-cache-size = 16777216

(questo valore e’ espresso in byte)

Adesso nella console di mysql eseguite questo:

show status like ‘%qcache%’;

e guardate il valore di

Qcache_free_memory
Qcache_lowmem_prunes

Qcache_free_memory indica la memoria disponibile che potra’ essere ancora utilizzata per la cache.
Il valore di Qcache_lowmem_prunes viene aumentato ogni qualvolta che viene rimossa una query dalla cache. Se vedete aumentare questo valore molto rapidamente, dovrete aumentare query-cache-size.

N.B. query_cache_limit indica la dimensione massima del risultato di una query. Se viene superato quella query non sara’ inserita nella cache

Per ripulire la cache bastera’ eseguire questo comando dalla console di mysql

RESET QUERY CACHE

Come installare e configurare un server DNS

2 febbraio 2010 Luca 1 commento

Il servizio DNS (Domain Name System) e’ uno dei sistemi piu’ importanti per il funzionamento di Internet stessa. Tutte le macchine che fanno parte della rete sono connesse tra di loro e sono in grado di comunicare poiche’ ad ognuna di essa e’ associato un indirizzo IP univoco. Questi indirizzi sono del tipo 212.25.170.148 ed immaginate quanto sarebbe difficile ricordare il nome di un sito in questo modo, tralasciando il fatto che poi ogni dominio puo’ aver associato piu’ di un indirizzo IP. www.google.it e’ 209.85.229.103, ma anche 209.85.229.104, 209.85.229.105, 209.85.229.106 e 209.85.229.147. Il DNS consente di poter utilizzare nomi mnemonici (di gran lunga piu’ facili da gestire) occupandosi quindi della conversione da nome macchina ad indirizzo IP. Per incrementare la visibilita’ (in caso quindi in cui un dns non funzionasse correttamente) ogni sito puo’ disporre di 3,4, o piu’ DNS distinti ognuno situato in localita’ geografiche differenti. Ogni sito deve avere almeno 2 DNS. La classica configurazione e’ quella che prevede l’utilizzo di un DNS Master (primario) ed un DNS Slave (secondario). I termini “Master/primario” e “Slave/secondario” non stanno ad indicare la priorita’ con il quale vengono interrogati, entrambi forniscono risposte autorevoli ed accettano le richieste con ordine casuale. Il dns master ha le informazioni relative ad un dominio scritte su file locali ed aggiorna quelle degli slave ogni qualvolta viene effettuata una modifica (ad esempio se viene creato un terzo livello del tipo segreteria.lucaercoli.it) oppure quando scade il tempo di vita (chiamato TTL) della zona. Possono coesistere piu’ master ma ogni volta che viene editata una zona (ad esempio per modificare l’indirizzo ip del record www di un sito), dovra’ essere modificata manualmente anche la zona presente sugli altri master (gli slave di aggiorneranno automaticamente). Possono esserci comunque molte configurazioni difatti i DNS possono essere di 5 tipi:

- Master;

- Slave;

- Caching (Ottengono informazioni dai DNS autorevoli, quindi master e slave, memorizzando le informazioni localmente fino allo scadere del TTL. Nel frattempo se ricevono altre query per uno stesso sito, in risposta vengono comunicati i dati presenti in cache);

-Forwarding (Sistemi che “smistano” le query ad un altro DNS, mantenendo in cache i risultati);

- Stealth (Particolari name server il cui nome non viene visualizzato pubblicamente, utilizzati ad esempio per risolvere i nomi delle macchine interne di una societa’ ed evitare che possano essere comunicati all’esterno);

Vediamo adesso come installare e configurare il due server DNS BIND, uno master e l’altro slave. Nell’esempio verranno utilizzate le distribuzioni linux debian e centos:

Debian Linux

Tutti i comandi (se non diversamente specificato) dovranno essere processati sia sul server master che sullo slave.

Installiamo il servizio con

apt-get install bind9 bind9-host dnsutils

N.B. Basterebbe installare bind9 e bind9-host ma in dnsutils ci sono una serie di pacchetti che ci serviranno per fare dei test post installazione

Aggiungere la direttiva

recursion no;

nel gruppo “options” presente nel file /etc/bind/named.conf.options
Creiamo la directory che conterra tutte le zone per cui il nostro dns sara’ autorevole

mkdir /var/named

Configurazione per il Master

in /etc/bind/named.conf.local

zone “lucaercoli.it” {

type master;

file “/var/named/lucaercoli.it.named”;

allow-transfer {212.25.170.147;};

allow-update {212.25.170.147;};

};

N.B. Assegniate alla zona e al persorso del “file” quello del vostro sito e cambiate l’indirizzo ip 212.25.170.147 con quello del vostro server slave per consentire l’aggiornamento della zona quando viene modificata quella sul master

in /var/named/lucaercoli.it.named

$TTL    30m
@  IN SOA dns.lucaercoli.it. dns2.lucaercoli.it. (
2009100200               ;Serial
86400            ;refresh
7200             ;retry
2592000          ;expire
86400 )          ;minimum

IN NS   dns.lucaercoli.it.
IN NS   dns2.lucaercoli.it.

IN MX   10 mail

;in house subnet
www             IN A 212.25.170.148
ftp             IN CNAME www
mail            IN A 212.25.170.148

dns        IN A 212.25.170.146
dns2        IN A 212.25.170.147

N.B. Modificate l’indirizzo ip impostando quello del vostro sito e cambiando ovviamente il nome/ip dei due dns. Fate attenzione ad indentare corrattamente il file. Gli spazi sono importanti difatti bind potrebbe non leggere correttamente la zona. Dare quindi almeno uno spazio ad inizio riga di “IN NS”

Riavviare il servizio

/etc/init.d/bind9 restart

Configurazione per il server Slave:

in /etc/bind/named.conf.local

zone “lucaercoli.it” {
type slave;
file “/var/named/lucaercoli.it.named”;
masters {
212.25.170.146;
};
};

N.B. Cambiate l’indirizzo ip 212.25.170.146 con quello del vostro server master e assegnate sia al nome della zona che al “file” quella associata al vostro sito

Riavviare il servizio

/etc/init.d/bind9 restart

CentOS GNU/Linux

Tutti i comandi (se non diversamente specificato) dovranno essere processati sia sul server master che sullo slave.

Installiamo il servizio con

yum install bind bind-libs bind-chroot bind-utils

Creiamo il file /var/named/chroot/etc/named.conf con questo contenuto

options {
directory “/var/named”;
pid-file “/var/run/named/named.pid”;

recursion no;

listen-on {
127.0.0.1;
212.25.170.148;
};

};

N.B. In “listen-on” impostate l’indirizzo ip su cui il dns deve rispondere.

Configurazione per il Master

in /var/named/chroot/etc/named.conf aggiungere

zone “lucaercoli.it” IN {
type master;
file “data/lucaercoli.it.named”;

allow-transfer {212.25.170.147;};
allow-update {212.25.170.147;};};

N.B. Assegniate alla zona e al persorso del “file” quello del vostro sito e cambiate  l’indirizzo ip 212.25.170.147 con quello del vostro server slave per consentire l’aggiornamento della zona quando viene modificata quella sul master

in /var/named/chroot/var/named/data/lucaercoli.it.named

$TTL    30m
@  IN SOA dns.lucaercoli.it. dns2.lucaercoli.it. (
2009100200               ;Serial
86400            ;refresh
7200             ;retry
2592000          ;expire
86400 )          ;minimum

IN NS   dns.lucaercoli.it.
IN NS   dns2.lucaercoli.it.

IN MX   10 mail

;in house subnet
www             IN A 212.25.170.148
ftp             IN CNAME www
mail            IN A 212.25.170.148

dns        IN A 212.25.170.146
dns2        IN A 212.25.170.147

N.B. Modificate l’indirizzo ip impostando quello del vostro sito e cambiando ovviamente il nome/ip dei due dns. Fate attenzione ad indentare corrattamente il file. Gli spazi sono importanti difatti bind potrebbe non leggere correttamente la zona. Dare quindi almeno uno spazio ad inizio riga di “IN NS”

Riavviare il servizio

/etc/init.d/named restart

Configurazione per lo Slave

in /var/named/chroot/etc/named.conf aggiungere

zone “lucaercoli.it” {
type slave;
file “data/lucaercoli.it.named”;
masters {
212.25.170.146;
};
};

N.B. Cambiate l’indirizzo ip 212.25.170.146 con quello del vostro server master e assegnate sia al nome della zona che al “file” quella associata al vostro sito

Riavviare il servizio

/etc/init.d/named restart

Fate attenzione ad indentare corrattamente il file. Gli spazi sono importanti difatti bind potrebbe non leggere correttamente la zona. Dare quindi almeno uno spazio ad inizio riga di “IN NS”

Come installare apache2, php e proftpd con debian lenny

28 gennaio 2010 Luca 1 commento

In questo articolo effettueremo un’installazione passo-passo del web server apache2, integreremo il php come modulo ed infine installeremo proftpd per poter aggiornare il nostro sito via ftp.

-Installazione di apache2 e php

Ecco i primi comandi da eseguire

apt-get update

apt-get install apache2-mpm-prefork libapache2-mod-php5 php-pear php5-imagick php5-curl php5-gd php5-imap php5-mcrypt php5-mysql php5-xmlrpc php5-xsl

Eseguendo “ps ax” vedrete gia’ apache in esecuzione:

6163 ?        Ss     0:00 /usr/sbin/apache2 -k start
9227 ?        S      0:00 /usr/sbin/apache2 -k start
9228 ?        S      0:00 /usr/sbin/apache2 -k start
9229 ?        S      0:00 /usr/sbin/apache2 -k start
9230 ?        S      0:00 /usr/sbin/apache2 -k start
9231 ?        S      0:00 /usr/sbin/apache2 -k start

La configurazione di default crea un sito con la document root in

/var/www/

inserire in /etc/apache2/apache2.conf questo prima della riga “# Include the virtual host configurations:” (verso la fine del file)

AddType application/x-httpd-php .php

e riavviate il servizio

/etc/init.d/apache2 restart

Se dobbiamo ospitare un solo dominio, allora il lavoro e’ quasi terminato.

Pubblicando questo file

/var/www/info.php

con questo contenuto

<?php
phpinfo();
?>

Avremo modo (accedendo con un browser web all’indirizzo www.tuosito.it/info.php) di visualizzare la configurazione del php installato.
Tutte le modifiche al php dovranno essere effettuate al file /etc/php5/apache2/php.ini e dovrete riavviare il server web (/etc/init.d/apache2 restart)
Potrete passare tranquillamente alla sezione relativa all’installazione di proftpd se questa configurazione e’ adatta all’utilizzo che intendete fare del server web. Se invece desiderate ospitare piu’ di un sito allora dovrete create dei virtual host. Si possono creare di due tipi, ip based (quando ad ogni sito e’ riservato un proprio indirizzo ip) oppure name based (se sullo stesso indirizzo ip sono ospitati piu’ siti). In questo articolo vediamo come installare sullo stesso indirizzo ip piu’ di un sito. Cancelliamo la configurazione del sito di default

rm -f /etc/apache2/sites-available/*
rm -f /etc/apache2/sites-enabled/*

creiamo le cartelle che dovranno contenere i dati del sito sito (dati web e file di log)

mkdir -p /var/www/virtual_hosts/www.tuosito.it/htdocs
mkdir -p /var/www/virtual_hosts/www.tuosito.it/logs

Generiamo un file index con un messaggio di benvenuto

echo “Il mio primo sito” > /var/www/virtual_hosts/www.tuosito.it/htdocs/index.html

accediamo nella cartella /etc/apache2/sites-available/ (qui sono contenuti i siti ospitati, anche quelli non abilitati)

cd /etc/apache2/sites-available/

creiamo il file associato al sito. chiamiamolo per esempio www.tuosito.it e scriviamo questo al suo interno

<VirtualHost *:80>
ServerName www.tuosito.it
ServerAdmin luca@tuosito.it

DocumentRoot /var/www/virtual_hosts/www.tuosito.it/htdocs

ErrorLog /var/www/virtual_hosts/www.tuosito.it/logs/error.log

LogLevel crit

CustomLog /var/www/virtual_hosts/www.tuosito.it/logs/access.log combined
ServerSignature On
</VirtualHost>

N.B. cambiare il nome del virtualhost e correggere il percorso di riferitmento dei log e della document root adattandola al vostro sito.

Adesso abilitiamolo. I siti abilitati sono quelli presenti nella cartella /etc/apache2/sites-enabled/. Dato che abbiamo gia’ creato la nostra configurazione, per abilitare il sito bastera’ creare un link simbolito da sites-enabled  verso sites-available. Si fa in questo modo:

cd /etc/apache2/sites-enabled/
ln -s ../sites-available/www.tuosito.it

Riavviare apache

/etc/init.d/apache2 restart

- Procediamo con l’installazione di proftpd

Anche in questo caso utilizzaremo apt per installare il daemon

apt-get install proftpd

Nel menu’ “ProFTPD configuration” scegliamo l’opzione “standalone”


Creiamo l’utente del sito

adduser sito1

Eseguiamo l’applicazione

vipw

Cambiamo la home dell’utente facendola puntare alla cartella htdocs del sito (quindi da /home/sito1 a /var/www/virtual_hosts/www.tuosito.it/htdocs/) e disabilitiamo l’accesso via ssh impostando la shell da /bin/bash a /bin/false

Usciamo da vipw (digitando :wq) ed impostiamo /bin/false come shell valida per l’accesso ftp.
Si fa inserendo la riga /bin/false in /etc/shells

echo “/bin/false” >> /etc/shells

Impostiamo il corretto proprietario ai dati

cd /var/www/virtual_hosts/www.tuosito.it/
chown sito1:sito1 htdocs -R

Finito! Adesso il nostro sito e’ aggiornabile via ftp.
Ecco la registrazione di una sessione di prova effettuata:

ftp www.tuosito.it
Connected to www.tuosito.it

220 ProFTPD 1.3.1 Server (Debian) [::ffff:XXX.251.36.131]
Name (www.tuosito.it): sito1
331 Password required for sito1
Password:
230 User sito1 logged in
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (XXX,251,36,131,10,87).
150 Opening ASCII mode data connection for file list
-rw-r–r–   1 sito1    sito1          18 Sep 25 10:27 index.html
-rw-r–r–   1 sito1    sito1          20 Sep 25 12:46 info.php
226 Transfer complete
ftp> put dummy.file.gz
local: dummy.file.gz remote: dummy.file.gz
227 Entering Passive Mode (XXX,251,36,131,18,30).
150 Opening BINARY mode data connection for dummy.file.gz
226 Transfer complete
1038 bytes sent in 0.00 secs (3607.4 kB/s)
ftp> ls
227 Entering Passive Mode (XXX,251,36,131,13,95).
150 Opening ASCII mode data connection for file list
-rw-r–r–   1 sito1    sito1        1038 Sep 25 17:50 dummy.file.gz
-rw-r–r–   1 sito1    sito1          18 Sep 25 10:27 index.html
-rw-r–r–   1 sito1    sito1          20 Sep 25 12:46 info.php
226 Transfer complete
ftp> dele dummy.file.gz
250 DELE command successful
ftp> ls
227 Entering Passive Mode (XXX,251,36,131,16,89).
150 Opening ASCII mode data connection for file list
-rw-r–r–   1 sito1    sito1          18 Sep 25 10:27 index.html
-rw-r–r–   1 sito1    sito1          20 Sep 25 12:46 info.php
226 Transfer complete
ftp> quit
221 Goodbye.

Installare mod_fcgid con apache2 in CentOS GNU/Linux

24 dicembre 2009 Luca 1 commento

apacheDi default il web server apache esegue gli script php di un sito con l’utente “www-data”. Per permettere ad uno script di memorizzare dati all’interno di una directory, allora i permessi di quest’ultima devono essere settati a 777 oppure il proprietario della cartella deve essere l’utente “www-data”. In questo caso, se sul vostro server web e’ attivo piu’ di un sito internet, allora uno script di un dominio potrebbe modificare i dati di un’altro. Come fare per ovviare a questo problema?  Eseguendo gli script di ogni sito con un utente distinto installando la suexec, mod_fcgid ed utilizzando il php in modalita’ cgi. Piu’ difficile a dirsi che a farsi, bastano difatti pochi comandi e qualche minuto per configurare il tutto:

1) Occorre disabilitare SELinux

setenforce 0

Editare il file /etc/selinux/config ed impostare SELINUX a ‘disable’

SELINUX=disabled

2) Installare mod_fcgid. Questo modulo  non e’ disponibile nel repository ufficiale di CentOS ma possiamo prelevarlo da un’altra fonte

cd /etc/yum.repos.d/
wget http://centos.karan.org/kbsingh-CentOS-Extras.repo

Editare /etc/yum.repos.d/kbsingh-CentOS-Extras.repo ed impostare gpgcheck a 0 ed enabled a 1 nella sezione [kbs-CentOS-Testing]:

[...]
[kbs-CentOS-Testing]
gpgcheck=0
enabled=1
[..]

Eseguire adesso questo comando

yum install mod_fcgid

4)
Commentare tutte le righe del file /etc/httpd/conf.d/php.conf (per evitare che il php venga caricato come modulo), anteponendo il carattere # ad inizio riga

5)
Adesso dovremo forzare il PHP a correggere il percorso del cgi in modo conforme alle specifiche PATH_INFO/PATH_TRANSLATED. Bastera’ aggiungere nel php.ini (/etc/php.ini) questa direttiva:

cgi.fix_pathinfo = 1

6) Creiamo l’utente con cui dovranno essere eseguiti gli script del sito

groupadd sito1
useradd -s /bin/false -d /var/www/sito1 -m -g web1 web1
chmod 755 /var/www/sito1

7) Creiamo la cartella che dovra’ ospitare i file del sito

mkdir -p /var/www/sito1/htdocs
chown sito1:sito1 /var/www/sito1/htdocs

8) Creiamo il wrapper che utilizzeremo per avviare il php e configurare mod-fcgid:

mkdir -p /var/www/fcgid-conf-sito1

9) Inseriamo queste righe nel file /var/www/fcgid-conf-sito1/sito1.conf

#!/bin/sh
export PHPRC=/etc/
export PHP_FCGI_MAX_REQUESTS=400
export PHP_FCGI_CHILDREN=2
exec /usr/bin/php-cgi

PHPRC,PHP_FCGI_MAX_REQUESTS e PHP_FCGI_CHILDREN sono opzionali e se verranno omessi sara’ impostato il valore di default. Sono utili per poter indicare il percorso del php.ini, permettendo cosi’ di utilizzare una configurazione diversa da sito a sito, oppure per definire il numero di child per processo ed il numero di richieste che puo’ gestire prima di terminare.

10) Impostiamo i corretti permessi/proprietario

chmod 755 /var/www/fcgid-conf-sito1/sito1.conf
chown -R sito1:sito1 /var/www/fcgid-conf-sito1

11) Creiamo in /etc/httpd/conf/httpd.conf la configurazione del sito

<VirtualHost *:80>
ServerName www.sito1.it
ServerAdmin postmaster@sito1.it
DocumentRoot /var/www/sito1/htdocs/

<IfModule mod_fcgid.c>
SuexecUserGroup sito1 sito1
PHP_Fix_Pathinfo_Enable 1
<Directory /var/www/sito1/htdocs/>
Options +ExecCGI
AllowOverride All
AddHandler fcgid-script .php
FCGIWrapper /var/www/fcgid-conf-sito1/sito1.conf .php
Order allow,deny
Allow from all
</Directory>
</IfModule>

# ErrorLog /var/log/apache2/error.log
# CustomLog /var/log/apache2/access.log combined
ServerSignature Off

</VirtualHost>

12) Salvare il file e riavviare il web server

/etc/init.d/httpd restart

Categorie:Altro, Apache, How-to, Server, Sicurezza Tag: