标签 freebsd 下的文章

最近发现某服务器上个别网站的带宽占用情况超出预估,打算为她的 Apache 安装一个针对虚拟主机的带宽限制模块。最后选定 mod_bandwidth 来实现。

#wget http://www.ivn.cl/apache/files/source/mod_bw-0.8.tgz
#tar -xzvf mod_bw-0.8.tgz
#apxs -i -a -c mod_bw.c
#cp .libs/mod_bw.so /usr/local/apache/modules/
#vi /etc/apache/httpd.conf
增加:

LoadModule bw_module modules/mod_bw.so 为 Apache 虚拟主机配置文件增加带宽限制项:

#vi /etc/apache/extra/httpd-vhost.conf 具体设置可以参考官方网站的文档。我这里设置成:开启带宽限制、强制全部类型传输使用带宽限制、在该虚拟主机上单线程带宽限制在 100Kb/s、且每个连接均有拥有独立的 100Kb/s 的带宽。其配置类似这样:

BandWidthModule On
ForceBandWidthModule On
BandWidth all 102400
MinBandWidth all -1

公司的服务器组遍布伟大祖国的大江南北,操作系统也都不相同。最近使用 Cacti + RRDTool + Net-SNMP 对这些服务器实施了统一的性能监控管理。单纯的 Cacti 不是监控工具,她基于 AMP 环境和 SNMP 协议,使用 snmpget 获取流量数据,使用 RRDTool 组件绘图。并且 Cacti 有个别名,叫做“仙人掌”。她的界面非常漂亮,你根本无需明白那些 RRDTool 的复杂参数就能轻易地绘出漂亮的图形。另外,她提供了强大的数据管理和用户管理功能,可以与 LDAP 结合进行用户的验证。还提供了自定义模板的功能,让你添加自己的 snmp_query 和 script。可以说,Cacti 将 RRDTool 复杂难懂的缺点都补足了。所以,Cacti 被认识是 MRTG 的最佳替代品。

1、监控管理端配置

监控端基于 FreeBSD 6.2 操作系统、AMP(ApacheMySQLPHP)环境,其安装配置过程在此不赘述,请寻求搜索引擎的帮助。值得注意的是,PHP 最好加上 SNMP 的支持。在编译的时候,加上 -enable-snmp。另外,PHP 不能运行在安全模式下,否则 Cacti 将不正常,无法调用 /usr/local/bin/ 下面的文件。除此之外,有一种说法称 MySQL 5 以上的版本不能正常运行 Cacti,就我的个人测试,暂未发现类似的情况。

安装完 AMP 之后开始下载并安装 RRDTool。值得注意的是,RRDTool 1.2.x 版本是用 libart 和 freetype 画图,相比 1.1.x 版本,前者的绘图速度会稍稍慢一些。从 1.2.x 版本开始,RRDTool 不再自带外部的 lib 库,所以需要从这里下载这些库来安装。而 1.1.x 版本自带了 GD 库,可惜这个 GD 库不支持中文,绘中文的时候会出现乱码。

这里选用 1.2.26 版本的 RRDTool,所以需要先安装 lib 库。

安装 cgilib

#tar -zxvf cgilib-0.5.tar.gz
#cd cgilib-0.5
#vi cgi.c
去掉:

#include <malloc.h> 然后:

#vi cgitest.c 将第 116 行

printf ("<h3>Cookie "Library" set</h3>\n"); 改为:

printf ("<h3>Cookie \"Library\" set</h3>\n"); 因为 cgilib 版本为 linux 版本,用 make 无法安装,所以:

#gmake
#gmake install
#cp *.h /usr/include/
#cp libcgi* /usr/lib
安装 zlib

#tar -zxvf zlib-1.2.2.tar.gz
#cd zlib-1.2.2
#./configure --prefix=/usr
#make
#make install
安装 libpng

#tar -zxvf libpng-1.2.8-config.tar.gz
#cd libpng-1.2.8-config
#cp scripts/makefile.gcmmx makefile
#./configure --disable-shared --prefix=/usr
#make
#make install
安装 freetype(需事先安装 gmake):

#tar -zxvf freetype-2.1.10.tar.gz
#mv /usr/bin/make /usr/bin/make.bak
#./configure --disable-shared --prefix=/usr
#make
#make install
#mv /usr/bin/make.bak /usr/bin/make
安装 libart_lgpl

#tar -zxvf libart_lgpl-2.3.17.tar.gz
#./configure --disable-shared --prefix=/usr
#make
#make install
安装 RRDTool

#tar -zxvf rrdtool-1.2.6.tar.gz
#./configure
#make
#make install
#cp /usr/local/rrdtool/bin/* /usr/local/bin/
#ln -s /usr/local/rrdtool-1.2.6 /usr/local/rrdtool
安装 net-snmp

#tar -zxvf net-snmp-5.2.1.2.tar.gz
#cd net-snmp-5.2.1.2
#./configure
#make
#make install
安装完成后运行 snmpget、snmpwalk 测试是否安装成功。

安装 Cacti

#cp cacti-0.8.7a.tar.gz /www
#cd /www/
#tar -xzvf cacti-0.8.7a.tar.gz
#mv cacti-0.8.7a cacti
#chown -R www:www cacti/
分配数据库权限:

#mysql -u root -p
mysql>create database cacti;
mysql>grant all privileges on cacti.* to cactiuser@localhost 
identified by 'password';
mysql>quit;
修改 Cacti 配置文件:

#vi /www/cacti/include/config.php
$database_type = "mysql";
$database_default = "cacti";
$database_hostname = "localhost";
$database_username = "cactiuser";
$database_password = "password";
导入数据库:

/usr/local/mysql/bin/mysql -u root -p cactidb < /www/cacti/cacti.sql 设置刷新时间:

#crontab -e
*/1 * * * * /usr/local/php/bin/php /www/cacti/poller.php > /dev/null 2>&1
这里的 */1 代表每一分钟执行一次。

2、被监控端配置

2.1、FreeBSD 系统

未完待续。

2.2、Windows 2003 系统

未完待续。

今天在一台几乎废弃的 freebsd 服务器上折腾,删除了里面的 postfix 邮件系统。折腾完毕修改了 /etc/rc.conf,去掉了 hostname 键,reboot 之后发现 apache 没有自动启动,手动启动也失败。通过 apachectl configtest 检查结果是 Syntax OK,于是去找 /var/log/http_error.log,错误日志如下:
[Sat Dec 15 00:17:43 2007] [alert] (EAI 8)hostname nor servname provided, or not known: mod_unique_id: unable to find IPv4 address of ""
Configuration Failed

查了资料,修改 httpd.conf,将下面一行注释掉就可以了:
LoadModule unique_id_module libexec/apache2/mod_unique_id.so

在 apache 手册上查到这个 unique_id_module 模块的概述:
This module provides a magic token for each request which is guaranteed to be unique across "all" requests under very specific conditions. The unique identifier is even unique across multiple machines in a properly configured cluster of machines. The environment variable UNIQUE_ID is set to the identifier for each request. Unique identifiers are useful for various reasons which are beyond the scope of this document.

大概意思就是给每个请求提供一个唯一标识的环境变量,具体说明在这里

再次启动 apache 还发现一个报错:
No such file or directory: Failed to enable the 'httpready' Accept Filter

曾经在某网的一篇文章上看过,google 找到相关资料,说这貌似是 freebsd 与 apache2 之间的一个小 bug。解决方案如下:
# kldload accf_http
# vi /boot/defaults/loader.conf

找到下面这行:
accf_http_load = "NO"

将 NO 改为 YES 就可以了。