AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 638367
Accepted
Synchro
Synchro
Asked: 2014-10-21 08:26:22 +0800 CST2014-10-21 08:26:22 +0800 CST 2014-10-21 08:26:22 +0800 CST

nginx 中是否需要单独的 IPv4 和 IPv6 监听指令?

  • 772

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

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

据我所知,这实现了完全相同的事情:

listen [::]:80 ipv6only=off;

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

nginx
  • 5 5 个回答
  • 83811 Views

5 个回答

  • Voted
  1. Jeff Widman
    2015-04-25T02:10:41+08:002015-04-25T02:10:41+08:00

    如果您使用单个 Nginx 实例托管多个虚拟主机域,则不能使用单个组合监听指令

    listen [::]:80 ipv6only=off;
    

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

    正如 Michael 提到的,从 Nginx 1.3.4 开始,ipv6only参数默认为on.

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

    listen 80;
    listen [::]:80; 
    

    此外,正如 Sander 所提到的,使用ipv6only=offIPv4 地址被转换为 IPv6 的缺点。如果您的应用针对 Akismet 或 StopForumSpam 等黑名单进行 IP 检查,这可能会导致问题,因为除非您构建反向转换层,否则您的应用将检查垃圾邮件发送者 IPv4 地址的 IPv6 转换,该地址与黑名单。

    • 85
  2. Best Answer
    Michael Hampton
    2014-10-21T08:32:13+08:002014-10-21T08:32:13+08:00

    如今,这可能是您使用前一种构造的唯一原因。

    您看到这种情况的原因可能是 nginx 1.3.4中的默认值已ipv6only更改。在此之前,它默认为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;
    
    • 66
  3. Sander Steffann
    2014-10-21T09:08:28+08:002014-10-21T09:08:28+08:00

    使用ipv6only=off配置样式,IPv4 地址可能会显示为 IPv6 地址,例如在日志文件、环境变量 (REMOTE_ADDR) 等中使用(仅软件) IPv4 映射的 IPv6 地址。

    • 17
  4. fevangelou
    2017-03-09T22:38:03+08:002017-03-09T22:38:03+08:00

    据我了解(并根据http://nginx.org/en/docs/http/ngx_http_core_module.html#listenlisten 80;上的文档),如果您希望在同一端口同时传输 IPv4 和 IPv6 流量,则使用 just就足够了。

    截至 2021 年 11 月的修订答案

    截至 2021 年 11 月,Nginx 最新(来自官方仓库),例如在 Ubuntu 18.04 或 20.04 上,我可以确认对于常规(=非默认)Nginx 虚拟主机,这适用于 IPv4 和 IPv6 流量:

    listen [::]:80;

    ...如果您对 HTTPS 流量使用单独的块:

    listen [::]:443 ssl http2;

    该ipv6only=off标志只能在 Nginx 的“默认”虚拟主机中引用一次(当没有域可以映射到虚拟主机时 Nginx 使用的虚拟主机)。

    例如:

    server {
        listen [::]:80 default_server ipv6only=off;
    
        # rest of your Nginx vhost config goes here...
    }
    
    server {
        listen [::]:443 default_server ssl http2 ipv6only=off;
    
        # rest of your Nginx vhost config goes here...
    }
    

    显然,如果您的 Nginx 设置使用单个 vhost,那么您只需要后一个配置。

    • 7
  5. Alexander Shcheblikin
    2020-03-24T13:23:45+08:002020-03-24T13:23:45+08:00

    在将 IPv6 支持添加到带有代码段的站点时遇到的一个讨厌的问题listen [::]:80 ipv6only=off;是,当我将它添加到 vhost 并且 default_server 已经配置为同时侦听 80和[::]:80.

    nginx拒绝启动,抱怨地址已被使用!

    listen [::]:80 ipv6only=off;用两条传统listen线替换魔法可以让nginx开始就好了。

    尽管listen [::]:80 ipv6only=off;在手动配置中可能很方便,但在自动配置系统中使用时可能会引起讨厌的麻烦。

    • 0

相关问题

  • Gzip 与反向代理缓存

  • nginx 作为代理的行为

  • Nginx 学习资源 [关闭]

  • 提供 70,000 个静态文件 (jpg) 的最佳方式?

  • 在 Apache、LightTPD 和 Nginx Web 服务器上提供 PHP 5.x 应用程序的现状?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve