Ho un'applicazione Pyramid che utilizza request.environ['REMOTE_ADDR']
in alcuni punti.Come ottenere l'IP reale di un client in un server piramidale dietro un proxy nginx
L'applicazione è servita da Python Paste sulla porta 6543 e un server nginx in ascolto sulla porta 80 sta inoltrando le richieste al server Paste.
La configurazione nginx è ispirato al libro di cucina Piramide:
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;
}
Nell'applicazione Piramide del request.environ variabile [ 'REMOTE_ADDR'] è ora sempre uguale a 127.0.0.1. Vedo alcune strategie per risolvere questo problema, ma non so se esiste un modo consigliato per farlo.
Ecco quello che sto valutando:
aggiungere un abbonato NewRequest che sostituisce request.environ [ 'REMOTE_ADDR'], se necessario:
if 'HTTP_X_REAL_IP' in event.request.environ: event.request.environ['REMOTE_ADDR'] = event.request.environ['HTTP_X_REAL_IP']
utilizzare un middleware WSGI per modificare request.environ prima di colpire il livello Pyramid.
qualcos'altro
Quale strategia si usa per la distribuzione di applicazioni piramide? Cosa succede se ho due proxy nginx? (il primo serve la LAN e un secondo uno una macchina collegata direttamente a Internet).
Devo aver perso qualcosa perché ho provato per la prima volta con PrefixMiddleware come suggerito nel ricettario ma non ha funzionato. Ho davvero bisogno di provarlo di nuovo. – ascobol
ok si scopre che ho dimenticato di inserire la sezione [pipeline: main]. Tutto funziona bene – ascobol