How to disable ipv6 in nginx?
Maxim Dounin
mdounin at mdounin.ru
Thu Nov 15 14:24:09 UTC 2018
Hello!
On Thu, Nov 15, 2018 at 11:10:08AM +0000, rough lea wrote:
> I am a newbie running tusd server on macos High Sierra behind an
> Nginx Proxy running within a docker container. In the logs, I
> notice that before an _UploadCreated_ event is received there is
> an attempt to connect to tusd using ipv6 loopback address which
> fails.
>
> _[crit] 23#23: *4 connect() to [::1]:1080 failed (99: Address not available) while connecting to upstream, client: 172.22.0.1, server: , request: "POST /files/ HTTP/1.1", upstream: "http://[::1]:1080/files/", host: "test.example.com:1081"_
>
> My nginx configuration is listed below…..
[...]
> proxy_pass http://localhost:1080/files/;
[...]
> If I take out the line, _listen
> [::]:1081 http2 ipv6only=on ssl;_ from the server config block,
> the issue still occurs.
The error is about connecting to "[::1]:1080" backend, as per
proxy_pass in your configuration. Adding or removing listening
sockets in nginx is not expected change things.
> Upon further reading at
> [docker](https://docs.docker.com/config/daemon/ipv6/) and
> [docker-for-mac](https://github.com/docker/for-mac/issues/1432),
> it appears that ipv6 networking is only available for docker
> daemons running on Linux hosts???
The error (Address not available) suggests that this is indeed an
issue in Docker.
> I have tried adding a resolver and setting ipv6only=off but
> nginx seems to continue to try and send to the upstream proxy
> with an ipv6 address.
When a name is known during configuration parsing, nginx will
use normal system-provided name resolution, as available via
the getaddrinfo() function.
A resolver is only used once nginx does a run-time resolution of
domain names, and cannot use getaddrinfo() as the interface is
blocking.
> How can I get nginx to use ipv4 only? Has anybody else
> experienced and resolved the same issue?
The is no way to globally disable IPv6 in nginx. Instead,
consider one of the following options:
- when you want nginx to use IPv4 addresses only, use names which
resolve to IPv4 addresses only (or use IPv4 addresses directly);
- configure your system resolver to do not return IPv6 addresses
(usually this happens automatically when you do not have IPv6
configured on the host).
In your particular case, writing something like
proxy_pass http://127.0.0.1:8080/files/;
with "127.0.0.1" IPv4 address explicitly used instead of
"localhost" should be enough.
--
Maxim Dounin
http://mdounin.ru/
More information about the nginx
mailing list