Guide Open Source

GUIDE E MANUALI DEL MONDO LINUX E CMS

Guide Open Source

GUIDE E MANUALI DEL MONDO LINUX E CMS

Guide Open Source

GUIDE E MANUALI DEL MONDO LINUX E CMS

Come impostare un Proxy inverso cache con Squid 2.6 su Debian Etch

Questo articolo spiega come è possibile impostare un caching proxy inverso con Squid 2.6 davanti al server web su Debian Etch. Se avete un sito web dinamico di alto-traffico che genera un sacco di query di database a ogni richiesta, è possibile ridurre drasticamente il carico del server memorizzando nella cache il contenuto per qualche minuto o più (che dipende dalla frequenza di aggiornamento del contenuto).

Io non rilasciano alcuna garanzia che questo funziona per voi!

 

1 Nota preliminare

In questa guida ti chiamo il sito web che voglio memorizzare nella cache www.example.com, ed è in esecuzione su Apache2. Io installare Squid sullo stesso server e configurare Apache per l’ascolto sulla porta 8080 e calamari sulla porta 80 , affinché tutte le richieste HTTP andare al calamaro che poi li passa Apache (a meno che non può soddisfare la richiesta dalla sua cache).

Naturalmente, siete liberi di installare Squid su un altro sistema – si potrebbe quindi lasciare che Apache sulla porta 80.

 

2 preparazione del Backend Web Server (Apache)

Calamaro passerà sull’indirizzo IP dell’utente originale in un campo denominato X-Forwarded-For al back-end server web (Apache). Naturalmente, il server web di back-end deve accedere l’indirizzo IP dell’utente originale nel suo log di accesso anziché l’indirizzo IP del nostro proxy Squid. Quindi dobbiamo modificare la riga LogFormat in /etc/apache2/apache2.conf e sostituire %h con % {X-Forwarded-For} io:

vi /etc/apache2/apache2.conf
[...]
#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
[...]

Successivamente apriamo /etc/apache2/ports.conf

vi /etc/apache2/ports.conf

… e cambiare la porta di Apache dovrebbe ascoltare a 8080:

Listen 8080

In seguito abbiamo riavviare Apache:

/etc/init.d/apache2 restart

 

3 installazione e configurazione di Squid

Squid può essere installato come segue:

apt-get install squid

Successivamente facciamo una copia di backup del file squid. conf originale (/etc/squid/squid.conf):

CD/etc/squid /
MV squid. conf squid.conf_orig

squid.conf_orig è più quindi 4000 linee lunghe – contiene tutte le opzioni di configurazione Squid 2.6 valide insieme a un sacco di commenti. Anche se questo è più o meno leggere, si dovrebbe assolutamente prendere il tempo a studiarlo!

Ora possiamo creare un file Squid conf per il nostro server:

vi squid.conf
cache_mgr root

# Basic parameters
visible_hostname www.example.com

# This line indicates the server we will be proxying for
http_port 80 defaultsite=www.example.com vhost

# And the IP Address for it - adjust the IP and port if necessary
cache_peer 127.0.0.1 parent 8080 0 no-query originserver login=PASS

acl apache rep_header Server ^Apache
broken_vary_encoding allow apache

# Where the cache files will be, memory and such
cache_dir ufs /var/spool/squid 10000 16 256
cache_mem 256 MB
maximum_object_size_in_memory 128 KB

# Log locations and format
#logformat common %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %Hs %<st %Ss:%Sh
logformat combined %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %Hs %<st "%{Referer}>h" "%{User-Agent}>h" %Ss:%Sh

access_log /var/log/squid/access.log combined

# Example how to configure Squid to not log certain requests
#acl dontlog urlpath_regex ^\/monit\/token$
#acl dontlog urlpath_regex ^\/server-status$
#acl dontlog urlpath_regex ^\/admedia\/reste_300x250.php$
#acl dontlog urlpath_regex ^\/admedia\/reste_120x600.php$
#acl dontlog urlpath_regex ^\/admedia\/reste_728x90.php$
#acl dontlog urlpath_regex ^\/geoip\/rectangle_forum_postbit.html$
#acl dontlog urlpath_regex ^\/geoip\/banner_iframe.php
#acl dontlog urlpath_regex ^\/js\/amazon.js
#acl dontlog urlpath_regex .js$
#acl dontlog urlpath_regex .css$
#acl dontlog urlpath_regex .png$
#acl dontlog urlpath_regex .gif$
#acl dontlog urlpath_regex .jpg$
#access_log /var/log/squid/access.log combined !dontlog

cache_log /var/log/squid/cache.log
cache_store_log /var/log/squid/store.log
logfile_rotate 10
## put this in crontab to rotate logs at midnight:
## 0 0 * * * /usr/sbin/squid -k rotate &> /dev/null

hosts_file /etc/hosts

# Basic ACLs
acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl to_localhost dst 127.0.0.0/8
acl Safe_ports port 80
acl purge method PURGE
acl CONNECT method CONNECT

