搭建zabbix监控系统详解
博文大纲:
一、前言
二、zabbix监控架构
三、搭建Zabbix监控服务器
四、搭建过程中遇到有些服务无法正常启动的解决办法
一、前言 :
要想实时的了解服务器的运行状况并且能在出现问题时及时解决,利用监控软件是一个很好的选择,而zabbix监控系统则在众多监控软件中脱颖而出。
zabbix是一个基于web界面的企业级开源监控软件,Zabbix服务器需要LAMP环境或LNMP环境,提供分布式系统监控与网络监视功能。具备主机的性能监控,网络设备性能监控,数据库性能监控,多种告警方式,详细报表、图表的绘制等功能。监测对象可以是Linux或Windows服务器,也可以是路由器、交换机等网络设备,通过SNMP、zabbix Agent、PING、端口监视等方法提供对远程网络服务器等监控、数据收集等功能。
二、zabbix监控架构:
在生产环境中,zabbix根据网络环境、监控规模等外界因素分为三种架构:server-client(直接连接)、master-node-client(Node架构)、server-proxy-client(proxy架构),如下图所示:
1、server-client架构:
server-client架构是zabbix最简单的架构,监控机和被监控机之间不经过任何代理,直接在zabbix server(监控服务器) 和zabbix agent(agent:部署在被监控端,用于采集数据)之间进行数据交互,适用于网络比较简单,设备较少的监控环境。
2、master-node-client架构:
master-node-client架构是zabbix最复杂的监控架构,适用于跨网络、跨机房、设备较多的大型环境。每个node同时也是一个server端,node下面可以接proxy,也可以直接接client。node有自己的配置文件和数据库,其要做的就是将配置信息和监控数据向master同步。当master宕机后,node可以保证架构的完整性。
3、server-proxy-client架构:
proxy是server、client之间沟通的一个桥梁,proxy本身没有前端,而且其本身不存放数据,只是将agentd发来的数据暂时存放,而后再提交给server。该架构经常是和master-node-client架构做比较的架构,一般适用于跨机房、跨网络的中型网络架构的监控。
三、搭建Zabbix监控服务器:
我整理了两种server-client架构的配置方法:
1、配置本地yum仓库,进行安装(服务器无需连接到Internet);
2、直接把互联网做yum仓库,进而安装,zabbix的官方文档就是采用这种方式;
Zabbix官方的相关链接:
这篇文章先写一下如何配置本地yum仓库,进而搭建Zabbix监控服务器(Zabbix3.4版本的server-client架构):
安装zabbix服务器方法一:使用本地yum搭建Zabbix3.4
(一)配置前准备:
1、下载Zabbix服务器所需yum源仓库:zabbix服务器yum仓库下载,提取码:0kp3
2、我这里的环境:centos7 两台,window服务器一台、交换机、路由器各一台,环境如下:
3、自行配置防火墙,放行相关流量,我这里直接关闭了防火墙。
(二)开始搭建Zabbix服务器:
[root@zabbix ~]# mount /dev/cdrom /media #挂载下载的.iso镜像文件。
mount: /dev/sr0 写保护,将以只读方式挂载
[root@zabbix ~]# cat /etc/yum.repos.d/a.repo
#yum仓库位置指定文件(该目录下只有a.repo这一个文件,以免出现错误)。
[fd]
baseurl=file:///media
gpgcheck=0
[root@zabbix ~]# yum -y install mariadb-server mariadb #安装mariadb数据库
[root@zabbix ~]# systemctl start mariadb #启动mariadb数据库
[root@zabbix ~]# systemctl enable mariadb #设置开机自启动
Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service
to /usr/lib/systemd/system/mariadb.service.
[root@zabbix ~]# mysqladmin -u root password "pwd123" #为数据库root用户设置密码
[root@zabbix ~]# mysql -u root -p #连接数据库,测试是否成功
Enter password: #输入密码
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 5.5.56-MariaDB MariaDB Server
Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> #已连接OK
MariaDB [(none)]> create database zabbix character set utf8 collate utf8_bin;
#为Zabbix创建专用的数据库
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> grant all privileges on zabbix.* to zabbix@localhost identified by 'pwd456';
#建立一个名为Zabbix的数据库用户,并设置密码为“pwd456”
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> exit #退出数据库
Bye
[root@zabbix ~]# yum -y install zabbix-server-mysql zabbix-web-mysql zabbix-agent
#安装Zabbix服务,它会自动安装它所依赖的httpd与PHP。
[root@zabbix ~]# zcat /usr/share/doc/zabbix-server-mysql-3.4.1/create.sql.gz | mysql -uzabbix -p zabbix
#导入数据库SQL脚本。
Enter password: #输入zabbix用户的密码,也就是刚创建的那个数据库用户密码“pwd456”
[root@zabbix ~]# vim /etc/zabbix/zabbix_server.conf #编辑zabbix服务端配置文件
#注意删除注释符号
DBHost=localhost #去掉注释符号
DBName=zabbix #数据库名称,根据实际修改,默认不用修改
DBUser=zabbix #数据库用户名,默认不用修改
DBPassword=pwd456 #数据库密码,修改此行
#修改完毕保存,保存退出即可。
接下来编辑zabbix agent的配置文件,必须指定zabbix server的IP地址,在每台安装了agent的主机上都要配置。这里要指定zabbix服务器的IP地址,现在是在同一台服务器上,所以可以不做修改:
[root@zabbix ~]# vim /etc/zabbix/zabbix_agentd.conf #编辑agentd配置文件
#编辑此配置文件的目的是可以监控该Zabbix服务器。
Server=127.0.0.1 #客户端被动等待指定服务器来查询数据
ServerActive=127.0.0.1 #客户端主动提交数据到指定的服务器
Hostname=linux-server001 #建议修改此行,配置规范的主机名
配置zabbix web接口并启动相关服务:
[root@zabbix ~]# vim /etc/httpd/conf.d/zabbix.conf #编辑http配置文件
php_value date.timezone Asia/Shanghai #设置为上海时区,并该行删除注释符号
[root@zabbix ~]# systemctl start httpd #启动httpd服务
[root@zabbix ~]# systemctl enable httpd #设置开机自启动
[root@zabbix ~]# systemctl start zabbix-server #启动zabbix服务端
[root@zabbix ~]# systemctl enable zabbix-server #设置开机自启动
[root@zabbix ~]# systemctl start zabbix-agent #启动agent代理
[root@zabbix ~]# systemctl enable zabbix-agent #设置开机自启动
现在服务器端基本配置完成,但是由于字体显示原因,可能使用浏览器访问时,会出现部分文字以乱码显示,所以要下载标准中文字体,提取码:nilh 。
[root@zabbix ~]# cp simkai.ttf /usr/share/zabbix/fonts/
#将下载的字体复制到zabbix服务器的文档根目录
[root@zabbix ~]# vim /usr/share/zabbix/include/defines.inc.php
#修改PHP界面指定的字体文件,将原有的“graphfont”更改为“simkai”。
define('ZBX_GRAPH_FONT_NAME', 'simkai'); // font file name
(三)使用浏览器配置Zabbix服务器:
1、打开浏览器访问:http://zabbix服务器IP地址/zabbix 。
2、检查先决条件,如下:
3、配置数据库连接,根据之前创建好的zabbix数据库填写授权信息,若根据我之前的配置,这里都可以保持默认,只输入密码即可(感觉下面图中中文介绍有些多余了,谷歌浏览器可以自动翻译):
4、填写连接zabbix服务信息,如下:
5、确认无误后,开始安装:
6、安装完成:
7、在登录界面输入默认的用户名“Admin”,密码“zabbix”,即可登录到zabbix服务器,如下所示:
8、zabbix首页(默认为英文,可以更改默认语言):
9、zabbix用户管理(依次点击如下):
10、修改用户属性:
(四)配置各个被监控设备:
1、交换机配置:
switch#conf t
switch(config)#in vlan 1
switch(config-if)#ip add 192.168.1.1 255.255.255.0
switch(config-if)#no sh
switch(config-if)#exit
switch(config)#snmp-server community centos RO
#设置被服务器轮询的只读共同体
switch(config)#snmp-server enable traps
#允许发送trap消息,可能会出两行提示信息,无视即可
switch(config)#snmp-server host 192.168.1.2 centos
#设置发送trap消息的共同体
2、路由器配置(注意共同体名不要和交换机配置的冲突):
Route#conf t
Route(config)#in f0/0
Route(config-if)#ip add 192.168.1.254 255.255.255.0
Route(config-if)#no sh
Route(config-if)#exit
Route(config)#snmp-server community centos1 RO
Route(config)#snmp-server enable traps
Route(config)#snmp-server host 192.168.1.2 centos1
3、Linux服务器配置(首先下载所需的agent代理包,提取码:sklc ,然后上传至Linux服务器):
[root@client src]# ls #查看上传的agent包
debug kernels zabbix-agent-3.2.6-1.el7.x86_64.rpm
[root@client src]# rpm -ivh zabbix-agent-3.2.6-1.el7.x86_64.rpm #安装
[root@client src]# vim /etc/zabbix/zabbix_agentd.conf #编辑配置文件,改动下面几行
Server=192.168.1.2 #指定zabbix服务端IP
ServerActive=192.168.1.2 #同上
Hostname=linux-server002
#修改规范的名称,一会在zabbix web的配置必须和这里的名字一样。
[root@localhost ~]# systemctl start zabbix-agent #启动agent服务
[root@localhost ~]# systemctl enable zabbix-agent #设置开机自启动
Created symlink from nt.service to /usr/lib/systemd/system/zabbix-agent.service.
[root@localhost ~]# netstat -anpt | grep "agent" #查看端口是否在监听,齐活
tcp 0 0 0.0.0.0:10050 0.0.0.0:* LISTEN 3708/zabbix_agentd
tcp6 0 0 :::10050 :::* LISTEN 3708/zabbix_agentd
4、Windows server2008R2配置(下载Windows的agent代理软件,提取码:s49p ):
(1)将下载的agent代理软件包解压后,会看到下面这两个文件,其中“bin”目录中有两个子目录,“win32”和“win64”,分别对应不同的系统版本,根据自己系统的版本来看自己所需要的:
(2)现在创建一个文件夹,专门用于存放agent代理的配置文件,我这里的系统是64位的,所以就把上面提到的“win64”中所有的文件复制到zabbix文件夹下,并且把“conf”目录下的配置文件也复制过来,最后zabbix目录下的文件如下:
(3)使用写字板编辑zabbix_agentd.win.conf这个文件,注意不要使用记事本,那样打开乱七八糟的:
(4)修改下面三项:
Server=192.168.1.2
ServerActive=192.168.1.2
Hostname=windows-server001
(5)使用cmd命令进行安装及启动,常用的参数有:-c,指定配置文件;-i安装;-s启动;-x停止;-d卸载。
C:\Users\Administrator>e: #进入zabbix目录所在盘符
E:\>cd zabbix #进入zabbix目录
E:\zabbix>zabbix_agentd.exe -c zabbix_agentd.win.conf -i #安装agent
zabbix_agentd.exe [2320]: service [Zabbix Agent] installed successfully
zabbix_agentd.exe [2320]: event source [Zabbix Agent] installed successfully
E:\zabbix>zabbix_agentd.exe -c zabbix_agentd.win.conf -s #指定agent配置文件并启动
zabbix_agentd.exe [2888]: service [Zabbix Agent] started successfully
(五)配置zabbix web端,添加被监控设备:
1、添加交换机:
1)按照以下依次点击:
2)如下配置:
3)配置模板(标注序号的依次点击即可):
一定要单击“添加”:
依次点击:
按下面配置:
配置完成(注意网络设备使用的SNMP,所以最后是现实SNMP变绿,Linux服务器和Windows服务器使用的agent代理,所以ZBX会变绿):
2、添加Linux服务器:
1)创建主机:
2)如下所示:
2)看图依次点击:
3)看图:
OK了,添加完成。如下,第一个添加的交换机的“SNMP”变绿了,说明配置没问题。
3、添加Windows server 2008R2:
1)和添加Linux服务器差不多,如下(写的就简单些了):
2)定义基本信息(不好意思,做完发现下面的IP地址写成zabbix服务器的了,最后没有成功,我又改成了192.168.1.4,失误):
3)添加模板:
4)如下:
4、又OK了,还有最后一个路由器设备:
1)创建主机:
2)定义基本信息:
3)选择模板:
4)设置共同体,centos1是在路由器上配置的共同体名(感觉耐心被消耗完了,自己看图来吧,不解释了):
最后添加的主机如下所示(若ZBX或SNMP没变为绿色,只要没显示红色,就表示配置没问题,耐心等一会,或刷新再试试看):
安装zabbix服务器方法二:使用Internet作为yum源,搭建zabbix 4.2版本:
1、配置前准备:
(1)配置zabbix服务器可连接Internet;
(2)系统自带的/etc/yum.repo/ 目录下的文件必须要有。
2、开始搭建:
[root@zabbix ~]# rpm -ivh https://repo.zabbix.com/zabbix/4.2/rhel/7/x86_64/zabbix-release-4.2-1.el7.noarch.rpm
#安装存储库配置包
[root@zabbix ~]# yum-config-manager --enable rhel-7-server-optional-rpms
#启用可选rpms的存储库
[root@zabbix ~]# yum -y install mariadb-server mariadb
#安装mariadb数据库
[root@zabbix ~]# systemctl start mariadb #启动数据库
[root@zabbix ~]# systemctl enable mariadb #设置为开机自启动
[root@zabbix ~]# mysqladmin -u root password "pwd123" #设置数据库root用户密码
[root@zabbix ~]# yum -y install zabbix-server-mysql zabbix-web-mysql zabbix-agent
#安装zabbix服务器及agent代理,若要使用代理,可以把zabbix-proxy-mysql也yum安装上
[root@zabbix ~]# mysql -u root -ppwd123 #登录数据库
MariaDB [(none)]> create database zabbix character set utf8 collate utf8_bin;
#创建数据库
MariaDB [(none)]> grant all privileges on zabbix.* to zabbix@localhost identified by 'pwd456';
#创建zabbix服务连接数据库的用户,并设置密码。
MariaDB [(none)]> exit #退出数据库
[root@zabbix ~]# zcat /usr/share/doc/zabbix-server-mysql-4.2.4/create.sql.gz | mysql -uzabbix -p zabbix
#导入数据库SQL脚本
Enter password: #输入数据库用户zabbix密码
[root@zabbix ~]# vim /etc/zabbix/zabbix_server.conf #编辑zabbix服务端配置文件
#注意删除注释符号
DBHost=localhost #去掉注释符号
DBName=zabbix #数据库名称,根据实际修改,默认不用修改
DBUser=zabbix #数据库用户名,默认不用修改
DBPassword=pwd456 #数据库密码,修改此行
#修改完毕保存,保存退出即可。
接下来编辑zabbix agent的配置文件,必须指定zabbix server的IP地址,在每台安装了agent的主机上都要配置。这里要指定zabbix服务器的IP地址,现在是在同一台服务器上,所以可以不做修改:
[root@zabbix ~]# vim /etc/zabbix/zabbix_agentd.conf #编辑agentd配置文件
#编辑此配置文件的目的是可以监控该Zabbix服务器。
Server=127.0.0.1 #客户端被动等待指定服务器来查询数据
ServerActive=127.0.0.1 #客户端主动提交数据到指定的服务器
Hostname=linux-server001 #建议修改此行,配置规范的主机名
配置zabbix web接口并启动相关服务:
[root@zabbix ~]# vim /etc/httpd/conf.d/zabbix.conf #编辑http配置文件
php_value date.timezone Asia/Shanghai #设置为上海时区,并该行删除注释符号
[root@zabbix ~]# systemctl start httpd #启动httpd服务
[root@zabbix ~]# systemctl enable httpd #设置开机自启动
[root@zabbix ~]# systemctl start zabbix-server #启动zabbix服务端
[root@zabbix ~]# systemctl enable zabbix-server #设置开机自启动
[root@zabbix ~]# systemctl start zabbix-agent #启动agent代理
[root@zabbix ~]# systemctl enable zabbix-agent #设置开机自启动
若访问web页面出现部分中文乱码的话,可以参考上面的安装方法一,有解决中文乱码的方法。
现在服务已经搭建完成了,直接参考方法一的配置,去访问web页面进行配置即可。
基本配置就这些,关于更多的功能,比如,绘制图表、设置报警等功能,若有时间我再写吧,建议自己研究吧!!!
四、搭建过程中遇到有些服务无法正常启动的解决办法:
我在配置Linux服务器上的agent代理时,遇到如下问题:
[root@localhost ~]# systemctl restart zabbix-agent #之前启动失败了,所以使用了restart
Job for zabbix-agent.service failed because a configured resource limit was exceeded. See "systemctl status zabbix-agent.service" and "journalctl -xe" for details.
当使用systemctl status zabbix-agent进行查询时,并没有查询到有用的信息,然后使用journalctl -xe命令进行查询,嘿嘿,查询到了有用的信息,如下:
[root@localhost ~]# journalctl -xe #执行该命令进行查询
-- Unit zabbix-agent.service has begun starting up.
7月 15 00:51:18 localhost.localdomain systemd[1]: PID file /run/zabbix/zabbix_agentd.pid not readable (yet?) after start.
7月 15 00:51:18 localhost.localdomain systemd[1]: zabbix-agent.service never wrote its PID file. Failing.
7月 15 00:51:18 localhost.localdomain systemd[1]: Failed to start Zabbix Agent.
-- Subject: Unit zabbix-agent.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit zabbix-agent.service has failed.
--
-- The result is failed.
7月 15 00:51:18 localhost.localdomain systemd[1]: Unit zabbix-agent.service entered failed state.
7月 15 00:51:18 localhost.localdomain systemd[1]: zabbix-agent.service failed.
7月 15 00:51:21 localhost.localdomain setroubleshoot[88576]: SELinux is preventing /usr/sbin/zabbix_agentd from using the setrlimit access on a p
7月 15 00:51:21 localhost.localdomain python[88576]: SELinux is preventing /usr/sbin/zabbix_agentd from using the setrlimit access on a process.
***** Plugin catchall (100. confidence) suggests **************************
If you believe that zabbix_agentd should be allowed setrlimit access on processes labeled z
Then you should report this as a bug.
You can generate a local policy module to allow this access.
Do
allow this access for now by executing:
# ausearch -c 'zabbix_agentd' --raw | audit2allow -M my-zabbixagentd
# semodule -i my-zabbixagentd.pp
结合翻译软件,大概看到是Selinux禁止访问了什么东西,然后执行上面注释掉的两行命令即可允许访问,就试了试,如下:
[root@localhost ~]# ausearch -c 'zabbix_agentd' --raw | audit2allow -M my-zabbixagentd
#执行第一条命令
libsepol.sepol_string_to_security_class: unrecognized class process
******************** IMPORTANT ***********************
To make this policy package active, execute:
semodule -i my-zabbixagentd.pp
[root@localhost ~]# semodule -i my-zabbixagentd.pp
#执行第二条命令
[root@localhost ~]# systemctl restart zabbix-agent #重启就没再报错了
[root@localhost ~]# netstat -antp | grep agent #查看端口是否在监听
tcp 0 0 0.0.0.0:10050 0.0.0.0:* LISTEN 88727/zabbix_agentd
tcp6 0 0 :::10050 :::* LISTEN 88727/zabbix_agentd
问题解决了,OK
搭建zabbix监控系统详解的更多相关文章
-
Zabbix 监控过程详解
Zabbix 监控过程详解 一.修改密码及中文语言 修改密码 修改中文语言 如果复选框中没有 Chinese(zh_CN) 选项,需要安装中文包 [root@Zabbix-server ~]# yum ...
-
使用percona-xtrabackup实现对线上zabbix监控系统数据库mariadb5.5.47的主从同步
使用percona-xtrabackup实现对线上zabbix监控系统数据库的主从同步 业务背景: zabbix3.0.4是业务的主要监控,部署在一台单机中,为避免数据丢失先对其做数据主从同步,因主数 ...
-
手把手教你在CentOS 7.4下搭建Zabbix监控(转)
Linux系统版本:CentOS 7.4 1.安装前需要先关闭selinux和firewall. 1.1 [root@zabbix ~]# vi /etc/selinux/config 将SELINU ...
-
Zabbix监控系统深度实践
Zabbix监控系统深度实践(企业级分布式系统自动化运维必选利器,大规模Zabbix集群实战经验技巧总结,由浅入深全面讲解配置.设计.案例和内部原理) 姚仁捷 著 ISBN 978-7-121-24 ...
-
zabbix server安装详解
简介 zabbix(音同 zæbix)是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案. zabbix能监视各种网络参数,保证服务器系统的安全运营:并提供灵活的通知机制以 ...
-
Linux - CentOS6.5服务器搭建与初始化配置详解(上)
1.新建一个虚拟机 选择典型 单机下一步 p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm 0cm 0.0001pt; text-align: ...
-
Linux - CentOS6.5服务器搭建与初始化配置详解(下)
传送带:Linux - CentOS6.5服务器搭建与初始化配置详解(上) 继续接着上面的安装,安装完后会出现下面界面 点击reboot重启 重启后可以看到下面的tty终端界面 因为这就是最小化安装 ...
-
zabbix agent安装详解
安装 Installing repository configuration package Zabbix 2.2 for RHEL5, Oracle Linux 5, CentOS 5: rpm - ...
-
Zabbix监控系统部署:源码安装
1. 概述1.1 基础环境2. 部署过程2.1 创建用户组2.2 下载源码解压编译安装2.2.1 下载源码解压2.2.2 YUM安装依赖环境2.2.3 编译安装最新版curl2.2.4 更新GNU构建 ...
随机推荐
-
SQL Server 2014 SP2发布下载:数十项更新修复
微软发布了数据库工具SQL Server 2014 SP2服务包下载,本次更新集合了数十项更新修复,涉及安全和功能性补丁,使用SQL Server 2014的用户应该及时安装该服务包. 文件内容 版本 ...
-
通过ssh连接github
1.检查是否已经存在ssh key $ cd ~/.ssh $ ls 如果该目录下存在id_rsa/id_rsa.pub/known_hosts这三个文件,则已经存在ssh key 直接跳转到第3步 ...
-
WebView点击加载的页面中的按钮时不弹出新窗口以及在加载后执行javascript
mWebView.setWebViewClient(new WebViewClient() { //点击网页中按钮时,在原页面打开 public boolean shouldOverrideUrlLo ...
-
初级程序员应该了解的Linux命令
基于Linux的系统最美妙的一点,就是你可以在终端中使用命令行来管理整个系统.使用命令行的优势在于,你可以使用相同的知识和技能来管理随便哪个Linux发行版. 对于各个发行版以及桌面环境(DE)而言, ...
-
.NET框架 - NETFramework + API + EF(DBFirst) + MYSQL
.NET框架 - NETFramework + MVC+ EF(DBFirst) + MYSQL 1. 安装3个MYSQL插件 ①mysql-for-visualstudio-1.2.8 vs的 ...
-
Java并发编程(十二)Callable、Future和FutureTask
一.Callable与Runnable 先说一下java.lang.Runnable吧,它是一个接口,在它里面只声明了一个run()方法: public interface Runnable { pu ...
-
Python3基础系列——枚举类型大揭秘
为什么使用枚举 枚举类型是定义常量的一种最优选择. 常量的广义概念是:不变化的量 对于常量的通俗比喻--如同大山不被轻而易举地改变 地球上的重力加速度到海枯石烂也会改变 人们使用的常量是时间不很漫长的 ...
-
python 使用selenium和requests爬取页面数据
目的:获取某网站某用户下市场大于1000秒的视频信息 1.本想通过接口获得结果,但是使用post发送信息到接口,提示服务端错误. 2.通过requests获取页面结果,使用html解析工具,发现麻烦而 ...
-
js 弹出新页面,避免被浏览器、ad拦截的一种办法
以绑定click弹窗的方式,改为普通的链接,即 a[target=_blank],在点击打开新窗口之前,修改其href. 绑定mousedown,鼠标点击执行完成前修改href. 绑定focus,保证 ...
-
bzoj 2795 [Poi2012]A Horrible Poem hash+数论
2795: [Poi2012]A Horrible Poem Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 640 Solved: 322[Subm ...