Vladimir
Vladimir

Reputation: 241

Get client's real ip behind upstream

How to get client's ip behind upstream in nginx?

Now I use next configs:

# upstream listener

upstream ts {
        server localhost:841 weight=10 max_fails=3 fail_timeout=10s;
        server 10.1.3.209:8080 backup;
}

# server listener

server {
        listen 80;
        server_name 10.9.24.45;

        location / {
                proxy_pass http://ts;
                proxy_set_header Host $host;
                proxy_set_header X-Real_IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
}

# app listener

server {
        listen 841;
        server_name localhost;

        charset utf-8;

        access_log /var/log/nginx/access_ts.log;
        error_log /var/log/nginx/error_ts.log;

        client_max_body_size 16M;

        set $www /www;
        set $root $www/apps/ts/ROOT;

        include /etc/nginx/sites-available/locations;

        location / {
                proxy_pass http://localhost:840;
                proxy_set_header Host $host;
                proxy_set_header X-Real_IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                include /etc/nginx/sites-available/location-config;
        }
}

In my java app I use X-Real_IP header to get client's ip and all were fine, but after I start use another config with upstream I see only 127.0.0.0. Think this correct, but I need to get a real ip for my app.

How can I get a real ip behind nginx upstream?

I see some answers like proxy_set_header realip $remote_addr, but what can I do without my java app change.

Upvotes: 0

Views: 1657

Answers (1)

matanco
matanco

Reputation: 2129

i had the same issue, the problem is the header you forward change

proxy_set_header Host $host;
proxy_set_header X-Real_IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

Into:

proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host; 

Upvotes: 1

Related Questions