Nagios各独立配置文件详细介绍

简介:

以下介绍各配置文件的详细情况

查看安装正文请点击此处

a. templates.cfg文件

    nagios主要用于监控主机资源以及服务,在nagios配置中称为对象,为了不必重复定义一些监控对象,Nagios引入了一个模板配置文件,将一些共性的属性定义成模板,以便于多次引用。这就是templates.cfg的作用。

下面详细介绍下templates.cfg文件中每个参数的含义:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
define contact{
         name                            generic-contact    ; 联系人名称
         service_notification_period     24x7               ; 当服务出现异常时,发送通知的时间段,这个时间段 "24x7" 在timeperiods.cfg文件中定义
         host_notification_period        24x7               ; 当主机出现异常时,发送通知的时间段,这个时间段 "24x7" 在timeperiods.cfg文件中定义
         service_notification_options    w,u,c,r            ; 这个定义的是“通知可以被发出的情况”。w即warn,表示警告状态,u即unknown,表示不明状态;
                                                            ; c即criticle,表示紧急状态,r即recover,表示恢复状态;
                                                            ; 也就是在服务出现警告状态、未知状态、紧急状态和重新恢复状态时都发送通知给使用者。
         host_notification_options       d,u,r                   ; 定义主机在什么状态下需要发送通知给使用者,d即down,表示宕机状态;
                                                                 ; u即unreachable,表示不可到达状态,r即recovery,表示重新恢复状态。
         service_notification_commands   notify-service-by-email ; 服务故障时,发送通知的方式,可以是邮件和短信,这里发送的方式是邮件;
                                                                 ; 其中“notify-service-by-email”在commands.cfg文件中定义。
         host_notification_commands      notify-host-by-email    ; 主机故障时,发送通知的方式,可以是邮件和短信,这里发送的方式是邮件;
                                                                 ; 其中“notify-host-by-email”在commands.cfg文件中定义。 
         register                        0                    ; DONT REGISTER THIS DEFINITION - ITS NOT A REAL CONTACT, JUST A TEMPLATE!
         }
define host{
         name                            generic-host    ; 主机名称,这里的主机名,并不是直接对应到真正机器的主机名;
                                                         ; 乃是对应到在主机配置文件里所设定的主机名。
         notifications_enabled           1               ; Host notifications are enabled
         event_handler_enabled           1               ; Host event handler is enabled
         flap_detection_enabled          1               ; Flap detection is enabled
         failure_prediction_enabled      1               ; Failure prediction is enabled
         process_perf_data               1               ; 其值可以为0或1,其作用为是否启用Nagios的数据输出功能;
                                                         ; 如果将此项赋值为1,那么Nagios就会将收集的数据写入某个文件中,以备提取。
         retain_status_information       1               ; Retain status information across program restarts
         retain_nonstatus_information    1               ; Retain non-status information across program restarts
         notification_period             24x7            ; 指定“发送通知”的时间段,也就是可以在什么时候发送通知给使用者。
         register                        0               ; DONT REGISTER THIS DEFINITION - ITS NOT A REAL HOST, JUST A TEMPLATE!
         }
define host{
         name                            linux-server    ; 主机名称
         use                             generic-host    ; use表示引用,也就是将主机generic-host的所有属性引用到linux-server中来;
                                                         ; 在nagios配置中,很多情况下会用到引用。
         check_period                    24x7            ; 这里的check_period告诉nagios检查主机的时间段
         check_interval                  5               ; nagios对主机的检查时间间隔,这里是5分钟。
         retry_interval                  1               ; 重试检查时间间隔,单位是分钟。
         max_check_attempts              10              ; nagios对主机的最大检查次数,也就是nagios在检查发现某主机异常时,并不马上判断为异常状况;
                                                         ; 而是多试几次,因为有可能只是一时网络太拥挤,或是一些其他原因,让主机受到了一点影响;
                                                         ; 这里的10就是最多试10次的意思。
         check_command                   check-host-alive ; 指定检查主机状态的命令,其中“check-host-alive”在commands.cfg文件中定义。
         notification_period             24x7            ; 主机故障时,发送通知的时间范围,其中“workhours”在timeperiods.cfg中进行了定义;
                                                         ; 下面会陆续讲到。
         notification_interval           10              ; 在主机出现异常后,故障一直没有解决,nagios再次对使用者发出通知的时间。单位是分钟;
                                                         ; 如果你觉得,所有的事件只需要一次通知就够了,可以把这里的选项设为0
         notification_options            d,u,r           ; 定义主机在什么状态下可以发送通知给使用者,d即down,表示宕机状态;
                                                         ; u即unreachable,表示不可到达状态;
                                                         ; r即recovery,表示重新恢复状态。
         contact_groups                  ts              ; 指定联系人组,这个“admins”在contacts.cfg文件中定义。
         register                        0               ; DONT REGISTER THIS DEFINITION - ITS NOT A REAL HOST, JUST A TEMPLATE!
         }
define host{
         name                    windows-server  ; The name of this host template
         use                     generic-host    ; Inherit default values from the generic-host template
         check_period            24x7            ; By default, Windows servers are monitored round the clock
         check_interval          5               ; Actively check the server every 5 minutes
         retry_interval          1               ; Schedule host check retries at 1 minute intervals
         max_check_attempts      10              ; Check each server 10  times  (max)
         check_command           check-host-alive        ; Default  command  to check  if  servers are  "alive"
         notification_period     24x7            ; Send notification out at any  time  - day or night
         notification_interval   10              ; Resend notifications every 30 minutes
         notification_options    d,r             ; Only send notifications  for  specific host states
         contact_groups          ts              ; Notifications get sent to the admins by default
         hostgroups              windows-servers ; Host  groups  that Windows servers should be a member of
         register                0               ; DONT REGISTER THIS - ITS JUST A TEMPLATE
         }
define service{
         name                            generic-service         ; 定义一个服务名称
         active_checks_enabled           1                       ; Active service checks are enabled
         passive_checks_enabled          1                       ; Passive service checks are enabled /accepted
         parallelize_check               1                       ; Active service checks should be parallelized;
                                                                 ; (disabling this can lead to major performance problems)
         obsess_over_service             1                       ; We should obsess over this service ( if  necessary)
         check_freshness                 0                       ; Default is to NOT check service  'freshness'
         notifications_enabled           1                       ; Service notifications are enabled
         event_handler_enabled           1                       ; Service event handler is enabled
         flap_detection_enabled          1                       ; Flap detection is enabled
         failure_prediction_enabled      1                       ; Failure prediction is enabled
         process_perf_data               1                       ; Process performance data
         retain_status_information       1                       ; Retain status information across program restarts
         retain_nonstatus_information    1                       ; Retain non-status information across program restarts
         is_volatile                     0                       ; The service is not volatile
         check_period                    24x7             ; 这里的check_period告诉nagios检查服务的时间段。
         max_check_attempts              3                ; nagios对服务的最大检查次数。
         normal_check_interval           5                ; 此选项是用来设置服务检查时间间隔,也就是说,nagios这一次检查和下一次检查之间所隔的时间;
                                                          ; 这里是5分钟。
         retry_check_interval            2                ; 重试检查时间间隔,单位是分钟。
         contact_groups                  ts           ; 指定联系人组
         notification_options            w,u,c,r          ; 这个定义的是“通知可以被发出的情况”。w即warn,表示警告状态;
                                                          ; u即unknown,表示不明状态;
                                                          ; c即criticle,表示紧急状态,r即recover,表示恢复状态;
                                                          ; 也就是在服务出现警告状态、未知状态、紧急状态和重新恢复后都发送通知给使用者。
         notification_interval           10               ; Re-notify about service problems every hour
         notification_period             24x7             ; 指定“发送通知”的时间段,也就是可以在什么时候发送通知给使用者。
         register                        0                ; DONT REGISTER THIS DEFINITION - ITS NOT A REAL SERVICE, JUST A TEMPLATE!
         }
define service{
         name                             local -service           ; The name of this service template
         use                             generic-service         ; Inherit default values from the generic-service definition
         max_check_attempts              4             ; Re-check the service up to 4  times  in  order to determine its final (hard) state
         normal_check_interval           5             ; Check the service every 5 minutes under normal conditions
         retry_check_interval            1             ; Re-check the service every minute  until  a hard state can be determined
         register                        0             ; DONT REGISTER THIS DEFINITION - ITS NOT A REAL SERVICE, JUST A TEMPLATE!
         }

b. resource.cfg文件

    resource.cfg是nagios的变量定义文件,文件内容只有一行:

1
$USER1$= /usr/local/nagios/libexec

    其中,变量$USER1$指定了安装nagios插件的路径,如果把插件安装在了其它路径,只需在这里进行修改即可。需要注意的是,变量必须先定义,然后才能在其它配置文件中进行引用。

c. commands.cfg文件

    此文件默认是存在的,无需修改即可使用,当然如果有新的命令需要加入时,在此文件进行添加即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#notify-host-by-email命令的定义 
define  command {
         command_name    notify-host-by-email              #命令名称,即定义了一个主机异常时发送邮件的命令。
         command_line     /usr/bin/printf  "%b"  "***** Nagios *****\n\nNotification Type: $NOTIFICATIONTYPE$\nHost: $HOSTNAME$\nState: $HOSTSTATE$\nAddress: $HOSTADDRESS$\nInfo: $HOSTOUTPUT$\n\nDate/Time: $LONGDATETIME$\n"  /bin/mail  -s  "** $NOTIFICATIONTYPE$ Host Alert: $HOSTNAME$ is $HOSTSTATE$ **"  $CONTACTEMAIL$                                      #命令具体的执行方式。
         } #notify-service-by-email命令的定义 
define  command {
         command_name    notify-service-by-email           #命令名称,即定义了一个服务异常时发送邮件的命令
         command_line     /usr/bin/printf  "%b"  "***** Nagios *****\n\nNotification Type: $NOTIFICATIONTYPE$\n\nService: $SERVICEDESC$\nHost: $HOSTALIAS$\nAddress: $HOSTADDRESS$\nState: $SERVICESTATE$\n\nDate/Time: $LONGDATETIME$\n\nAdditional Info:\n\n$SERVICEOUTPUT$\n"  /bin/mail  -s  "** $NOTIFICATIONTYPE$ Service Alert: $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$ **"  $CONTACTEMAIL$
         }
#check-host-alive命令的定义
define  command {
         command_name    check-host-alive                  #命令名称,用来检测主机状态。
         command_line    $USER1$ /check_ping  -H $HOSTADDRESS$ -w 3000.0,80% -c 5000.0,100% -p 5             
                         # 这里的变量$USER1$在resource.cfg文件中进行定义,即$USER1$=/usr/local/nagios/libexec;
                         # 那么check_ping的完整路径为/usr/local/nagios/libexec/check_ping;
                         # “-w 3000.0,80%”中“-w”说明后面的一对值对应的是“WARNING”状态,“80%”是其临界值。
                         # “-c 5000.0,100%”中“-c”说明后面的一对值对应的是“CRITICAL”,“100%”是其临界值。
                         # “-p 1”说明每次探测发送一个包。
         }
define  command {
         command_name    check_local_disk
         command_line    $USER1$ /check_disk  -w $ARG1$ -c $ARG2$ -p $ARG3$             #$ARG1$是指在调用这个命令的时候,命令后面的第一个参数。
         }
define  command {
         command_name    check_local_load
         command_line    $USER1$ /check_load  -w $ARG1$ -c $ARG2$
         }
define  command {
         command_name    check_local_procs
         command_line    $USER1$ /check_procs  -w $ARG1$ -c $ARG2$ -s $ARG3$
         }
define  command {
         command_name    check_local_users
         command_line    $USER1$ /check_users  -w $ARG1$ -c $ARG2$
         }
