nginx not setting REMOTE_ADDR properly?

Mohammad Kolahdouzan mohammad_ysm at
Thu Mar 5 20:18:11 MSK 2009

It is working perfectly fine now, thanks. 

I was originally using $http_remote_addr since I noticed in the source code that any variable that starts with "http_" will have nginx retireve the variable from the headers_in, and also noticed that remote_addr is reserved to hold the IP of the actual connection which in my case, would naturally return the IP of the load balancer. But it didn't work when the "underscores_in_headers on" flag was not specified in the config file. 

So out of curiosity, if there is any variable in the header that is already reserved by nginx for another purpose, e.g., remote_port, we should use this underscores_in_headers to retrieve it, or did it work simply because the header had a underscore in it (i.e., REMOTE_ADDR) and the headers normally don't have underscores and the lack of the flag was causing Nginx to consider REMOTE_ADDR to be an invaluid header and ignore it?

Thanks for the help,

From: Igor Sysoev <is at>
To: nginx at
Sent: Thursday, March 5, 2009 7:29:13 AM
Subject: Re: nginx not setting REMOTE_ADDR properly?

On Wed, Mar 04, 2009 at 06:52:50PM -0800, Mohammad Kolahdouzan wrote:

> My nginx is getting requests through a (NetScaler) load balancer, and $remote_addr is returning the load balancer's IP and not the real user's IP (which the load balancer sets as REMOTE_ADDR in the header). Any other attribute I should use to get the real user's IP?

You should use $http_remote_addr and set:

  server {
      underscores_in_headers  on;

Igor Sysoev

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <>

More information about the nginx mailing list