檢視原始碼 Inet 設定
簡介
本節說明如何為 IP 通訊設定 Erlang 執行時系統。它也說明如何透過組態檔來依您的需求進行設定。此資訊主要適用於有特殊設定需求或問題的使用者。在正確設定 IP 的平台上,通常不需要特別設定 Erlang 才能正常運作。
當 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 會在以長名稱分散式模式啟動時搜尋系統登錄,而不是尋找設定檔。
設定資料
如果 Erlang 在系統 inet
設定檔(或系統登錄)中找到以下資料,則會在本地資料庫中記錄:
- 主機名稱和主機位址
- 網域名稱
- 名稱伺服器
- 搜尋網域
- 查找方法
這些資料也可以在使用者設定檔中明確指定。此檔案應包含設定參數行(每行都以句點終止)。某些參數會將資料新增至設定(例如主機和名稱伺服器),其他參數會覆蓋任何先前的設定(例如網域和查找)。使用者設定檔始終在設定過程中最後檢查,使用者可以藉此覆蓋任何預設值或先前所做的設定。呼叫 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
的解析器設定的系統檔案,並監控變更,即使它不存在。路徑必須是絕對路徑。這可以覆蓋設定參數
nameserver
和search
,具體取決於指定檔案的內容。它們也可能在未來隨時變更,以反映檔案內容。如果將檔案指定為空字串
""
,則未來不會讀取或監控任何檔案。這會模擬在節點以短名稱分散式模式啟動時,不設定 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 位址。當Methods
清單中不包含native
時,會自動先嘗試此方法。若要在此情況下跳過它,則可以在Methods
清單中的任何位置插入虛擬查找方法nostring
。{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"'