您是否需要在Nginx中使用单独的IPv4和IPv6监听指令?


71

我已经看到了用于在nginx上处理双栈IPv4和IPv6虚拟主机的各种配置示例。许多人建议这种模式:

listen 80;
listen [::]:80 ipv6only=on;

据我所知,这实现了与以下功能完全相同的功能:

listen [::]:80 ipv6only=off;

为什么要使用前者?我能想到的唯一原因是,您是否需要特定于每种协议的其他参数,例如,如果您只想deferred在IPv4上进行设置。


与IP堆栈版本无关,它是TCP选项。
Xavier Lucas

1
可以,但是您可以在listen指令中进行设置,并且该选项适用于每个host:port对。
同步2014年

哼,我真的无法想象您会想要这样做的情况。我认为唯一的原因是历史,而迈克尔·汉普顿(Michael Hampton)则将其钉牢。
Xavier Lucas

Answers:


48

最近,这可能您使用前一种构造的唯一原因。

您看到此信息的原因可能ipv6onlynginx 1.3.4 中的default 更改。在此之前,它默认为off;。在较新的版本中,默认为on

碰巧会与Linux上的IPV6_V6ONLY套接字选项以及其他操作系统(默认值不一定可预测)上的类似选项进行交互。因此,1.3.4之前的版本需要使用之前的构造,以确保您实际上正在侦听IPv4和IPv6上的连接。

更改为nginx默认值ipv6only可确保双堆栈套接字的操作系统默认值不相关。现在,nginx要么显式绑定到IPv4,IPv6或两者都绑定,从不依赖于操作系统来默认创建双栈套接字。

实际上,我在1.3.4之前的标准nginx配置具有第一个配置,而在1.3.4之后的配置均具有第二个配置。

但是,由于绑定双堆栈套接字是仅Linux的事情,所以我现在的配置现在看起来更像第一个示例,但没有ipv6only设置:

listen [::]:80;
listen 80;

4
像OpenBSD一样,某些操作系统根本不使用双ipv4和ipv6套接字,因此您将不得不收听两次。
贾斯汀·科马克

@JustinCormack是的,您是对的,并且我已经考虑了一段时间。直到现在才更新此帖子。
迈克尔·汉普顿

1
listen localhost:8080;似乎同时听(1.12.2)和使用proxy_pass http://localhost:8080将负载平衡在:: 1和127.0.0.1之间-我必须为ipv6添加一行以获取日志中的真实ipset_real_ip_from 127.0.0.1; set_real_ip_from ::1; real_ip_header X-Forwarded-For;
Antony Gibbs,

65

如果使用单个Nginx实例托管多个vhost域,则不能使用单个组合的listen指令

listen [::]:80 ipv6only=off;

为他们每个人。Nginx有一个奇怪的怪癖,您只能ipv6only为每个端口指定一次参数,否则它将无法启动。这意味着您不能为每个虚拟主机域服务器块指定它。

如Michael所述,从Nginx 1.3.4开始,该ipv6only参数默认为on

因此,如果要使用单个Nginx服务器在IPv4和IPv6上托管多个域,则必须为每个域服务器块使用两个侦听指令:

listen 80;
listen [::]:80; 

另外,如Sander所述,使用ipv6only=off具有将IPv4地址转换为IPv6的缺点。如果您的应用程序针对Akismet或StopForumSpam之类的黑名单进行IP检查,这可能会导致问题,因为除非您在反向转换层中进行构建,否则您的应用程序将检查垃圾邮件发送者的IPv4地址的IPv6转换,该IPv6地址将与垃圾邮件发送者中的任何IPv4地址都不匹配黑名单。


2
是的,这与我关于about deferred和其他按协议的指令所提到的相同。如果由于您所说的原因而可以将它们与listen指令分开指定,这将很有用。
同步2015年

1
问题的核心是,您需要为每个域分别指定listen指令。否则会发生什么?该站点可以通过ipv4和ipv6正常运行,它将显示nginx欢迎页面。ROFL
银月

2
感谢您的详尽解释!当我ipv6only=off为同一端口指定两次时,我得到一个令人困惑的错误。您的答案解决了问题!

1
此外,如果你想使用2个虚拟主机都听了443: listen 443; listen [::]:443;。使用listen [::]:80 ipv6only=off;将抛出nginx错误,表明该端口已在使用中
lukeaus 16'7


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.