Tengo una aplicación que utiliza la Pirámide request.environ['REMOTE_ADDR']
en algunos lugares.¿Cómo obtener la IP real de un cliente en un servidor de pirámide detrás de un proxy Nginx
La aplicación es servida por Python en Pegar en el puerto 6543 y un servidor Nginx escuchando en el puerto 80 es el reenvío de peticiones al servidor Pegar.
La configuración nginx está inspirado en el libro de cocina Pyramid:
server {
listen 80; ## listen for ipv4
listen [::]:80 default ipv6only=on; ## listen for ipv6
server_name localhost;
access_log /var/log/nginx/localhost.access.log;
location/{
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://127.0.0.1:6543;
}
En la aplicación de la pirámide la request.environ variable de [ 'REMOTE_ADDR'] es ahora siempre igual a 127.0.0.1. Veo algunas estrategias para resolver este problema, pero no sé si hay una manera recomendada de hacerlo.
Aquí es lo que estoy considerando:
añadir un suscriptor NewRequest que sustituye request.environ [ 'REMOTE_ADDR'] si es necesario:
if 'HTTP_X_REAL_IP' in event.request.environ: event.request.environ['REMOTE_ADDR'] = event.request.environ['HTTP_X_REAL_IP']
utilizan un middleware WSGI para modificar request.environ antes de golpear la capa de Pyramid.
algo más
¿Qué estrategia que utiliza para implementar aplicaciones de la pirámide? ¿Qué pasará si tengo dos proxys nginx? (el primero que sirve la LAN y el segundo una máquina directamente conectada a internet).
Debo haberme perdido algo porque primero probé con PrefixMiddleware como se sugiere en el libro de cocina, pero no funcionó. Obviamente necesito probarlo de nuevo. – ascobol
bien, resulta que olvidé insertar la sección [pipeline: main]. Todo funciona bien – ascobol