查看源码 Inet 配置

简介

本节描述了 Erlang 运行时系统如何配置 IP 通信。它还解释了如何通过配置文件根据您的需求进行配置。这些信息主要适用于有特殊配置需求或问题的用户。通常,Erlang 在正确配置 IP 的平台上正常运行不需要特定的设置。

当 Erlang 启动时,它会读取 Kernel 变量 inetrc,如果定义了该变量,则用于指定用户配置文件的位置和名称。例如

% erl -kernel inetrc '"./cfg_files/erl_inetrc"'

请注意,早期 Erlang/OTP 版本支持的 .inetrc 文件现在已经过时。

指定配置文件的第二种方法是将环境变量 ERL_INETRC 设置为文件的完整名称。例如 (bash)

% export ERL_INETRC=./cfg_files/erl_inetrc

请注意,Kernel 变量 inetrc 会覆盖此环境变量。

如果未指定用户配置文件,并且 Erlang 在非分布式或短名称分布式模式下启动,Erlang 将使用默认配置设置和在大多数情况下都能正常工作的本机查找方法。在这些模式下,Erlang 不会从系统 inet 配置文件(例如 /etc/host.conf/etc/nsswitch.conf)读取任何信息,除了 /etc/resolv.conf/etc/hosts,这些文件会在 Unix 平台上被读取并监控其更改,以便用于内部 DNS 客户端 inet_res

如果 Erlang 在长名称分布式模式下启动,它需要从某个地方获取域名,并读取系统 inet 配置文件以获取此信息。找到的任何主机和解析器信息也会被记录,但只要 Erlang 配置为本机查找,就不会使用这些信息。如果查找方法更改为 'file''dns',这些信息将变得有用,请参见下文。

本机查找(系统调用)始终是默认的解析器方法。这适用于所有平台,除了 OSE Delta,其中使用 'file''dns'(按优先级顺序)。

在 Windows 平台上,Erlang 在长名称分布式模式下启动时会搜索系统注册表,而不是查找配置文件。

配置数据

如果在系统 inet 配置文件(或系统注册表)中找到以下数据,Erlang 会将其记录在本地数据库中:

  • 主机名和主机地址
  • 域名
  • 名称服务器
  • 搜索域
  • 查找方法

这些数据也可以在用户配置文件中显式指定。此文件包含配置参数行(每个参数都以句点结尾)。某些参数向配置添加数据(例如主机和名称服务器),其他参数则覆盖任何先前的设置(例如域名和查找)。用户配置文件始终在配置过程的最后进行检查,这使得用户可以覆盖任何默认值或先前进行的设置。调用 inet:get_rc() 可以查看 inet 配置数据库的状态。

