5.安装Orber | 5. Installing Orber
5 安装Orber
5.1安装过程
本章介绍如何在Erlang环境中安装Orber。
制备
首先,您必须决定是否要将Orber作为一个:
单节点(非分布式)
- 与其他Orber实例和其他供应商提供的ORB的所有通信均使用OMG GIOP协议。
多节点(分布式)
- 同一个Orber节点domain
通过Erlang分发协议进行通信。对于所有其他Orber实例,即不属于domain
其他供应商的ORB的一部分,使用OMG GIOP协议。
使用哪种方法是高度特定于实现的,但是您应该考虑几件事情:
- Orber域中的所有节点都应该具有相同的安全级别。
- 如果容量大于负载(流量),单节点Orber可能是一个很好的解决方案。
- 在某些情况下,分布式系统架构需要单节点Orber安装。
- 多节点Orber使负载平衡成为可能,并创建了一个更容错的系统。如果使用分布式Mnesia表,则对象也可以具有统一的视图。
- 由于GIOP协议产生比Erlang分发协议更大的开销,因此与ORB间通信(GIOP)相比,在与同一Orber域内的对象进行通信时性能会更好。
您还必须决定是否希望Orber使用disc_copies
和/或存储内部数据ram_copies
。您应该选择哪种存储类型取决于您的应用程序中是否打算使用Mnesia。如果您打算使用,disc_copies
您必须先创建一个Mnesia模式,其中包含有关计划运行Orber的Erlang节点位置的信息。有关更多背景信息,请参阅Mnesia文档。
在某些情况下,绝对有必要更改Orber的默认配置。 例如,如果两个Orber-ORB应能够通过GIOP进行通信,则它们必须具有唯一的域域。 请参阅配置设置部分。 如果您遇到任何问题; 请参阅本用户指南中关于调试的章节。
跳跃启动Orber
启动Orber最简单的方法是使用orber:jump_start(Port),它启动一个带有(很可能)唯一域(即“IP-number:Port”)的单节点ORB。 此功能只能在开发和测试过程中使用。 对于任何其他情况,请按照以下各节所述安装并启动Orber。 侦听端口,即iiop_port配置参数,被设置为提供的端口。
警告
使用orber时,如何配置Orber:jump_start(端口)可能会随时更改而不会发出警告。 因此,此操作不得用于交付给客户的系统中。
安装单节点Orber
由于单个节点Orber通过OMG GIOP协议进行通信,所以不需要启动Erlang分发(即使用-name / -sname)。
如果我们用ram_copies
不需要创建基于磁盘的架构。只需使用:
erl> mnesia:start().
erl> corba:orb_init([{domain, "MyRAMSingleNodeORB"}]).
erl> orber:install([node()], [{ifr_storage_type, ram_copies}]).
erl> orber:start().
如果您需要安装disc_copies
您必须首先创建一个Mnesia模式。否则,安装与RAM安装类似:
erl> mnesia:create_schema([node()]).
erl> mnesia:start().
erl> corba:orb_init([{domain, "MyDiskSingleNodeORB"}]).
erl> orber:install([node()], [{ifr_storage_type, disc_copies},
{nameservice_storage_type, disc_copies}]).
erl> orber:start().
您仍然可以选择将IFR数据存储为ram_copies,但如果节点重新启动,则必须重新安装数据(即调用orber:install / 2)。 因此,由于IFR数据相当静态,您应该使用disc_copies。 有关更多信息,请参阅参考手册中的orber部分。
如果你不需要改变Orber的配置,你可以跳过orb_init/1
。但是,您至少应该
设置IIOP超时参数。
安装基于RAM的多节点ORBER
Orber使用Erlang分发协议。因此,您必须
首先启动它,例如使用:
hostA> erl -sname nodeA
在这个例子中,我们假设我们想要使用两个节点; nodeA和nodeB。 由于Mnesia必须知道哪些其他节点应作为发行版的一部分,因此我们需要添加Mnesia配置参数extra_db_nodes或使用mnesia:change_config / 2。 首先,我们必须在所有节点上启动Mnesia,然后才能安装Orber:
nodeA@hostA> mnesia:start().
nodeA@hostA> mnesia:change_config(extra_db_nodes,
[nodeA@hostA, nodeB@hostB]).
之后,我们必须首先确保两个节点将使用相同的域名,然后我们才能安装Orber:
nodeA@hostA> corba:orb_init([{domain, "MyRAMMultiNodeORB"}]).
nodeA@hostA> orber:install([nodeA@hostA, nodeB@hostB],
[{ifr_storage_type, ram_copies}]).
nodeA@hostA> orber:start().
请注意,您只能调用orber:install/1/2
在其中一个节点上。现在,我们可以在另一个节点上启动Orber:
nodeB@hostB> corba:orb_init([{domain, "MyRAMMultiNodeORB"}]).
nodeB@hostB> orber:start().
安装基于磁盘的多节点Orber
至于基于RAM的多节点Orber安装,必须启动Erlang分发(例如,erl -sname nodeA)。主要区别在于,当它是基于磁盘的时候,必须创建一个Mnesia模式:
nodeA@hostA> mnesia:create_schema([nodeA@hostA, nodeB@hostB]).
nodeA@hostA> mnesia:start().
在这个例子中,我们假设我们想要使用两个节点; nodeA
和nodeB
。由于无法在多个节点上创建模式。因此,我们所要做的就是启动Mnesia(即调用mnesia:start()
)nodeB
。
在所有节点上启动Mnesia之后,您必须确认所有节点具有相同的域名,然后才能安装Orber:
nodeA@hostA> corba:orb_init([{domain, "MyDiskMultiNodeORB"}]).
nodeA@hostA> orber:install([nodeA@hostA, nodeB@hostB],
[{ifr_storage_type, disc_copies}]).
nodeA@hostA> orber:start().
请注意,您只能调用orber:install/1/2
在其中一个节点上。现在,我们可以在另一个节点上启动Orber:
nodeB@hostB> corba:orb_init([{domain, "MyDiskMultiNodeORB"}]).
nodeB@hostB> orber:start().
5.2配置
必须正确配置Orber,以避免恶意攻击,并自动终止不再使用的IIOP连接。提取有关Orber的配置参数的信息的简单方法是调用操作orber:info/1/2
。Orber提供以下配置参数:
键值 | 范围 | 默认 |
---|---|---|
domain | string() | "ORBER" |
iiop_port | integer() >= 0 | 4001 |
nat_iiop_port | integer() > 0 | {local, integer(), {integer(), integer()}} | The same as iiop_port |
iiop_out_ports | 0 | {integer(),integer()} | 0 |
iiop_out_ports_attempts | integer() > 0 | 1 |
iiop_out_ports_random | true | false | false |
iiop_max_fragments | integer() > 0 | infinity | infinity |
iiop_max_in_requests | integer() > 0 | infinity | infinity |
iiop_max_in_connections | integer() > 0 | infinity |
iiop_backlog | integer() > 0 | 5 |
iiop_packet_size | integer() > 0 | infinity | infinity |
ip_address | string() | {multiple, string()} | All interfaces |
ip_address_local | string() | Defined by the underlying system |
nat_ip_address | string() | {multiple, string()} | {local, string(), {string(), string()}} | The same as ip_address |
objectkeys_gc_time | integer() > 0 | infinity | infinity |
giop_version | {1,0} | {1,1} | {1,2} | {1,1} |
iiop_setup_connection_timeout | integer() > 0 | infinity | infinity |
iiop_connection_timeout | integer() > 0 | infinity | infinity |
iiop_in_connection_timeout | integer() > 0 | infinity | infinity |
iiop_out_keepalive | true | false | false |
iiop_in_keepalive | true | false | false |
iiop_timeout | integer() > 0 | infinity | infinity |
interceptors | {native, atom()} | - |
local_interceptors | {native, atom()} | - |
orbInitRef | string() | undefined | undefined |
orbDefaultInitRef | string() | undefined | undefined |
orber_debug_level | 0 - 10 | 0 |
flags | integer() >= 0 | 0 |
iiop_acl | {atom(), string()} | [{atom(), string(), string()}] | [] |
secure | no | ssl | no |
ssl_generation | 2 | 3 | 2 |
iiop_ssl_port | integer() >= 0 | 4002 |
iiop_ssl_accept_timeout | integer() > 0 | infinity | infinity |
iiop_ssl_backlog | integer() > 0 | 5 |
iiop_ssl_ip_address_local | string() | Defined by the underlying system |
nat_iiop_ssl_port | integer() > 0 | {local, integer(), {integer(), integer()}} | The same as iiop_ssl_port |
ssl_server_options | list() | See the SSL application for valid options. |
ssl_client_options | list() | See the SSL application for valid options. |
iiop_ssl_out_keepalive | true | false | false |
iiop_ssl_in_keepalive | true | false | false |
表'Orber配置参数'的评论:
域
自Orber域
以来,它们应该通过IIOP进行通信,必须
拥有唯一的名称,如果两个域
具有相同的名称,则通信将失败。域
名可以不
包含^G
(ie \007
)。iiop_port
如果设置为0,操作系统将选择任何空闲端口。
注意:
在UNIX系统上,最好使IIOP端口高于1023,因为不推荐以root用户身份运行Erlang。
列表(IPv4或IPv6字符串)可能只包含一个
用于传出连接的地址。对于传入连接,接口列表可能包含多个IP字符串。如果设置为传出连接并授予访问权限,则Orber将在连接到服务器端ORB时使用该本地接口。对于传入连接,客户端ORB需要在本地使用其中一个
列出的接口。如果不这样做,访问将被拒绝。模块orber_acl
提供了用于评估过滤器和地址访问控制的操作。另请参阅接口配置
和防火墙配置
章节。
可以使用额外的超时参数调用操作:
erl> module_interface:function(ObjRef, Timeout, ..Arguments..).
erl> module_interface:function(ObjRef, [{timeout, Timeout}], ..Arguments..).
erl> module_interface:function(ObjRef, ..Arguments..).
额外的超时参数将覆盖配置参数。iiop_timeout
然而,它是不可能使用的。infinity
若要重写超时参数,请执行以下操作。超时值选项对于驻留在同一Orber域中的对象也是有效的。
iiop_setup_connection_timeout
,iiop_timeout
,iiop_connection_timeout
和iiop_in_connection_timeout
应该使用的变量。指定的值是实现特定的,即,WAN或LAN,但他们应该从范围iiop_setup_connection_timeout
到iiop_connection_timeout
。
要在配置文件中更改这些设置,-config
必须将该标志添加到erl命令中。有关更多信息,请参阅参考手册config(4)
。这些值也可以在启动时作为选项单独发送到Erlang节点,有关详细信息,请参阅参考手册erl(1)
。
Orber环境旗
将Environment Flags
允许用户激活调试设备或更改Orber的行为。后者可能会导致Orber不再符合OMG标准,当与不符合要求的ORB通信时,这可能是必需的。
Hexadecimal Value | OMG Compliant | Description |
---|---|---|
0001 | no | Exclude CodeSet Component |
0002 | yes | Local Typechecking |
0004 | yes | Use Host Name in IOR |
0008 | yes | Enable NAT |
0020 | yes | Local Interceptors |
0080 | yes | Light IFR |
0100 | yes | Use IPv6 |
0200 | yes | EXIT Tolerance |
0400 | yes | Enable Incoming ACL |
0800 | yes | Enable Outgoing ACL |
1000 | yes | Use Current Interface in IOR |
可以使用上述标志的任何组合,并将行为更改如下:
排除代码集组件
-指示Orber排除导出IOR:s中的CodeSet组件。激活时,客户端和服务器之间不会就字符和宽字符转换进行协商。如果IDL规范包含数据类型wchar和/或wstring,此标志很可能会导致问题。
本地Typechecking
- 如果激活,将检查参数,回复和引发的异常,以确保数据正确。如果发生错误,error_logger
则用于生成报告。由于额外的开销,一个人可能不会
使用此选项来交付系统。由于这个选项激活用于在目标节点上产生的所有对象类型检查,但也可以使用的选项{local_typecheck, boolean()}
,调用时oe_create/2
,oe_create_link/2
,corba:create/4
或corba:create_link/4
,以覆盖配置参数。
在IOR中使用主机名
-通常Orber在输出ior:s中插入IP-号。在某些情况下,这将导致客户端打开两个连接而不是一个连接。
启用NAT
-如果此标志设置,就可以使用NAT(网络地址转换)配置参数(nat_iiop_port
,nat_iiop_ssl_port
和nat_ip_address
)。
本地拦截器
-使用拦截器进行本地调用。
轻型IFR
-如果没有显式使用IFR,并且设置了此标志,Orber将使用最小的IFR来减少内存使用和安装时间。
使用IPv 6
-当激活此选项时,Orber将使用IPv6
进行跨兽人通讯。
出口公差
-即使回叫模块导致退出,服务器也会存活下来。
启用传入ACL
-激活传入连接的访问控制。
启用传出ACL
-激活对传出连接的访问控制。
在IOR中使用当前接口
-设置后,Orber将将请求通过的接口添加到导出的本地IOR:s。
调用操作orber:info/1/2
将以可读的方式显示当前设置的标志。
5.3防火墙配置
防火墙用于保护对象与其他网络或子网络中的客户端,但也限制内部对象可能连接到的主机(即inbound protection
和outbound protection
)。防火墙可以根据以下条件限制访问:
运输水平
-根据TCP标头中的地址信息执行访问控制决策。
应用水平
-了解GIOP消息和支持的特定传输级ORB协议,例如IIOP。
本节描述如何配置Transport Level
防火墙。它必须事先了解源到目标映射,并且在概念上有一个包含表单元组的配置表:{inhost:inport}, {outhost:outport})如
果没有端口限制,那么配置防火墙是相当容易的。否则,我们必须考虑下列备选办法:
传入请求
-Orber只使用配置参数指定的端口号。iiop
[医]
港
和iiop
[医]
SSL
[医]
港
其他ORB%27可能使用多个端口,但应该可以更改此行为。请参阅其他ORB文档。
传出请求
- 包括Orber在内的绝大多数ORB,要求操作系统在连接到服务器端ORB时提供空闲的本地端口。使用Orber时可以改变这种行为(即设置配置参数iiop_out_ports
)。
警告
使用该选项iiop_out_ports
可能会导致Orber用完有效端口号。例如,其他应用程序可能会窃取某些端口,或者到其他ORB的并发传出连接数可能会高于预期。减少但不能消除你应该使用的风险iiop_connection_timeout
。
防火墙配置示例:
# "Plain" IIOP
To: Orber-IPNo:(iiop_port) From: ORB-IPNo:X
To: ORB-IPNo:Z From: Orber-IPNo:(iiop_out_ports | Any Port)
# IIOP via SSL
To: Orber-IPNo:(iiop_port) From: ORB-IPNo:X
To: Orber-IPNo:(iiop_ssl_port) From: ORB-IPNo:Y
To: ORB-IPNo:Z From: Orber-IPNo:(iiop_out_ports | Any Port)
如果通过TCP Firewall with NAT
(网络地址转换)进行通信,我们必须激活此行为并定义外部地址和/或端口。
图5.1:带有NAT的tcp防火墙
使用NAT可以为不同的网络域使用不同的主机数据。这样我们就可以共享Internet协议地址资源或模糊资源。要启用此功能的Enable NAT
标志必须设置和nat_iiop_port
,nat_iiop_ssl_port
和nat_ip_address
配置,其映射到iiop_port
,iiop_ssl_port
和ip_address
分别。因此,必须将防火墙配置为正确地将外部转换为内部表示。如果这些NAT参数分配了单个端口号或IP地址,则只有在将IOR导出到另一个ORB时才会使用这些参数。何时ip_address
设置为{multiple, [IPAddress]}
,nat_ip_address
应该以相同的方式进行配置,以便防火墙可以将每个NAT IP地址转换为有效地址。如果对象应该可以通过不同的接口和端口访问,另请参阅Interface Configuration
选项{local, DefaultNATIPAddress, [{IPAddress, NATIPAddress}]}
和/或{local, DefaultNATPort, [{Port, NATPort}]}
应用。默认的NAT IP地址和端口应由ip_address_local
防火墙转换为值和默认监听端口。如果在列表中未找到IP地址和/或端口,则默认值将被插入到IOR中。防火墙必须能够正确翻译这些内容。
如果有必要限制对安全网络内的ORB的访问,但同一主机上运行的其他应用程序可能未被阻止,则可以使用应用程序级
防火墙或Orber访问控制列表(ACL)。后者使得用户可以用Orber定义哪些主机可以作为服务器或客户端进行通信。这是通过定义配置参数来实现的iiop_acl
。无类别域间路由(CIDR)Filter
确定哪个对等接口和另一个ORB可能使用的端口。
Filter | Peer Interface(s) | Peer Port(s) |
---|---|---|
"10.1.1.1" | 10.1.1.1 | any |
"10.1.1.1/8" | 10.0.0.0-10.255.255.255 | any |
"10.1.1.1/8#4001" | 10.0.0.0-10.255.255.255 | 4001 |
"10.1.1.1/8#4001/5001" | 10.0.0.0-10.255.255.255 | 4001-5001 |
Orber ACL也允许用户定义可以使用哪个本地接口,但不会检测到spoofing
。该操作orber_acl:match/2/3
可以轻松验证访问是否被授予。例如,如果Orber将以ACL启动[{tcp_out, "10.1.1.1/8#4001/5001"}]
,那么其orber_acl:match/2
行为如下:
erl> orber_acl:match{11,1,1,1}, tcp_out).
false
erl> orber_acl:match{10,1,1,1}, tcp_out).
true
erl> orber_acl:match{11,1,1,1}, tcp_out, true).
{false,[],0}
erl> orber_acl:match{10,1,1,1}, tcp_out, true).
{true,[],{4001,5001}}
只有当返回的布尔值为真时,额外的返回值才会有所不同。在上面的示例中,{true,[],{4001,5001}}
意思是"10.1.1.1"
如果服务器端ORB在4001-5001范围内的端口上侦听传入连接请求,则Orber可以使用任何本地接口连接到。请注意,调用该orber_acl:match/2/3
操作不会导致Orber发起连接尝试。原因是,这个函数可能用于活动节点以及测试环境。因此,如果本地接口当前不可用或通过给定主机/端口没有可用的服务器端ORB,Orber将不会检测到该接口。
5.4接口配置
在许多情况下,只要简单地配置底层操作系统,就可以为所有应用程序使用本地接口。但是,在某些情况下,由于防火墙配置等原因,需要为不同的应用程序使用不同的本地接口。有时,甚至有必要为单个CORBA对象使用特定的接口。本节描述了如何以不同的方式改变这种情况。
默认行为是Orber让OS配置决定将在IOR中添加哪个接口:s导出到另一个ORB,以及连接到另一个ORB时使用的本地接口(Orber充当客户端ORB)。后者可以通过设置配置参数iiop_ssl_ip_address_local
和/或ip_address_local
通过SSL和IIOP分别影响IIOP 来覆盖。这些参数可以通过使用Orber通用interface
上下文或定义ACL(访问控制列表)来覆盖。如果包含本地接口(例如[{tcp_out, "10.0.0.0/8", ["10.0.0.1"]}]
),后者总是优先。如果接口被排除(例如[{tcp_out, "10.0.0.0/8"}]
),所选择的接口将,按照以下顺序,可以通过确定#'IOP_ServiceContext'{}
,ip_address_local/iiop_ssl_ip_address_local
底层系统的配置或。
为生成的存根/骨架添加接口上下文的方法如下:
Ctx = #'IOP_ServiceContext'{context_id = ?ORBER_GENERIC_CTX_ID,
context_data = {interface, "10.0.0.1"}},
'CosNaming_NamingContext':resolve(NS, [{context, [Ctx]}], Name),
也可以将上下文添加到corba:string_to_object/2, corba:resolve_initial_references/2, corba:resolve_initial_references_remote/3, corba:list_initial_services_remote/2, corba_object:not_existent/2, corba_object:non_existent/2
和corba_object:is_a/3
。corba_object
如果提供的IOR是外部的,则导出的操作会受到影响。corba:string_to_object/2
如果传递一个corbaloc
或一个corbaloc
字符串(参见INS
本章),该函数可能需要接口上下文,corba:resolve_initial_references_remote/3
而且corba:list_initial_services_remote/2
始终连接到另一个ORB,并且可能需要添加上下文。corba
如果通过设置orbInitRef
和/或orbDefaultInitRef
配置参数重新调用呼叫,则其余操作将受到影响。有关更多信息,请参阅每个模块的参考手册。
配置将IOR导出到另一个ORB时应使用哪个接口由nat_ip_address
设置标志16#1000
和ip_address
顺序决定。Orber通过所有接口或由其定义的接口来监听传入连接ip_address
。使用orber:add_listen_interface/2/3
和可以添加和删除额外的监听接口orber:remove_listen_interface/1
。在这种情况下,应设置16#1000标志,并在必要时设置配置参数{local, DefaultNATIPAddress, [{IPAddress, NATIPAddress}]}
和/或{local, DefaultNATPort, [{Port, NATPort}]}
。