define  command {
         command_name    check_local_swap
         command_line    $USER1$ /check_swap  -w $ARG1$ -c $ARG2$
         }
define  command {
         command_name    check_ftp
         command_line    $USER1$ /check_ftp  -H $HOSTADDRESS$ $ARG1$
         }
define  command {
         command_name    check_http
         command_line    $USER1$ /check_http  -I $HOSTADDRESS$ $ARG1$
         }
define  command {
         command_name    check_ssh
         command_line    $USER1$ /check_ssh  $ARG1$ $HOSTADDRESS$
         }
define  command {
         command_name    check_ping
         command_line    $USER1$ /check_ping  -H $HOSTADDRESS$ -w $ARG1$ -c $ARG2$ -p 5
         }
define  command {
         command_name    check_nt
         command_line    $USER1$ /check_nt  -H $HOSTADDRESS$ -p 12489 - v  $ARG1$ $ARG2$
         }

d. hosts.cfg文件

    此文件默认不存在,需要手动创建,hosts.cfg主要用来指定被监控的主机地址以及相关属性信息,根据实验目标配置如下:

1
2
3
4
5
6
7
8
9
10
11
define host{   
         use                     linux-server           #引用主机linux-server的属性信息,linux-server主机在templates.cfg文件中进行了定义。
         host_name               Nagios-Linux           #主机名
         alias                    Nagios-Linux           #主机别名
         address                 192.168.1.111          #被监控的主机地址,这个地址可以是ip,也可以是域名。
         }   
#定义一个主机组   define hostgroup{      
         hostgroup_name          bsmart-servers         #主机组名称,可以随意指定。
         alias                    bsmart servers         #主机组别名
         members                 Nagios-Linux           #主机组成员,其中“Nagios-Linux”就是上面定义的主机。     
         }

注意:在/etc/nagios/objects 下默认有localhost.cfg 和windows.cfg 这两个配置文件,localhost.cfg 文件是定义监控主机本身的,windows.cfg 文件是定义windows 主机的,其中包括了对host 和相关services 的定义。所以在本次实验中,将直接在localhost.cfg 中定义监控主机(Nagios-Server),在windows.cfg中定义windows 主机(Nagios-Windows)。根据自己的需要修改其中的相关配置,详细如下:

localhost.cfg

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
###############################################################################
# LOCALHOST.CFG - SAMPLE OBJECT CONFIG FILE FOR MONITORING THIS MACHINE
#
#
# NOTE: This config file is intended to serve as an *extremely* simple 
#       example of how you can create configuration entries to monitor
#       the local (Linux) machine.
#
###############################################################################
 
 
 
 
###############################################################################
###############################################################################
#
# HOST DEFINITION
#
###############################################################################
###############################################################################
 
# Define a host for the local machine
 
define host{
         use                     linux-server            
         host_name               10.0.0.14
         alias                    10.0.0.14
         address                 127.0.0.1
         }
 
 
 
###############################################################################
###############################################################################
#
# HOST GROUP DEFINITION
#
###############################################################################
###############################################################################
 
# Define an optional hostgroup for Linux machines
 
define hostgroup{
         hostgroup_name  linux-servers 
         alias            Linux Servers
         members         10.0.0.14    
         }
 
 
 
###############################################################################
###############################################################################
#
# SERVICE DEFINITIONS
#
###############################################################################
###############################################################################
 
 
# Define a service to "ping" the local machine
 
define service{
         use                              local -service 
         host_name                       10.0.0.14
         service_description             PING
     check_command           check_ping!100.0,20%!500.0,60%
         }
 
 
# Define a service to check the disk space of the root partition
# on the local machine.  Warning if < 20% free, critical if
# < 10% free space on partition.
 
define service{
         use                              local -service   
         host_name                       10.0.0.14
         service_description             Root Partition
     check_command           check_local_disk!20%!10%!/
        }
 
 
 