http_access allow manager localhost
http_access deny manager
http_access allow purge localhost
http_access deny purge
http_access deny !Safe_ports
http_access allow localhost
http_access allow all
http_access allow all
http_reply_access allow all

icp_access allow all

cache_effective_group proxy

coredump_dir /var/spool/squid

forwarded_for on

emulate_httpd_log on

redirect_rewrites_host_header off

buffered_logs on

# Do not cache cgi-bin, ? urls, posts, etc.
hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?
acl POST method POST
no_cache deny QUERY
no_cache deny POST

# Example how to configure Squid to not cache certain URLs
#acl adminurl urlpath_regex ^/myadminpanel
#no_cache deny adminurl
#acl phpmyadminurl urlpath_regex ^/phpmyadmin
#no_cache deny phpmyadminurl

Si tratta di roba standard. Assicurarsi che è regolare il nome host e indirizzo IP, se necessario. Il login = PASS opzione nella riga di cache_peer rende quel . htaccess autenticazione viene passato tramite la cache. Ho aggiunto alcune linee (commentate) che mostrano come è possibile configurare Squid per non registrare determinate richieste nel suo log di accesso e come dire che non nella cache di alcuni URL.

Questa configurazione presuppone che tutti gli utenti stanno vedendo lo stesso, vale a dire, non hai gli utenti connessi che si dovrebbero vedere qualcosa di diverso rispetto agli utenti anonimi. Se avete gli utenti registrati che non dovrebbero vedere il contenuto memorizzato nella cache, continua a leggere – verrò a che in un momento (capitolo 5).

Ora cambiare i permessi di squid. conf e riavviare Squid:

Squid. conf chmod 600
/etc/init.d/squid riavvio

 

3.1 rotazione dei log

Supponiamo che si desidera di Squid per iniziare nuovi file di registro (Access. logcache.logStore. log) ogni giorno a mezzanotte perché il programma di analisi di registro ne ha bisogno in questo modo. Per effettuare questa operazione, è necessario la direttiva logfile_rotate in squid. conf (Vedi sopra) con un numero di vecchi file di registro per tenere (ad esempio, se si specifica 10, calamari manterrebbe gli ultimi dieci file di log, access.log.0 – access.log.9 cache.log.0 – cache.log.9store.log.0 – store.log.9).

Al fine di raccontare Squid per iniziare un nuovo file di log, dobbiamo creare il seguente processo di cron che corre ogni giorno a mezzanotte:

crontab -e
0 0 * * * /usr/sbin/squid -k rotate &> /dev/null

4 intestazioni HTTP

La memorizzazione nella cache non funziona out-of-the-box – è necessario modificare l’applicazione web in modo che la cache può lavorare (è possibile che l’applicazione web già supporta la memorizzazione nella cache – si prega di consultare la documentazione dell’applicazione per scoprire). Calamaro memorizzerà nella cache di pagine web solo se le intestazioni HTTP inviate dall’applicazione web dicono di farlo.

Ecco alcuni esempi di intestazioni che raccontano Squid non alla cache:

  • Intestazioni di scadenza con una data nel passato: “Expires: domenica 19 novembre 1978 05:00:00 GMT”
  • Alcune intestazioni di Cache-Control : “Cache-Control: no-store, no-cache, must-revalidate” o “Cache-Control: must-revalidate, max-age = 0, s-maxage = 0”
  • Le intestazioni Set-Cookie : una pagina non verrà memorizzata se viene impostato un cookie.

Così se volete Squid per memorizzare nella cache le pagine, è necessario modificare l’applicazione per non inviare tali intestazioni.

Se volete Squid per memorizzare nella cache le pagine, è possibile impostare un’intestazione Expires con una data in futuro, ma è consigliabile utilizzare s-maxage:

"Cache-Control: must-revalidate, max-age=0, s-maxage=600"

Questo spiega calamari nella cache la pagina per 600 secondi (s-maxage), e allo stesso tempo dice il browser dell’utente non per memorizzare nella cache la pagina (età massima) – matrimoniale-memorizzazione nella cache può portare a risultati inaspettati!

Naturalmente, questa intestazione è inutile se vi mando una delle intestazioni non memorizzazione nella cache (Expires in passato, Set-Cookie, ecc.) da sopra allo stesso tempo!

Un’altra intestazione molto importante per la memorizzazione nella cache è questo:

"Vary: Accept-Encoding"

Questo rende calamari mantenere due copie di ogni pagina memorizzata nella cache, un compresso (gzip) e uno non compresso di modo che può fornire la versione giusta a seconda delle capacità del utente-agente/browser. Alcuni user-agent non capisco la compressione gzip, così si dovrebbe ottenere la versione non compressa.

Quindi, ecco il riassunto: utilizzare le seguenti due intestazioni se volete Squid cache:

