proxy_pass behavior

Maxim Dounin mdounin at mdounin.ru
Fri Mar 28 12:20:29 UTC 2014


Hello!

On Thu, Mar 27, 2014 at 08:18:48PM -0400, Jim Popovitch wrote:

> On Thu, Mar 27, 2014 at 1:50 PM, Jim Popovitch <jimpop at gmail.com> wrote:
> > On Thu, Mar 27, 2014 at 1:27 PM, Maxim Dounin <mdounin at mdounin.ru> wrote:
> >> Hello!
> >>
> >> On Thu, Mar 27, 2014 at 01:12:18PM -0400, Jim Popovitch wrote:
> >>
> >>> On Thu, Mar 27, 2014 at 12:59 PM, Maxim Dounin <mdounin at mdounin.ru> wrote:
> >>> > Hello!
> >>> >
> >>> > On Thu, Mar 27, 2014 at 12:29:03PM -0400, Jim Popovitch wrote:
> >>> >
> >>> >> Should proxy_pass retry ipv4 if ipv6 fails?   Currently (1.5.12), it
> >>> >> does not, and there is no way to force proxy_pass to always use ipv4.
> >>> >
> >>> > In no particular order:
> >>> >
> >>> > - The proxy_next_upstream is expected to retry by default.
> >>>
> >>> Yes, that works if the host name has 2 or more A  OR  2 or more AAAA
> >>> records.  proxy_next_upstream does not appear to transition to the
> >>> next protocol (i.e. from ipv4 to ipv6)
> >>
> >> It doesn't care about address family.  As long as connect() to
> >> one address fails, it will try next one.
> >
> > I will have to do some more tests, but so far 1.5.12 (debian wheezy)
> > does not appear to try the next one if the next one is a different
> > protocol family.
> 
> So here is what happens:
> 
> Nginx 1.5.12 on Debian Wheezy 7.4
> 
> ~$ host www.acadiau.ca
> www.acadiau.ca has address 131.162.201.18
> www.acadiau.ca has IPv6 address 2620:21:c000:c8:0:aca:d1a:18
> 
> ~$ grep proxy_pass /etc/nginx/sites-available/proxy
> proxy_pass https://www.acadiau.ca;
> 
> When an IPv6 client connects to the proxy, proxy_pass logs the error as
> 
> 2014/03/27 21:28:28 [alert] 24862#0: *158336 connect() failed (13:
> Permission denied) while connecting to upstream, client:
> 2604:180::82c6:fe9, server: proxy-service.tld, request: "GET /
> HTTP/1.1", upstream: "https://[2620:21:c000:c8:0:aca:d1a:18]:443/",
> host: "proxy-service.tld"
> 
> It will next try the ipv4 addr and succeed, however the reason for the

So the original claim that it "does not appear to try the next 
one" is withdrawn, right?

> "Permission denied" error appears to be the format of the URL (raw
> ipv6 addr, not hostname).  Why is it using the ipv6 addr instead of
> the hostname?

No, it's an error from connect() syscall, returned by your OS for 
some reason (likely because there is no route available, or due to 
a firewall rule).  The address is one of the upstream server nginx 
uses at the moment - it's is vital for logging if there are more 
than one address.

-- 
Maxim Dounin
http://nginx.org/



More information about the nginx-devel mailing list