# Define a service to check the number of currently logged in
# users on the local machine.  Warning if > 20 users, critical
# if > 50 users.
 
define service{
         use                              local -service 
         host_name                       10.0.0.14
         service_description             Current Users
     check_command           check_local_users!20!50
         }
 
 
# Define a service to check the number of currently running procs
# on the local machine.  Warning if > 250 processes, critical if
# > 400 users.
 
define service{
         use                              local -service  
         host_name                       10.0.0.14
         service_description             Total Processes
     check_command           check_local_procs!250!400!RSZDT
         }
 
 
 
# Define a service to check the load on the local machine. 
 
define service{
         use                              local -service  
         host_name                       10.0.0.14
         service_description             Current Load
     check_command           check_local_load!5.0,4.0,3.0!10.0,6.0,4.0
         }
 
 
 
# Define a service to check the swap usage the local machine. 
# Critical if less than 10% of swap is free, warning if less than 20% is free
 
define service{
         use                              local -service    
         host_name                       10.0.0.14
         service_description             Swap Usage
     check_command           check_local_swap!20!10
         }
 
 
 
# Define a service to check SSH on the local machine.
# Disable notifications for this service by default, as not all users may have SSH enabled.
 
define service{
         use                              local -service 
         host_name                       10.0.0.14
         service_description             SSH
     check_command           check_ssh
     notifications_enabled       0
         }
 
 
 
# Define a service to check HTTP on the local machine.
# Disable notifications for this service by default, as not all users may have HTTP enabled.
 
define service{
         use                              local -service
         host_name                       10.0.0.14
         service_description             HTTP
     check_command           check_http
     notifications_enabled       0
         }

windows.cfg

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
define host{
         use             windows-server  ; Inherit default values from a template
         host_name       Nagios-Windows  ; The name we're giving to this host
         alias            My Windows Server       ; A longer name associated with the host
         address         192.168.1.113   ; IP address of the host
         }
define hostgroup{
         hostgroup_name  windows-servers ; The name of the hostgroup
         alias            Windows Servers ; Long name of the group
         }
define service{
         use                     generic-service
         host_name               Nagios-Windows
         service_description     NSClient++ Version
         check_command           check_nt!CLIENTVERSION
         }
define service{
         use                     generic-service
         host_name               Nagios-Windows
         service_description     Uptime
         check_command           check_nt!UPTIME
         }
define service{
         use                     generic-service
         host_name               Nagios-Windows
         service_description     CPU Load
         check_command           check_nt!CPULOAD!-l 5,80,90
         }
define service{
         use                     generic-service
         host_name               Nagios-Windows
         service_description     Memory Usage
         check_command           check_nt!MEMUSE!-w 80 -c 90
         }
define service{
         use                     generic-service
         host_name               Nagios-Windows
         service_description     C:\ Drive Space
         check_command           check_nt!USEDDISKSPACE!-l c -w 80 -c 90
         }
define service{
         use                     generic-service
         host_name               Nagios-Windows
         service_description     W3SVC
         check_command           check_nt!SERVICESTATE!-d SHOWALL -l W3SVC
         }
define service{
         use                     generic-service
         host_name               Nagios-Windows
         service_description     Explorer
         check_command           check_nt!PROCSTATE!-d SHOWALL -l Explorer.exe
         }

e. services.cfg文件

    此文件默认也不存在,需要手动创建,services.cfg文件主要用于定义监控的服务和主机资源,例如监控http服务、ftp服务、主机磁盘空间、主机系统负载等等。Nagios-Server 和Nagios-Windows 相关服务已在相应的配置文件中定义,所以这里只需要定义Nagios-Linux 相关服务即可,这里只定义一个检测是否存活的服务来验证配置文件的正确性,其他服务的定义将在后面讲到。

1
2
3
4
5
6
define service{  
         use                      local -service           #引用local-service服务的属性值,local-service在templates.cfg文件中进行了定义。
         host_name               Nagios-Linux            #指定要监控哪个主机上的服务,“Nagios-Server”在hosts.cfg文件中进行了定义。
         service_description     check-host-alive        #对监控服务内容的描述,以供维护人员参考。
         check_command           check-host-alive        #指定检查的命令。
         }