“Cache-Control: must-revalidate, max-age = 0, s-maxage = 600”
“Variare: Accept-Encoding”

e assicurarsi che vengono inviati senza scadenza con una data nel passato, biscotti, ecc.

Se l’applicazione è scritta in PHP, è possibile utilizzare la funzione header () di PHP per l’invio delle intestazioni HTTP, ad esempio come questo:

Header (“Cache-Control: must-revalidate, max-age = 0, s-maxage = 600”);
intestazione (“Vary: Accept-Encoding”);

Questa pagina è una lettura obbligata se volete saperne di più sulle intestazioni HTTP e la memorizzazione nella cache: http://www.mnot.net/cache_docs/

 

5 contenuti diversi per utenti diversi

Ora supponiamo che avete effettuato il log-negli utenti le cui pagine non devono essere memorizzata nella cache, mentre le pagine per utente anonimo devono essere memorizzata nella cache.

Puoi farlo impostando un cookie (denominarlo LOGGED_IN in questo esempio) ogni volta che un utente si connette e di disinserimento quando si esegue il logout. Quando l’utente vi accede, è possibile impostare il cookie come questo in PHP (valido per una settimana = 604800 secondi):

setcookie('LOGGED_IN', 'Y', $_SERVER['REQUEST_TIME'] + 604800, '/');

Quando l’utente esegue il logout, è possibile non impostato il cookie dando una data nel passato:

setcookie('LOGGED_IN', '', $_SERVER['REQUEST_TIME'] - 31536000, '/');

Ora dobbiamo configurare Squid affinché esso non memorizzare nella cache pagine quando il cookie LOGGED_IN contiene il valore YAperto /etc/squid/squid.conf

vi /etc/squid/squid.conf

… e aggiungere le seguenti righe:

[...]
acl cookie_logged_in_set rep_header Set-Cookie LOGGED_IN=Y
cache deny cookie_logged_in_set
acl cookie_logged_in_out rep_header Cookie LOGGED_IN=Y
cache deny cookie_logged_in_out
acl cookie_logged_in     req_header Cookie LOGGED_IN=Y
cache deny cookie_logged_in

Quindi riavviare Squid:

/etc/init.d/squid restart

 

6 guardando le intestazioni

Per scoprire quali intestazioni HTTP è l’invio dell’applicazione, è possibile installare il LiveHTTPHeaders plugin per Firefox. Con l’aiuto del plugin che si può anche scoprire se una pagina è servita dalla cache (HIT) o non (danon perdere).

Ecco un esempio di una HIT (età Mostra l’età della copia cache in secondi):

HTTP/1.0 200 OK
Data: Mercoledì 17 dicembre 2008 09:57:03 GMT
Server: PHP/5.2.0-8+etch13 Apache/2.2.3 (Debian)
X-Powered-By: PHP/5.2.0-8+etch13
Cache-Control: must-revalidate, max-age = 0, s-maxage = 600
X-UA-Compatible: IE = 7
Ultima modifica: Mercoledì 17 dicembre 2008 09:06:29 GMT
ETag: “e8b0de24351dd12ab17a196fca9571a4”
Content-Encoding: gzip
Vary: Accept-Encoding
Content-Type: text/html; charset = utf-8
Età: 74
X-Cache: HIT da www.example.com
X-Cache-Lookup: colpito da www.example.com:80
Via: 1,0 www.example.com:80 (squid/2.6.STABLE5)
Connessione: chiudere

E qui è un perdere:

HTTP/1.0 200 OK
Date: Wed, 17 Dec 2008 09:56:47 GMT
Server: PHP/5.2.0-8+etch13 Apache/2.2.3 (Debian)
X-Powered-By: PHP/5.2.0-8+etch13
Scade il: Domenica 19 novembre 1978 05:00:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check = 0, pre-check = 0
Pragma: no-cache
X-UA-Compatible: IE = 7
Set-Cookie: PHPSESSID = c516a650bdba0719d216d21d345cb26a; Expires = venerdì 9 gennaio 2009 13:30:07 GMT; Path = /
Last-Modified: Wed, 17 Dec 2008 09:56:47 GMT
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 9419
Content-Type: text/html; charset = utf-8
X-Cache: MISS da www.example.com
X-Cache-Lookup: perdere da www.example.com:80
Via: 1,0 www.example.com:80 (squid/2.6.STABLE5)
Connessione: chiudere

 

  • Calamaro: http://www.squid-cache.org/
  • Apache: http://httpd.apache.org/
  • LiveHTTPHeaders Firefox plugin: http://livehttpheaders.mozdev.org/
  • Memorizzazione nella cache tutorial: http://www.mnot.net/cache_docs/
  • PHP: http://www.php.net/
  • Debian: http://www.debian.org/

Piaciuto l'articolo? Condividilo sui social!

Share on facebook
Facebook
Share on twitter
Twitter
Share on linkedin
LinkedIn
Share on whatsapp
WhatsApp