有效的配置参数如下:

  • {file, Format, File}.
      Format = atom()
      File = string()

    指定 Erlang 要从中读取配置数据的系统文件。Format 告诉解析器如何解释该文件。

    • resolv (Unix resolv.conf)
    • host_conf_freebsd (FreeBSD host.conf)
    • host_conf_bsdos (BSDOS host.conf)
    • host_conf_linux (Linux host.conf)
    • nsswitch_conf (Unix nsswitch.conf)
    • hosts (Unix hosts)

    File 指定带有完整路径的文件名。

  • {resolv_conf, File}.
      File = string()

    指定 Erlang 要从中读取内部 DNS 客户端 inet_res 的解析器配置的系统文件,并监控其更改,即使该文件不存在。路径必须是绝对路径。

    这可以覆盖配置参数 nameserversearch,具体取决于指定文件的内容。它们还可以在未来随时更改,以反映文件内容。

    如果该文件被指定为空字符串 "",则不会读取或监控任何文件。这模拟了在短名称分布式模式下启动节点时不配置 DNS 客户端的旧行为。

    如果未指定此参数,则默认值为 /etc/resolv.conf,除非设置了环境变量 ERL_INET_ETC_DIR,该环境变量将此文件的目录定义为除 /etc 以外的其他目录。

  • {hosts_file, File}.
      File = string()

    指定 Erlang 要从中读取内部 hosts 文件解析器的解析器配置的系统文件,并监控其更改,即使该文件不存在。路径必须是绝对路径。

    当使用查找选项 file 时,在上面使用 {file, hosts, File} 添加或在下面使用 {host, IP, Aliases} 添加的所有主机条目之后,将搜索这些主机条目。

    如果该文件被指定为空字符串 "",则不会读取或监控任何文件。这模拟了在短名称分布式模式下启动节点时不配置 DNS 客户端的旧行为。

    如果未指定此参数,则默认值为 /etc/hosts,除非设置了环境变量 ERL_INET_ETC_DIR,该环境变量将此文件的目录定义为除 /etc 以外的其他目录。

  • {registry, Type}.
      Type = atom()

    指定 Erlang 要从中读取配置数据的系统注册表。win32 是唯一有效的选项。

  • {host, IP, Aliases}.
      IP = tuple()

    Aliases = [string()]

    将主机条目添加到主机表。

  • {domain, Domain}.
      Domain = string()

    设置域名。

  • {nameserver, IP [,Port]}.
      IP = tuple()
      Port = integer()

    添加要用于 inet_res 的主名称服务器的地址(以及端口,如果不是默认端口)。

  • {alt_nameserver, IP [,Port]}.
      IP = tuple()
      Port = integer()

    添加用于 inet_res 的辅助名称服务器的地址(以及端口,如果不是默认端口)。

  • {search, Domains}.
      Domains = [string()]

    inet_res 添加搜索域。

  • {lookup, Methods}.
      Methods = [atom()]

    指定查找方法以及尝试它们的顺序。有效的方法如下:

    • native(使用系统调用)
    • file(使用从系统配置文件和/或用户配置文件中检索的主机数据)
    • dns(使用 Erlang DNS 客户端 inet_res 进行名称服务器查询)

    查找方法 string 尝试将主机名解析为 IPv4 或 IPv6 字符串,并返回生成的 IP 地址。当 native 不在 Methods 列表中时,会自动首先尝试此方法。要在此情况下跳过它,可以将伪查找方法 nostring 插入 Methods 列表中的任何位置。

  • {cache_size, Size}.
      Size = integer()

    设置 dns 查找的解析器缓存大小。 native 查找不会被缓存。默认为 100 个 DNS 记录。

  • {cache_refresh, Time}.
      Time = integer()

    设置 inet_res 的解析器缓存刷新频率(以毫秒为单位)(即,删除过期的 DNS 记录)。默认为 1 小时。

  • {timeout, Time}.
      Time = integer()

    设置 inet_res 发出的 DNS 查询的重试等待时间(以毫秒为单位)。默认为 2 秒。

  • {retry, N}.
      N = integer()

    设置 inet_res 在放弃之前将尝试的 DNS 查询次数。默认为 3。

  • {servfail_retry_timeout, Time}.
      Time = non_neg_integer()

    在尝试所有名称服务器后,会有一个超时时间,然后再次尝试名称服务器。这是为了防止服务器使用 servfail 缓存中的内容回答查询,inet_res。默认为 1500 毫秒。

  • {inet6, Bool}.
      Bool = true | false

    告诉 DNS 客户端 inet_res 查找 IPv6 地址。默认为 false

  • {usevc, Bool}.
      Bool = true | false

    告诉 DNS 客户端 inet_res 使用 TCP(虚拟电路)而不是 UDP。默认为 false

  • {edns, Version}.
      Version = false | 0

    设置 inet_res 将使用的 EDNS 版本。唯一允许的版本是零。默认为 false,这意味着不使用 EDNS。

  • {udp_payload_size, Size}.
      N = integer()

    设置 inet_res 将在 EDNS 查询中通告的允许的 UDP 有效负载大小。还设置了当 DNS 查询被认为对于 UDP 来说太大而强制使用 TCP 查询时的限制;这并不完全正确,因为应该使用各个名称服务器通告的 UDP 有效负载大小,但是在实现更智能的(探测、缓存)算法之前,这种简单的策略就足够了。默认为 1280,这源于标准的以太网 MTU 大小。

  • {udp, Module}.
      Module = atom()

    告诉 Erlang 使用另一个原始 UDP 模块而不是 inet_udp

  • {tcp, Module}.
      Module = atom()

    告诉 Erlang 使用另一个原始 TCP 模块而不是 inet_tcp

  • clear_hosts.

    清除主机表。

  • clear_ns.

    清除已记录的名称服务器列表(主名称服务器和辅助名称服务器)。

  • clear_search.

    清除搜索域列表。

用户配置示例

假设用户不希望 Erlang 使用本机查找方法,而是希望 Erlang 从一开始就读取所有必要的信息,并将其用于解析名称和地址。如果查找失败,Erlang 将从名称服务器请求数据(使用 Erlang DNS 客户端,设置为使用 EDNS 允许更大的响应)。当其配置文件更改时,解析器配置会更新。此外,DNS 记录永远不会被缓存。用户配置文件(在此示例中命名为 erl_inetrc,存储在目录 ./cfg_files 中)可以如下所示(Unix):

%% -- ERLANG INET CONFIGURATION FILE --
%% read the hosts file
{file, hosts, "/etc/hosts"}.
%% add a particular host
{host, {134,138,177,105}, ["finwe"]}.
%% do not monitor the hosts file
{hosts_file, ""}.
%% read and monitor nameserver config from here
{resolv_conf, "/usr/local/etc/resolv.conf"}.
%% enable EDNS
{edns,0}.
%% disable caching
{cache_size, 0}.
%% specify lookup method
{lookup, [file, dns]}.

Erlang 可以例如按以下方式启动:

% erl -sname my_node -kernel inetrc '"./cfg_files/erl_inetrc"'