Monitoring di Apache

Guida Apache
di Openskills

Strumenti di monitoraggio di Apache
Sono disponibili vari strumenti per monitorare e capire il funzionamento di Apache, il suo stato e quello che sta facendo.

Comandi Unix di Sistema.
Vari comandi comuni sono utili per verificare cosa sta facendo Apache (come qualsiasi altra applicazione):
ps -adef | grep httpd Visualizza se fra i processi in esecuzione c'è Apache (dovrebbero vedersi varie righe con httpd, una per ogni child in esecuzione, oltre al httpd padre di tutti i processi (l'unico eseguito come root).
netstat -natp Visualizza tutte le connessioni Internet esistenti sul sistema, tra cui quelli in LISTENING sul sistema. Per ogni connessione si mostra anche il processo che la gestisce.
ldd /usr/sbin/httpd o ldd /usr/local/apache/bin/httpd (o ldd /path/httpd) Visualizza tutte le librerie dinamiche utilizzate da Apache. Utile per capirne le dependencies.
strace -p PID (Dove il PID è quello di un child di Apache) Traccia le system call di un singolo processo.
strace apachectl start Traccia le system call del processo che avvia Apache, utile per diagnosticare eventuali problemi all'avvio di Apache (verificare prima i log).
lsof | grep httpd Visualizza tutti i file aperti da Apache. Utile per verificare, tra la'ltro, dove sono i log e quali moduli sono utilizzati.

