varnish nginx zope/zeo (X-Forwarded-for)

qunado si perde l'IP della richiesta ...

nell'utilizzare un server web con la seguente configurazione:

  • varnish server di cache sulla porta 80

la richiesta arriva prima al server di cache, che fornisce direttamente la risposta se la trova nella cache, altrimenti la inoltra al server di backend

  • nginx centrale di smistamento sulla porta 81

per la gestione dei virtual host e lo smistamento ai diversi server di backend, a secondo della tecnologia utilizzata (static, fastcgi, uwsgi, zope ...)

  • zope/zeo-client server di backend sulla porta es. 8081 / 8082 / 8083 / 8084

il server di backend che effettivamente fornisce l'informazione di un plone-site

la richiesta che viene inoltrata al server di backend, che effetivamente fornisce l'informazione, perde l'indirizzo IP originario, poichè la richiesta viene efettuata da varnish con l'indirizzo di localhost.

 

Se si utilizzano molteplici istanze zope, come zeo-client, non è possibile utilizzare la direttiva ip_hash nella configurazione del modulo upstream di nginx, per garantire che una connessione aperta, raggiunga sempre lo stesso zeo-client, poichè in questo caso l'ip_hash é sempre 127.0.0.1, pertanto ci si dovrà avvalere dell'header HTTP X-Forwarded-for, sebbene sia uno standard de facto.

 

Varnish

aggiungere le seguenti direttive al file .vcl di configurazione di varnish:

...
sub vcl_recv {
        ...
        # Add a unique header containing the client address
        remove req.http.X-Forwarded-For;
        set    req.http.X-Forwarded-For = client.ip;
...

a questo punto compariranno nel log di varnish i seguenti record:

   13 TxHeader     b X-Forwarded-For: 93.44.85.207
   13 TxHeader     b X-Varnish: 1236669023

   12 TxHeader     c X-Varnish: 1236669023

 

nginx

nginx dovrà essere ricompilato con il modulo (non standard) NginxHttpUpstreamRequestHashModule e l'apposita patch.

Se nginx viene installato uillizzando il buildout python, si può far eseguire l'intera operazione con la seguente configurazione:

[buildout]

parts =
    patch
    nginx
    frontend
...
[patch]
recipe = hexagonit.recipe.download
url = http://wiki.nginx.org/images/1/11/Nginx_upstream_hash-0.3.1.tar.gz
destination = ${buildout:directory}/patch

[nginx]
recipe = zc.recipe.cmmi
url = http://sysoev.ru/nginx/nginx-0.7.65.tar.gz
md5sum = abc4f76af450eedeb063158bd963feaa
patch = ${buildout:directory}/patch/nginx_upstream_hash-0.3.1/nginx.patch
extra_options = --add-module=${buildout:directory}/patch/nginx_upstream_hash-0.3.1

...

adesso dobbiamo gestire x-forwarded-for nell'upstream del file di configurazione del Virtual Host di nginx:

upstream backend {
  server 127.0.0.1:8081; 
  server 127.0.0.1:8082; 
  server 127.0.0.1:8083; 
  server 127.0.0.1:8084; 
  hash $http_x_forwarded_for;
}

server {
...
il file di log di nginx, come anche quello di zope, continueranno a registrare la richiesta con l'indirizzo IP 127.0.0.1, per poter controllare l'effettivo funzionamento dell'header HTTP X-Forwarded-for, si dovrà modificare il formato dell'access.log di nginx, aggiungendo, per esempio, al formato di default (combined) le seguenti variabili $upstream_addr e $http_x_forwarded_for:
  log_format up_format '$remote_addr - $remote_user [$time_local]  '
			'"$request" $status $body_bytes_sent '
			'"$http_referer" "$http_user_agent" - '
			'$upstream_addr $http_x_forwarded_for';

  access_log      /var/log/nginx/censimentoagricoltura.access.log up_format;

nell'access.log verranno aggiunte, ai dati di default, le seguenti informazini:

... - 127.0.0.1:8083 93.44.85.20

 

Share this on

Share |

On same topics

Commenti

comments powered by Disqus