f. contacts.cfg文件

    contacts.cfg是一个定义联系人和联系人组的配置文件,当监控的主机或者服务出现故障,nagios会通过指定的通知方式(邮件或者短信)将信息发给这里指定的联系人或者使用者。

1
2
3
4
5
6
7
8
9
10
define contact{
         contact_name                    David              #联系人的名称,这个地方不要有空格        use                             generic-contact   #引用generic-contact的属性信息,其中“generic-contact”在templates.cfg文件中进行定义
         alias                            Nagios Admin
         email                           david.tang@bsmart.cn
         }
define contactgroup{
         contactgroup_name       ts                               #联系人组的名称,同样不能空格
         alias                    Technical Support                #联系人组描述
         members                 David                            #联系人组成员,其中“david”就是上面定义的联系人,如果有多个联系人则以逗号相隔
         }

g. timeperiods.cfg文件

    此文件只要用于定义监控的时间段,下面是一个配置好的实例:

#下面是定义一个名为24x7的时间段,即监控所有时间段  

1
2
3
4
5
6
7
8
9
10
11
define timeperiod{  
         timeperiod_name 24x7        #时间段的名称,这个地方不要有空格
         alias            24 Hours A Day, 7 Days A Week  
         sunday          00:00-24:00  
         monday          00:00-24:00  
         tuesday         00:00-24:00  
         wednesday       00:00-24:00  
         thursday        00:00-24:00  
         friday          00:00-24:00  
         saturday        00:00-24:00  
         }

#下面是定义一个名为workhours的时间段,即工作时间段。  

1
2
3
4
5
6
7
8
9
define timeperiod{  
         timeperiod_name workhours   
         alias            Normal Work Hours  
         monday          09:00-17:00  
         tuesday         09:00-17:00  
         wednesday       09:00-17:00  
         thursday        09:00-17:00  
         friday          09:00-17:00  
         }

h. cgi.cfg文件

    此文件用来控制相关cgi脚本,如果想在nagios的web监控界面执行cgi脚本,例如重启nagios进程、关闭nagios通知、停止nagios主机检测等,这时就需要配置cgi.cfg文件了。
由于nagios的web监控界面验证用户为david,所以只需在cgi.cfg文件中添加此用户的执行权限就可以了,需要修改的配置信息如下:

1
2
3
4
5
6
7
8
default_user_name=david
authorized_for_system_information=nagiosadmin,david  
authorized_for_configuration_information=nagiosadmin,david  
authorized_for_system_commands=david
authorized_for_all_services=nagiosadmin,david  
authorized_for_all_hosts=nagiosadmin,david
authorized_for_all_service_commands=nagiosadmin,david  
authorized_for_all_host_commands=nagiosadmin,david

附件查看我生产环境的配置文件





     本文转自 wzlinux 51CTO博客,原文链接:http://blog.51cto.com/wzlinux/1719866,如需转载请自行联系原作者



相关文章
|
8月前
|
应用服务中间件 nginx
Nginx单独配置conf文件
Nginx单独配置conf文件
73 1
|
存储 JSON NoSQL
confd动态配置文件详解
confd动态配置文件详解
confd动态配置文件详解
|
负载均衡 关系型数据库 MySQL
Nginx的安装与配置文件结构| 学习笔记
快速学习Nginx的安装与配置文件结构。
117 0
Nginx的安装与配置文件结构| 学习笔记
|
负载均衡 关系型数据库 MySQL
Nginx的安装与配置文件结构
一、LNMP架构的部署注意事项 二、Nginx的安装与配置文件结构 三、Nginx常用功能实战
Nginx的安装与配置文件结构
|
XML C# 数据格式
C#应用程序配置文件
C#应用程序配置文件
95 0
C#应用程序配置文件
|
监控 开发工具 Windows

相关实验场景

更多