# Nginx

##
Stringa di formato per i log di accesso

###
File di configurazione

Il file di configurazione è generalmente:

`/usr/local/etc/nginx/nginx.conf`

La linea usata per configurare i log di accesso è quella che inizia con "log_format main" seguita dalla lista dei codici dei campi.

### Formato di default

Di default, la stringa di formato è:

`log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $bytes_sent "$http_referer" "$http_user_agent"'`

### Formati suggeriti

La stringa di formato suggerita, per usare a pieno le funzionalità di LogDoctor, è:

`log_format main '$time_iso8601 "$request" $status $request_length $bytes_sent $request_time "$http_referer" "$http_user_agent" $remote_addr'`

### Nota sulle stringa di formato

QUando copi-incolli la stringa, ricordati di rimuovere le identazioni (se presenti) e di incollare solamente la stringa di formato che ne risulta.

### Nota sui caratteri di controllo

Nonostante Nginx supporti l'uso di alcuni caratteri di controllo (a.k.a. sequenze di escape), la raccomandazione è di non usarli nella stringa di formato.
In particolare, il carriage return potrebbe causare una sovrascrittura dei dati dei campi precedenti, rendendo molto difficile capire dove inizia il campo corrente (specialmente per campi come URI, query, user-agent, ecc) e praticamente impossibile il recupero dei dati sovrascritti, cosa che porta ad avere un database errato, statistiche non realistiche e/o crash durante l'esecuzione.
In riferimento al carattere new line (a.k.a. a capo), non ha praticamente senso usarlo, se non per propositi di test. La stessa cosa vale per il tab orizzontale, al posto del quale è più opportuno usare un singolo spazio.
I caratteri di controllo supportati da Nginx sono \n, \t e \r. Gli altri caratteri cerranno ignorati ed usati come testo.

##
Campi dei log di accesso

###
Campi considerati da LogDoctor

Gli unici campi considerati sono quelli che seguono, ovvero solo i dati di questi campi verranno salvati nel database ed usati per le statistiche.

Codice | Informazioni
--- | ---
$time_local | Data e orario in formato CLF (NCSA).
$time_iso8601 | Data e orario in formato ISO 8601.
$msec | Tempo Unix (in secondi, con risoluzione in millisecondi) nel momento di scrittura del log.
$request | Prima linea della richiesta, equivalente a: $request_method $request_uri $server_protocol.
$server_protocol | Il protocollo della richiesta (HTTP/v, HTTPS/v).
$request_method | Il metodo della richiesta (GET, POST, HEAD, ...).
$request_uri | L'URI richiesto, inclusa la stringa di query (se presente).
$uri | L'URI richiesto, senza la stringa di query.
$query_string | La stringa di query (se presente).
$status | Codice dello Status HTTP.
$request_length | Numero di Byte recevuti (include la linea di richiesta, l'header, e il corpo della richiesta).
$bytes_sent | Numero di Byte inviati al client.
$request_time | Il tempo necessario per processare la richiesta, in secondi con risoluzione in millisecondi: il tempo trascorso dal momento in cui i primi Byte provenienti dal client sono stati letti ed il momento di scrittura del log dopo che gli ultimi Byte sono stati inviati.
$http_referer | Hostname del sito referente.
$cookie_NOME | Il Cookie della richiesta con il NOME dato.
$http_user_agent | Stringa di identificazione del browser o del bot.
$remote_addr | Indirizzo IP del visitatore (client).
$realip_remote_addr | Indirizzo IP originale del client.

### Campi scartati da LogDoctor

Ogni campo eccetto i precedenti verrà scartato da LogDoctor.
Nella generazione di una stringa di log di esempio, questi campi appariranno come 'DISCARDED'.
Se non utilizzi i log per altri propositi, è consigliato rimuovere questi campi per velocizzare il processo e ridurre le possibilità di errore.

### Riferimenti

- Formati per i log di Nginx:
  https://nginx.org/en/docs/http/ngx_http_log_module.html#log_format
  https://docs.nginx.com/nginx/admin-guide/monitoring/logging/#setting-up-the-access-log