Log di Apache
I log di Apache sono il primo posto dove cercare la soluzione di problemi (oltre che, ovviamente, analizzare il traffico Web sul sito). Di default sono in /usr/local/apache/logs ma se si è installato Apache tramite un RPM li si potranno trovare in /var/log/httpd o comunque dove specificato nel file di configurazione principale (verificare la direttiva ErrorLog e definire la verbosità dei log con LogLevel (per diagnostica mettere LogLevel debug per il massimo della verbosità, in condizioni normali lasciare LogLevel warn).

Server-status e Server-info
Apache fornisce due moduli che permettono all'amministratore di visualizzare informazioni utili in tempo reale.
Server-status mostra info sulle connessioni esistenti, l'uptime del server, il traffico generato, la CPU impegnata, la versione di Apache. E' possibile avere lo status sia in modalità normale che in modalità estesa, dove per ogni connessione si vedono maggiori informazioni. Di default, se abilitato, si trova su http://www.sito.com/server-status/
Server-info fornisce dettagliate informazioni sulla configurazione di Apache e sulle direttive relative ad ogni singolo modulo. Di default, se abilitato, si trova su http://www.sito.com/server-info/

Opzioni di invocazione
Anche le opzioni che possono essere passate ad Apache, eseguendo httpd danno informazioni utili:
httpd -V Mostra il numero di versione, e i parametri usati in fase di configurazione
httpd -l Mostra i moduli compilati direttamente nel file httpd.
httpd -L Mostra tutte le direttive che possono essere usate con i moduli direttamente compilati (vengono escluse tutte quelle che sono fornite dai moduli caricabili dinamicamente).
httpd -t Esegue un test sulla configurazione di Apache e segnala eventuali errori di sintassi.

Variabili d'ambiente
Apache setta ed utilizza una serie di variabili d'ambiente che possono essere utilizzate da script CGI, PHP, Perl o trattate in sede di configurazione per gestire il comportamento del server sulla base dell'ambiente generale e delle singole connessioni. Per visualizzarle esistono vari metodi indiretti, per esempio uno è quello di utilizzare PHP all'interno di pagine HTML: <?php echo $REMOTE_ADDR ?> visualizza l'IP del client remoto.

Server Status
Apache fornisce la possibilità di monitorare in tempo reale, direttamente via web, il suo stato, l'uptime, il tempo di CPU occupato, le connessioni che sta gestendo, i processi child in esecuzione e altre informazioni utili.

Questa funzionalità è fornita dal modulo mod_status che prevede delle specifiche direttive utilizzabili con una configurazione simile:
<Location /server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from .dominio.it
</Location>

Con questo esempio viene definita una Location accessibile all'url: http://www.dominio.it/server-status/ in cui vengono visualizzate informazioni varie sullo stato del server Web. In questo caso l'accesso è consentito solo da host nel dominio.it. Lasciando solo la riga SetHandler server-status si lascia accessibile a tutto il mondo la location server-status (opzione generalmente non consigliabile, in quando vengono visualizzate informazioni utili anche a potenziali intrusori).
Se si specifica, nella configurazione la direttiva ExtendedStatus On le informazioni fornite sono molto più dettagliate (per ogni connessione vengono indicati IP e porta del client, PID del child che la gestisce e altre info).
Su server in produzione ad alto traffico è consigliabile NON usare l'ExtendedStatus che appesantisce e rallenta il sistema.
E' possibile aggiornare automaticamente la visualizzazione dello status di un server digitando sul browser un ULR tipo:
http://openskills.info/server-status?refresh=3 (la pagina viene aggiornata ogni 3 secondi).
E' anche possibile visualizzare lo status da shell Unix, con: apachectl status (si deve aver installato il browser testuale Lynx sul server o, se si ha solo Links avere un link simbolico di /usr/bin/lynx che punta a /usr/bin/links).

SOURCE: Apache docs: Module mod_status - Url: http://httpd.apache.org/docs/mod/mod_status.html

Server-info
Apache può fornire molte informazioni sui moduli utilizzati e le direttive supportate.

Tramite il modulo mod_info è possibile abilitare la funzionalità server-info e visualizzarne le informazioni del caso in un URL tipo http://www.dominio.it/server-info con queste righe nella configurazione generale:
<Location /server-info>
SetHandler server-info
</Location>

All'URL indicato si possono visualizzare molte informazioni utili sulla configurazione di Apache al momento in cui è stato eseguito. In particolare è interessante la possibilità di vedere quali direttive sono utilizzate nella configurazione e quali sono i moduli che le forniscono.
Anche in questo caso le informazioni visibili sono piuttosto sensibili dal punto di vista della sicurezza, per cui è fortemente consigliato limitare l'accesso all'URL server-info da IP trusted.
<Location /server-info>
SetHandler server-info
Order deny,allow
Deny from all
Allow from 192.168.5.1 192.168.5.2
</Location>


Le variabili d'ambiente di Apache
Segue una pratica pagina PHP che elenca tutte le variabili d'ambiente di Apache, visualizza i valori correnti (solo se il modulo PHP è presente sul server) e da una breve spiegazione del significato di ogni variabile.

<pre>
<b>STANDARD VARIABLES</b><br>
<?
print("GATEWAY INTERFACE: <b>$GATEWAY_INTERFACE</b> - Revision of the server CGI specification (format: CGI/revision)<br>");
print("SERVER NAME: <b>$SERVER_NAME</b> - The server's hostname as it would appear in self reverencing URLS<br>");
print("SERVER SOFTWARE: <b>$SERVER_SOFTWARE</b> <br> - The name and the version of the server software (format: Name/version)");
print("AUTH TYPE: <b>$AUTH_TYPE</b> - If user authentication is active, this is the method used to validate the user<br>");
print("CONTENT LENGHT: <b>$CONTENT_LENGHT</b> - The lenght of the object content, as given by the client<br>");
print("CONTENT TYPE: <b>$CONTENT_TYPE</b> - The kind of data sent with POST or PUT commands<br>");
print("PATH INFO: <b>$PATH_INFO</b> - Extra PATH information, given by the client<br>");
print("PATH TRANSLATED: <b>$PATH_TRANSLATED</b> - The server's translated version of PATH_INFO<br>");
print("QUERY STRING: <b>$QUERY_STRING</b> - Whatever follows the ? in the URL<br>");
print("REMOTE ADDR: <b>$REMOTE_ADDR</b> - The IP of the remote client making the request<br>");
print("REMOTE HOST: <b>$REMOTE_HOST</b> - The hostname of the remote client (if Apache is configured to make reverse DNS lookup of its clients)<br>");
print("REMOTE IDENT: <b>$REMOTE_IDENT</b> - Identd name of the remote user. (Useless)<br>");
print("REMOTE USER: <b>$REMOTE_USER</b> - The username used for the access to a page that requires authentication<br>");
print("REQUEST METHOD: <b>$REQUEST_METHOD</b> - The HTTP method used for the request: GET, POST, HEAD...<br>");
print("SCRIPT NAME: <b>$SCRIPT_NAME</b> - A virtual path to the script being executed.<br>");
print("SERVER PORT: <b>$SERVER_PORT</b> - The port used on the server (usually 80)<br>");
print("SERVER PROTOCOL: <b>$SERVER_PROTOCOL</b> - The protocol and the version used to handle the request. (format: Protocol/revision)<br>");
?>
<br><b>HEADER VARIABLES (the names of the headers sent by the client preceded by HTTP_ ) </b><br>
<?
print("HTTP ACCEPT: <b>$HTTP_ACCEPT</b> - The MIME types that the client will accept<br>");
print("HTTP ACCEPT CHARSET: <b>$HTTP_ACCEPT_CHARSET</b> - A list of character set that can be processed by the client<br>");
print("HTTP ACCEPT ENCODING: <b>$HTTP_ACCEPT_ENCODING</b> - The coding type that can be processed by the client<br>");
print("HTTP ACCEPT LANGUAGE: <b>$HTTP_ACCEPT_LANGUAGE</b> - The languages which can be processed by the client's user<br>");
print("HTTP AUTHORIZATION: <b>$HTTP_AUTHORIZATION</b> - The data of an HTTP authentication<br>");
print("HTTP CACHE CONTROL: <b>$HTTP_CACHE_CONTROL</b> - Information about how to handle the caching od the object requested<br>");
print("HTTP COOKIE: <b>$HTTP_COOKIE</b> - The cookie(s), if exists, sent by the client<br>");
print("HTTP FORWARDED: <b>$HTTP_FORWARDED</b> - An old variant of the Via: header<br>");
print("HTTP FROM: <b>$HTTP_FROM</b> - The e-mail addres of the client's user (if the browser is set to send it)<br>");
print("HTTP HOST: <b>$HTTP_HOST</b> - The name of the web server addressed by the client<br>");
print("HTTP PRAGMA: <b>$HTTP_PRAGMA</b> - An old HTTP/1.0 variant of the Cache-Control header<br>");
print("HTTP REFERER: <b>$HTTP_REFERER</b> - The URL of the page from which a link was traced<br>");
print("HTTP USER_AGENT: <b>$HTTP_USER_AGENT</b> - The browser used to send the request (format: Software/VersionLibrary/Version)<br>");
print("HTTP VIA: <b>$HTTP_VIA</b> - Information about the proxy servers eventually used for making the request<br>");
?>
<br><b>APACHE VARIABLES (some Apache specific environment variables)</b><br>
<?
print("DOCUMENT PATH INFO: <b>$DOCUMENT_PATH_INFO</b> - Additional path information passed to a document<br>");
print("DOCUMENT ROOT: <b>$DOCUMENT_ROOT</b> - The file path specified by the conf directive DocumentRoot<br>");
print("PATH: <b>$PATH</b> - The corrisponding shell environment variable<br>");
print("REMOTE PORT: <b>$REMOTE_PORT</b> - The port used on the client side<br>");
print("REQUEST URI: <b>$REQUEST_URI</b> - The URL path of the file called. Set by mod_rewrite<br>");
print("SCRIPT NAME: <b>$SCRIPT_NAME</b> - The URL path of the CGI script that was caleld<br>");
print("SCRIPT FILENAME: <b>$SCRIPT_FILENAME</b> - The absolute file path of the CGI script called<br>");
print("SCRIPT URI: <b>$SCRIPT_URI</b> - The absolute URL of the CGI script called<br>");
print("SCRIPT URL: <b>$SCRIPT_URL</b> - The URL path of the CGI script called<br>");
print("SERVER ADMIN: <b>$SERVER_ADMIN</b> - the e-mail address specified with the directive ServerAdmin<br>");
?>
<br><b>VARIABLES SET BY MOD_INCLUDE (if compiled in) </b><br>
<?
print("DATE GMT: <b>$DATE_GMT</b> - The current date in Greenwich Mean Time<br>");
print("DATE LOCAL: <b>$DATE_LOCAL</b> - The current date in local time zone<br>");
print("DOCUMENT NAME: <b>$DOCUMENT_NAME</b> - The filename (no full path) of the document requested but the user<br>");
print("DOCUMENT URI: <b>$DOCUMENT_URI</b> - The (%-decoded) URL path ot the document requested by the user<br>");
print("LAST MODIFIED: <b>$LAST_MODIFIED</b> - The last modification date of the document requested by the user<br>");
print("USER_NAME: <b>$USER_NAME</b> - The name of the user who started Apache<br>");
?>
</pre>


Si ringrazia Openskills per
la realizzazione della guida


© Risorse.net (www.risorse.net)
pagina in versione stampabile:
http://www.risorse.net /apache/monitoring_apache.asp?print=ok