下午,ServMon V1.0 已经在sina播客服务器上部署,以下为ServMon的删节版内容,只监控磁盘分区使用率和Swap交换空间两项:
1、被监控端服务器的shell脚本(Linux)
(1)、发送磁盘分区使用率给监控端接口http://192.168.0.28/servmon/interface.php的脚本
#!/bin/sh
LANG=zh_cn
disk=$(/bin/df -kP | grep / | awk -F ' ' ' {print $6":"$5}' | awk -F '%' ' {print $1}' | tr -s '\n' ';')
today=$(date -d "today" +"%Y-%m-%d_%H:%M:%S")
ip=$(/sbin/ifconfig | grep "inet addr" | grep -v "127.0.0.1" | awk '{print $2;}' | awk -F':' '{print $2;}' | tr -s '\n' ';')
/usr/bin/curl -d menu=diskstat -d password=$2 -d date=$today -d ip=$ip -d data=$disk $1
磁盘分区使用率监控报警邮件示例图:
(2)、发送Swap交换空间使用率给监控端接口http://192.168.0.28/servmon/interface.php的脚本
/usr/local/servmon/bin/swapstat_send
LANG=zh_cn
data=$(/usr/bin/free -m | grep Swap | awk '{print $2":"$3":"$4}')
today=$(date -d "today" +"%Y-%m-%d_%H:%M:%S")
ip=$(/sbin/ifconfig | grep "inet addr" | grep -v "127.0.0.1" | awk '{print $2;}' | awk -F':' '{print $2;}' | tr -s '\n' ';')
/usr/bin/curl -d menu=swapstat -d password=$2 -d date=$today -d ip=$ip -d data=$data $1
Swap交换空间使用率监控报警邮件示例图:
(3)、计划任务:每30分钟将磁盘分区使用率发送给监控端接口,每10分钟将Swap交换空间使用率发送给监控端接口。
/etc/cron.d/servmon
0-50/10 * * * * root /bin/sh /usr/local/servmon/bin/swapstat_send http://192.168.0.28/servmon/interface.php yourpassword
2、监控端服务器配置(Linux)
(1)、启动sendmail
/usr/sbin/sendmail -bd -q30m
-b:指定Sendmail在后台运行,并且监听端口25的请求。
-d:指定Sendmail以Daemon方式运行(守护进程)。
-q:当Sendmail无法将邮件成功地发送到目的地时,它会将邮件保存在队列里。该参数指定邮件在队列里保存的时间。其中的30m表示保留30分钟。
(2)、修改php.ini的[mail function]部分为以下内容,然后重启Apache,使PHP能够使用mail()函数发送电子邮件
; For Win32 only.
;SMTP = localhost
;smtp_port = 25
; For Win32 only.
;sendmail_from = me@example.com
; For Unix only. You may supply arguments as well (default: "sendmail -t -i").
sendmail_path = /usr/sbin/sendmail -t -i
(4)、在MySQL上创建一个数据库servmon,然后在该数据库中执行以下SQL语句创建表:
`ip` varchar(128) NOT NULL default '',
`date` int(10) NOT NULL default '0',
UNIQUE KEY `ip` (`ip`)
) TYPE=MyISAM;
备注:这张表是PHP接口程序用来记录发送磁盘分区报警邮件的时间,避免在一段时间内重复发送大量报警邮件的,其实完全可以用Session、文本文件来代替它。这里之所以用MySQL数据库,是因为PHP接口中还将增加一些需要记录信息到数据库的监控模块,所以就统一用数据库了。)
(3)、PHP接口程序
http://192.168.0.28/servmon/interface.php
/**
*********************************************************************
* Copyright (c) 2007, 回忆未来[张宴]
* All rights reserved.
*
* 文件名称: interface.php
* 摘 要: 服务器监控系统ServMon接口程序
* 描 述:
* 作 者: 张宴 新浪UC:103500 博客:blog.s135.com
* 版 本: 1.0
* 时 间: 2007-08-03
*********************************************************************
*/
//------------------配置信息------------------
$password = "yourpassword";//设置数据传输验证密码
$mysql_server = "127.0.0.1:3306";//MySQL服务器地址及端口,例如localhost:3306
$mysql_db = "servmon";//MySQL数据库名
$mysql_username = "root";//MySQL帐号
$mysql_password = "";//MySQL密码
$disk_max = "90";//磁盘分区使用百分比超过此值,则报警。默认为90%
$disk_sendmail_interval = "43200";//如果同一台服务器连续报警,设置每隔多少秒发送一次报警邮件。默认为43200秒,即12小时。
$swap_max = "50";//Swap交换空间使用百分比超过此值,则报警。默认为50%
$email = "servmon@sina.com";//管理员邮箱
//--------------------------------------------
//密码验证
if (htmlspecialchars($_POST["password"]) != $password)
{
echo "数据传输验证密码错误!\n";
exit();
}
//磁盘分区报警(分区使用率超过90%后会发邮件报警)
if (htmlspecialchars($_POST["menu"]) == "diskstat")
{
$is_send_mail = "0";//是否发邮件,0为不发邮件
$date = htmlspecialchars($_POST["date"]);
$ip = htmlspecialchars($_POST["ip"]);
$data = htmlspecialchars($_POST["data"]);
$subject = "[系统监控]_磁盘分区空间不足_" . $ip;
$message = "服务器监控系统 ServMon V1.0\r\n";
$message = $message . "-------------------------------------------------------\r\n";
$message = $message . "报警服务器:" . $ip . "\r\n";
$message = $message . "-------------------------------------------------------\r\n";
$message = $message . "报警时间:" . $date . "\r\n";
$message = $message . "-------------------------------------------------------\r\n";
$message = $message . "报警内容:\r\n";
$headers = 'From: ServMon
'Reply-To: ServMon
$arr1 = explode(";", $data);
foreach ($arr1 as $key1 => $value1)
{
$arr2 = explode(":", $value1);
if ($arr2[0] != "" && $arr2[1] != "" && $arr2[1] >= $disk_max)
{
$message = $message . "●磁盘分区 " . $arr2[0] . " 空间不足(空间使用率达到" . $arr2[1] . "%)\r\n";
$is_send_mail = "1";//是否发邮件,1为发送邮件
}
}
if ($is_send_mail == "1")
{
$connect = mysql_connect($mysql_server, $mysql_username, $mysql_password);
$select = mysql_select_db($mysql_db, $connect);
$select_result = mysql_query("SELECT date FROM tb_diskstat WHERE ip='" . $ip .
"' LIMIT 1");
$rs = mysql_fetch_array($select_result);
$interval = date("U") - $rs["date"];
if ($interval >= $disk_sendmail_interval)
{
if (mail($email, $subject, $message, $headers))
{
echo "已成功发送报警邮件!\n";
}
else
{
echo "发送报警邮件失败!\n";
}
$insert_result = mysql_query("REPLACE INTO tb_diskstat (ip, date) VALUES ('" . $ip .
"', '" . date("U") . "');");
}
else
{
if ($disk_sendmail_interval >= 3600)
{
$disk_sendmail_interval_text = $disk_sendmail_interval / 3600 . "小时";
}
else
{
$disk_sendmail_interval_text = $disk_sendmail_interval . "秒";
}
echo "已发送过报警邮件," . $disk_sendmail_interval_text . "内不再重复发送!\n";
}
}
else
{
echo "磁盘分区空间足够,无须发送报警邮件!\n";
}
exit();
}
//Swap交换空间报警(Swap交换空间使用率超过60%后会发邮件报警)
if (htmlspecialchars($_POST["menu"]) == "swapstat")
{
$is_send_mail = "0";//是否发邮件,0为不发邮件
$date = htmlspecialchars($_POST["date"]);
$ip = htmlspecialchars($_POST["ip"]);
list($total, $used, $free) = split(":", htmlspecialchars($_POST["data"]));
$percentage = round($used / $total * 100, 0);
$subject = "[系统监控]_Swap交换空间使用率高达" . $percentage . "%_" . $ip;
$message = "服务器监控系统 ServMon V1.0\r\n";
$message = $message . "-------------------------------------------------------\r\n";
$message = $message . "报警服务器:" . $ip . "\r\n";
$message = $message . "-------------------------------------------------------\r\n";
$message = $message . "报警时间:" . $date . "\r\n";
$message = $message . "-------------------------------------------------------\r\n";
$message = $message . "报警内容:\r\n";
$headers = 'From: ServMon
'Reply-To: ServMon
$arr1 = explode(";", $data);
foreach ($arr1 as $key1 => $value1)
{
$arr2 = explode(":", $value1);
if ($arr2[0] != "" && $arr2[1] != "" && $arr2[1] >= $disk_max)
{
$message = $message . "●磁盘分区 " . $arr2[0] . " 空间不足(空间使用率达到" . $arr2[1] . "%)\r\n";
$is_send_mail = "1";//是否发邮件,1为发送邮件
}
}
if ($percentage >= $swap_max)
{
$message = $message . "●Swap交换空间使用率高达" . $percentage . "%,若继续增加到100%可能会导致服务器死机。\r\n";
$message = $message . "●Swap交换空间总量:" . $total . " MB\r\n";
$message = $message . "●Swap交换空间使用:" . $used . " MB\r\n";
$message = $message . "●Swap交换空间剩余:" . $free . " MB\r\n";
$is_send_mail = "1";//是否发邮件,1为发送邮件
}
if ($is_send_mail == "1")
{
if (mail($email, $subject, $message, $headers))
{
echo "已成功发送报警邮件!\n";
}
else
{
echo "发送报警邮件失败!\n";
}
}
else
{
echo "Swap交换空间使用率不高,无须发送报警邮件!\n";
}
exit();
}
?>
文章来源:http://blog.s135.com/post/276/
iperf 是一个 TCP/IP 和 UDP/IP 的性能测量工具,能够提供网络吞吐率信息,以及震动、丢包率、最大段和最大传输单元大小等统计信息;从而能够帮助我们测试网络性能,定位网络瓶颈。
参数说明
-s 以server模式启动,eg:iperf -s
-c 以client模式启动,host是server端地址,eg:iperf -c 222.35.11.23
通用参数
-f [k|m|K|M] 分别表示以Kbits, Mbits, KBytes, MBytes显示报告,默认以Mbits为单位,eg:iperf -c 222.35.11.23 -f K
-i sec 以秒为单位显示报告间隔,eg:iperf -c 222.35.11.23 -i 2
iperf是client端向server端发送数据
server端显示的是接收速率,最好加i参数,进行速率跟踪
client 显示的是发送速率
server 显示接收速率
-l 缓冲区大小,默认是8KB,eg:iperf -c 222.35.11.23 -l 16
可以使用不同的包长,进行测试
-m 显示tcp最大mtu值
-o 将报告和错误信息输出到文件eg:iperf -c 222.35.11.23 -o c:iperflog.txt
-p 指定服务器端使用的端口或客户端所连接的端口eg:iperf -s -p 9999;iperf -c 222.35.11.23 -p 9999
-u 使用udp协议
测试htb的时候最好用udp,udp通信开销小,测试的带宽更准确
-w 指定TCP窗口大小,默认是8KB
如果窗口太小,有可能丢包
-B 绑定一个主机地址或接口(当主机有多个地址或接口时使用该参数)
-C 兼容旧版本(当server端和client端版本不一样时使用)
-M 设定TCP数据包的最大mtu值
-N 设定TCP不延时
-V 传输ipv6数据包
server专用参数
-D 以服务方式运行ipserf,eg:iperf -s -D
-R 停止iperf服务,针对-D,eg:iperf -s -R
client端专用参数
-d 同时进行双向传输测试
-n 指定传输的字节数,eg:iperf -c 222.35.11.23 -n 100000
-r 单独进行双向传输测试
-b 指定发送带宽,默认是1Mbit/s
在测试qos的时候,这是最有用的参数。
-t 测试时间,默认10秒,eg:iperf -c 222.35.11.23 -t 5
默认是10s
-F 指定需要传输的文件
-T 指定ttl值
转换中的主要步骤:
1. 静态分析:收集声明和依赖的相关信息
2. 类型推断(Type inference):选出最合适的类型,是C++ scalar,String, Array, classes, Object还是Variant等…
3. 代码生成。大部分是直接将PHP的语句和表达式对应为 C++的语句和表达式。
与此同时,开发者还提供了—HPHPi,一个实验性的解释器。使用HPHPi,在运行之前也不必编译PHP源代码。
HipHop在保持了PHP优点的同时,也兼得了C++的性能优势。项目总共有30万行代码,5000多个单元测试。所有这些都将以PHP开源许可证形式发布到GitHub。
点击访问HipHop wiki:http://github.com/facebook/hiphop-php/wikis
当然是首先安装下载加速啦,不然下面的安装会好慢的
安装使用如下指令:
#cd /usr/ports/ftp/prozilla
#make install clean
中间会出现:

这是例子和HTML格式的手册页,不会用以后想研究的可以加上,然后选OK
安装完毕后,编辑或建立/etc/make.conf:
#ee /etc/make.conf
将原来的部分用#号注释掉,如果是最小化安装的话暂时是没有这个文件的。添加以下内容:
FETCH_CMD= proz
FETCH_BEFORE_ARGS= -r -k=4 –s FETCH_AFTER_ARGS= DISABLE_SIZE= yes prozilla如果偶尔不能正常下载的话,可以#掉/etc/make.conf下我们添加的内容。 2、安装Apache2.2.X 使用以下指令: # cd /usr/ports/www/apache22 #make install clean 出现图如下:

根据自已的不同选取安装模块,如果你不知道选取那些,那就默认,直接回答OK 即可,
默认已经足够了,所以我这里回答OK,
几分钟后安装完成了,快慢决定于你的网络快慢,因为他到网上下载安装包的,
3、 安装 PHP5.2.1
执行下列指令:
# cd /usr/ports/lang/php5
make install clean
在跳出的提示框中,使用如下配置

4、完成后继续安装一些常用的 PHP 模块,
请执行下列指令:
# cd /usr/ports/lang/php5-extensions/
make install clean
在跳出的提示框中,使用如下配置

出现一个选单,除了预设的项目外,我们必须再选择下列几个常用的项目:CTYPE、CURL、EXIF、FOLTER、FTP、GD、GETEXT、GMP、MBSTRING、MCRYPT、MYQL、PDF、IMAP、PCRE、SESSION、SOCKETS、ZLIB、ZIP。这些项目非常常用,尤其是 SESSION。
然后还会出现一个选单,保持默认就可以了:

然后这个要选上:

毕竟这是老外“希望”中国人用的东西。
安装完成后,运行cp –rp /usr/local/etc/php.ini-dist /usr/local/etc/php.ini #php5
5.安装 MySQL
使用如下指令
# cd /usr/ports/databases/mysql50-server
# make install clean
# cd /usr/ports/databases/php5-mysql
# make install clean
6. Apache2.2.X 基本设定
安装完 Apache 后,我们必须先进行一些基本设定才可以开始使用。本节中,我们先介绍较常使用的设定项目,让您可以快速的设定好网页服务器,而更详细的 Apache 设定将于下一小节中说明。Apache 的设定档位于:
/usr/local/etc/apache22/httpd.conf、/usr/local/etc/apache22/extra/httpd-languages.conf、/usr/local/etc/apache22/extra/httpd-default.conf。
设定/usr/local/etc/apache22/httpd.conf
ServerAdmin 设定管理者邮件
设定您的信箱,这个信箱地址当网页出现错误讯息时将出现在该页面上。以下范例为默认值:
ServerAdmin you@example.com
ServerName 设定主机名称及端口号
ServerName 可以让您设定您的主机名称,如果您没有主机名称,可以设定为您机器所使用的 IP。ServerName 会被用来重新转向网址,例如,当您输入一个网址 「http://www.example.com/dir」时,Apache 会参考您在 ServerName 中的设定,将 www.example.com 改成 ServerName,并在您所输入的网址后加上一个斜线「/」以连到 dir 目录中,也就是将网址转向到「http://www.example.com/dir/」。如果您的网址设定不正确,则使用者可能会连到一个不存在的地址。
所以,如果您没有主机名称,可以将这个值设定为 IP,让网址转向后还是可以连到正确的地方。在 ServerName 的设定中,我们也指定了 HTTP 的连接埠 80。
ServerName www.example.com:80
DocumentRoot 设定网页根目录
DocumentRoot 可以让我们指定网页根目录的位置,也就是我们存放网页的目录。
DocumentRoot "/usr/local/www/apache22/data"
设定好 DocumentRoot 后,我们必须要再设定该目录的权限。在 DocumentRoot 之后,有下列区段:(中间有些#掉的注释)
Options Indexes FollowSymLinks 注解这项
#Options Indexes FollowSymLinks
AllowOverride None
order allow,deny
Allow from all
您必须将 也改成您的网页根目录位置。
DirectoryIndex 指定预设网页档名
DirectoryIndex index.html index.htm index.php index.php3 index.cgi index.pl
当使用者使用网址「http://www.example.com/dir」连到一个目录中时,如果没有指定网页,Apache 会去查找 DirectoryIndex 中所设定的网页在不在,如果存在则秀出预设的网页。
加入 PHP 支持
如果您要使用 PHP,则必须在 httpd.conf 中加入 PHP 的支持,请在 httpd.conf 档案其它AddType周围加入下列内容,以便归类:
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
取消 #AddHandler cgi-script .cgi 前的 # ,并加 .pl 以支持 cgi , pl 如: AddHandler cgi-script .cgi .pl
上述设定完成后,您就可以存盘离开。 接下来,我们必在修改 /etc/rc.conf ,并加入下列设定以在开机时启动 Apache:
apache22_enable="YES"
重启虚拟机后,打开网页http://IP/ (请将 IP 改成您的虚拟机 IP),显示It works!,不像原来,有个漂亮的页面。
我们可以在网页根目录中新增一个档案来测试 PHP 是否有正常运作,请使用文书编辑软件在/usr/local/www/apache22/data下开一个新文件 test.php,并加入下列内容:
phpinfo();
?>
接下来您就可以连到该网页 http://IP/test.php (请将 IP 改成您的虚拟机 IP) 看看是否可以使用 PHP。如果有支持 PHP,则会显示 PHP 组态,如果没有,则只会出现上述档案内容。
7、 MySQL5.0.33 基本设定
修改 /etc/rc.conf 并加入下列这一行,以让开机时启动 MySQL:
mysql_enable="yes"
接着您就可以使用下列指令启动 MySQL 了:
# /usr/local/etc/rc.d/mysql-server start
启动 MySQL 后,我们就可以使用下列指令进入 MySQL 交互式命令列了:
# /usr/local/bin/mysql mysql
若安装成功,你将看到以下画面:

MySQL 刚安装完成时,并未设定 root 的密码,因此我们接着要设定 root 的密码并实时更新设定:
mysql> Update user SET password=password('你的密码') where user='root';
Query OK, 2 rows affected (0.01 sec)
Rows matched: 2 Changed: 2 Warnings: 0
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
最后请以 exit; 来离开 MySQL。
8、安装ZendOptimizer 3.2.8
cd /usr/ports/devel/ZendOptimizer
make install clean
根据提示,一直回答OK就可以了,
9、FTP 基本设定(以便上传其它测试网页)
在这里,我们使用内建的vsftp。
使用 inetd 的方式启动 FTP 服务器。首先,请编辑 /etc/inetd.conf,将 ftp 设定开头的 # 移除:
ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l
ftp stream tcp6 nowait root /usr/libexec/ftpd ftpd -l
然后在 /etc/rc.conf 中加入
inetd_enable="YES"
接下来,我们重启虚拟机,就可以开始使用FreeBSD的FTP服务了。
10.经验教训
按本教程安装的话,不要改变安装顺序,否则会因为依赖关系而产生某些地方:少则要写几句多则某些东西要重装。









