lvs+HA+squid搭建稳定上网服务[原创]

今天有人在群里喊谁做过lvs+squid,正好以前做过一个,我就把过程整理下来,供大家参考。首先看看拓扑图如下
说下我写这篇文章所用的测试环境,vmvare6.0,模拟两个linux,用的是centos5.1
squid-1(192.168.211.128)
squid-2(192.168.211.130)
Vip(192.168.211.135)
实现方式lvs-dr
1,lvs配置部分
安装lvs所需要的软件

yum -y install heartbeat

yum y install heartbeatldirectord

yum -y install heartbeat-devel

yum y install ipvsadm

配置Ldirector
vi /etc/ha.d/ldirectord.cf设置如下内容,两台机器文件内容相同

# Global Directives

checktimeout=3

checkinterval=1

autoreload=yes

logfile=“/var/log/ldirectord.log”

logfile=“local0”

#emailalert=“admin@x.y.z”

#emailalertfreq=3600

#emailalertstatus=all

quiescent=yes

# Sample for an http virtual service

virtual=192.168.211.135:3128

real=192.168.211.128:3128 gate

real=192.168.211.130:3128 gate

scheduler=rr

#persistent=600

#netmask=255.255.255.255

protocol=tcp

checktype=negotiate

checkport=3128

配置heartbeat

vi /etc/ha.d/ha.cf

debugfile /var/log/ha-debug

logfile /var/log/ha-log

logfacility local0

keepalive 2

deadtime 30

warntime 10

initdead 120

udpport 694

ucast eth0 192.168.211.130 #另外一台这里要设置成另外的ip

auto_failback on

node contos5-1-1 #通过uanme -n得到

node contos5-1-2

ping_group group1 192.168.211.128 192.168.211.130

respawn hacluster /usr/lib/heartbeat/ipfail

这里之所以使用ucast而不用bcast是因为,如果同网段你还有另外的一套lvs的话,bcast广播也会发到这套lvs里,虽说应用上不会给另外一套lvs带来影响,但日志里会出现很多错误

cp /usr/share/doc/heartbeat-2.1.3/authkeys /etc/ha.d/

vi /etc/ha.d/authkeys,将如下两行的注释去掉

# crc adds no security , except from packet corruption.

# Use only on physically secure networks.

#

auth 1

1 crc

#2 sha1

#3 md5

chomd 600 /etc/ha.d/authkeys

vi /etc/ha.d/haresources文件,加入

contos5-1-1 closelo 192.168.211.135 ldirectord::ldirectord.cf startlo

在/etc/ha.d/resource.d下建立closelo脚本,内容如下

#!/bin/sh

VIP=192.168.211.135

case “$1” in

start)

# close lo:0 interface

echo $“Close lo:0 interface”

/sbin/route del -host $VIP dev lo:0

/sbin/ifconfig lo:0 down

echo “0” > /proc/sys/net/ipv4/conf/all/arp_announce

echo “0” > /proc/sys/net/ipv4/conf/all/arp_ignore

echo “0” > /proc/sys/net/ipv4/conf/lo/arp_announce

echo “0” > /proc/sys/net/ipv4/conf/lo/arp_ignore

;;

stop)

# start lo:0 interface

echo $“Start lo:0 interface”

/sbin/ifconfig lo:0 $VIP/32 broadcast $VIP up

/sbin/route add -host $VIP dev lo:0

echo “2” > /proc/sys/net/ipv4/conf/all/arp_announce

echo “1” > /proc/sys/net/ipv4/conf/all/arp_ignore

echo “2” > /proc/sys/net/ipv4/conf/lo/arp_announce

echo “1” > /proc/sys/net/ipv4/conf/lo/arp_ignore

;;

*)

echo $“Usage: $0 (start|stop)”

exit 1

;;

esac

/etc/ha.d/resource.d下建立startlo脚本

# ! /bin/sh

VIP=192.168.211.135

case “$1” in

stop)

# close lo:0 interface

echo $“Close lo:0 interface”

/sbin/route del host $VIP dev lo:0

/sbin/ifconfig lo:0 down

echo “0” > /proc/sys/net/ipv4/conf/all/arp_announce

echo “0” > /proc/sys/net/ipv4/conf/all/arp_ignore

echo “0” > /proc/sys/net/ipv4/conf/lo/arp_announce

echo “0” > /proc/sys/net/ipv4/conf/lo/arp_ignore

; ;

start)

# start lo:0 interface

echo $“Start lo:0 interface”

/sbin/ifconfig lo:0 $VIP/32 broadcast $VIP up

/sbin/route add host $VIP dev lo:0

echo “2” > /proc/sys/net/ipv4/conf/all/arp_announce

echo “1” > /proc/sys/net/ipv4/conf/all/arp_ignore

echo “2” > /proc/sys/net/ipv4/conf/lo/arp_announce

echo “1” > /proc/sys/net/ipv4/conf/lo/arp_ignore

; ;

* )

echo $“Usage: $0 (start|stop)”

exit 1

; ;

esac

到此,lvs部分就全部完成了,接下来说squid的设置,具体配置我就不写了,网上这方面的文章很多,我仅仅完成一个可以做正向代理的出来

squid我使用的是3.0stable8
./configure –prefix=/usr/local/squid
make && make install
完成安装后,配置文件内容如下

visible_hostname 2

acl manager proto cache_object

acl localhost src 127.0.0.1/32

acl to_localhost dst 127.0.0.0/8

acl localnet src 10.0.0.0/8 # RFC1918 possible internal network

acl localnet src 172.16.0.0/12 # RFC1918 possible internal network

acl localnet src 192.168.0.0/16 # RFC1918 possible internal network

acl SSL_ports port 443

acl Safe_ports port 80 # http

acl Safe_ports port 21 # ftp

acl Safe_ports port 443 # https

acl Safe_ports port 70 # gopher

acl Safe_ports port 210 # wais

acl Safe_ports port 1025-65535 # unregistered ports

acl Safe_ports port 280 # http-mgmt

acl Safe_ports port 488 # gss-http

acl Safe_ports port 591 # filemaker

acl Safe_ports port 777 # multiling http

acl CONNECT method CONNECT

acl purge method PURGE

http_access allow manager localhost

http_access deny manager

http_access deny !Safe_ports

http_access deny CONNECT !SSL_ports

http_access allow purge localhost

http_access allow localnet

http_access deny all

icp_access allow localnet

icp_access deny all

htcp_access allow localnet

htcp_access deny all

#always_direct allow all

#http_port 80 accel vhost vport

http_port 3128

hierarchy_stoplist cgi-bin ?

access_log /usr/local/squid/var/logs/access.log squid

cache_dir ufs /usr/local/squid/cache 10 2 4

refresh_pattern ^ftp: 1440 20% 10080

refresh_pattern ^gopher: 1440 0% 1440

refresh_pattern (cgi-bin|?) 0 0% 0

refresh_pattern . 0 20% 4320

cache_effective_user squid

cache_effective_group squid

然后启动squid,接下来就可以测试了,到此一个可用的而且强健的双机squid就完成了(除非两台机器同时挂掉)

注:每次启动heartbeat前,请先执行 /etc/ha.d/resource.d/closelo脚本,使得lo:o网卡启动,不然这套配置将不起作用了,我目前还没有找到更好的解决办法

如对以上配置有何不明了的还请提出共同讨论

squid3.0泛域名的实现[原创]

squid的安装配置我就不详细介绍了,网上相关的文章很多,我主要来说说我是如何实现用squid3.0实现泛域名的,我使用的是squid 3.0stable9版本
安装配置好squid后在squid的中添加如下几行

http_port 80 transparent或者http_port 80 accel vhost vport

cache_peer 192.168.0.10 parent 80 0 no-query originserver name=web
cache_peer_domain web .abc.com

然后保存退出

之后重启squid,接下来就可以用ie进行测试了

squid中cache_peer的sibling用法[原创]

提高squid命中率和使用效率是每个系统管理员都希望的一件事,毕竟在现有资源中榨干每一份的资源是必须滴,使用nginx的按url做定向投递,自然能提高squid的命中和效率,但毕竟公司目前没有这个条件,这个自然没法子实施,我就想到了另外的一个方法,就是今天的主角,cache_peer中的sibling。

先说说我的思路

如果有5台squid,每台的缓存空间是10G,估计每台能缓存静态文件110W个,如果前端放置f5或其他负载均衡设备,把所有请求的url都采用轮询的方式投递给squid,那最终每台squid上缓存住的静态文件几乎都是相同的,对于一个中小型的网站来说110W量的静态文件已经几乎是所有的静态文件了,但对于以在线漫画,或者图片为服务的网站来讲,静态文件将远远不止这个数量。

如果能让每台squid上缓存的都是独立的静态文件,那这组服务器所能缓存的文件将是原来能力的5倍,当然,前面提到了nginx的按url做定向投递可以解决这个问题,但这不是我要说的重点,其实用squid自己的堆叠就可以实现了,即cache_peer里的sibling

sibling是通过icq向同伴squid发送请求,一旦在同伴squid中发现了缓存命中,则由这个缓存命中返回给客户端,如果没有发现则到parent的squid去拿或者到realserver去拿

有了这个概念那就是说如果http://www.aaa.ccc/a.jpg发送过来了,如果a上没有,就会到b上找,如果有就反给客户端,如果没有会再去c上找如果最后都没有由a到后端parent或者realserver上取

下面看一个例子,我用vmware模拟了两个linux,上面分别跑了一个squid,

a上的配置,a的ip:192.168.220.128

icp_port 3130

icp_access allow all

cache_peer 61.152.242.1 parent 80 0 no -query originserver name=www2
cache_peer_domain www2 www.tgbus.com

b上的配置,b的ip:192.168.220.130

icp_port 3130

icp_access allow all

cache_peer 192.168.220.128 sibling 80 3130 proxy -only name=cache
cache_peer 61.152.242.1 parent 80 0 no -query originserver name=www2
cache_peer_domain cache www.tgbus.com
cache_peer_domain www2 www.tgbus.com

测试

修改本机本机hosts,先把www.tgbus.com指向到192.168.220.128上访问一遍,让220.128上有一份静态的缓存
然后把www.tgbus.com指向到192.168.220.130上,然后访问,可以看下两台机器上的日志
a的

1233463229.874 0 192.168.220.130 UDP_MISS/000 42 ICP_QUERY http: / /www.tgbus.com/ - NONE / - -
1233463231.555 0 192.168.220.130 UDP_HIT/000 51 ICP_QUERY http: / /www.tgbus.com/style.css - NONE / - -
1233463231.557 0 192.168.220.130 TCP_IMS_HIT/304 210 GET http: / /www.tgbus.com/style.css - NONE / - text /css
1233463231.596 0 192.168.220.130 UDP_MISS/000 67 ICP_QUERY http: / /www.tgbus.com/index/domain/Images/3.jpg - NONE / - -
1233463231.602 0 192.168.220.130 UDP_HIT/000 59 ICP_QUERY http: / /www.tgbus.com/images/v3/lqs.jpg - NONE / - -
1233463231.603 0 192.168.220.130 UDP_MISS/000 67 ICP_QUERY http: / /www.tgbus.com/index/domain/Images/4.jpg - NONE / - -
1233463231.605 0 192.168.220.130 TCP_IMS_HIT/304 212 GET http: / /www.tgbus.com/images/v3/lqs.jpg - NONE / - image/jpeg
1233463231.609 0 192.168.220.130 UDP_HIT/000 67 ICP_QUERY http: / /www.tgbus.com/index/tvgame/images/1.jpg - NONE / - -
1233463231.612 0 192.168.220.130 TCP_IMS_HIT/304 212 GET http: / /www.tgbus.com/index/tvgame/images/1.jpg - NONE / - image/jpeg
1233463231.615 0 192.168.220.130 UDP_HIT/000 67 ICP_QUERY http: / /www.tgbus.com/index/tvgame/images/2.jpg - NONE / - -
1233463231.618 0 192.168.220.130 TCP_IMS_HIT/304 212 GET http: / /www.tgbus.com/index/tvgame/images/2.jpg - NONE / - image/jpeg
1233463231.619 0 192.168.220.130 UDP_HIT/000 67 ICP_QUERY http: / /www.tgbus.com/index/tvgame/images/4.jpg - NONE / - -
1233463231.619 0 192.168.220.130 UDP_HIT/000 58 ICP_QUERY http: / /www.tgbus.com/images/v3/mc.jpg - NONE / - -
1233463231.623 1 192.168.220.130 TCP_IMS_HIT/304 212 GET http: / /www.tgbus.com/index/tvgame/images/4.jpg - NONE / - image/jpeg
1233463231.623 1 192.168.220.130 TCP_IMS_HIT/304 212 GET http: / /www.tgbus.com/images/v3/mc.jpg - NONE / - image/jpeg

b的

1233490583.540 269 192.168.220.1 TCP_MISS/200 57811 GET http: / /www.tgbus.com/ - FIRST_UP_PARENT/www2 text /html
1233490585.753 3 192.168.220.1 TCP_MISS/304 271 GET http: / /www.tgbus.com/style.css - SIBLING_HIT/cache text /css
1233490585.845 5 192.168.220.1 TCP_MISS/304 273 GET http: / /www.tgbus.com/images/v3/lqs.jpg - SIBLING_HIT/cache image/jpeg
1233490585.857 5 192.168.220.1 TCP_MISS/304 273 GET http: / /www.tgbus.com/index/tvgame/images/1.jpg - SIBLING_HIT/cache image/jpeg
1233490585.862 4 192.168.220.1 TCP_MISS/304 273 GET http: / /www.tgbus.com/index/tvgame/images/2.jpg - SIBLING_HIT/cache image/jpeg
1233490585.868 5 192.168.220.1 TCP_MISS/304 273 GET http: / /www.tgbus.com/index/tvgame/images/4.jpg - SIBLING_HIT/cache image/jpeg
1233490585.868 5 192.168.220.1 TCP_MISS/304 273 GET http: / /www.tgbus.com/images/v3/mc.jpg - SIBLING_HIT/cache image/jpeg
1233490585.871 4 192.168.220.1 TCP_MISS/304 273 GET http: / /www.tgbus.com/index/tvgame/images/3.jpg - SIBLING_HIT/cache image/jpeg
1233490585.873 3 192.168.220.1 TCP_MISS/304 273 GET http: / /www.tgbus.com/index/tvgame/images/5.jpg - SIBLING_HIT/cache image/jpeg
1233490585.885 4 192.168.220.1 TCP_MISS/304 272 GET http: / /www.tgbus.com/Images/v3/hot.gif - SIBLING_HIT/cache image/gif
1233490585.907 3 192.168.220.1 TCP_MISS/304 272 GET http: / /www.tgbus.com/Images/v3/tvgame.gif - SIBLING_HIT/cache image/gif
1233490585.943 3 192.168.220.1 TCP_MISS/304 272 GET http: / /www.tgbus.com/Images/v3/league.gif - SIBLING_HIT/cache image/gif
1233490586.382 555 192.168.220.1 TCP_MISS/304 292 GET http: / /www.tgbus.com/index/domain/Images/3.jpg - FIRST_UP_PARENT/www2 -
1233490586.477 11 192.168.220.1 TCP_MISS/304 273 GET http: / /www.tgbus.com/index/comic/images/manhua01.jpg - SIBLING_HIT/cache image/jpeg
1233490586.479 11 192.168.220.1 TCP_MISS/304 273 GET http: / /www.tgbus.com/index/comic/images/manhua02.jpg - SIBLING_HIT/cache image/jpeg
1233490586.479 11 192.168.220.1 TCP_MISS/304 273 GET http: / /www.tgbus.com/index/comic/images/manhua03.jpg - SIBLING_HIT/cache image/jpeg

由上面可以看到,在b上tcp_miss的大部分在a上都是sibling_hit的,这样说来,我的想法还是成立的,可以达到提高squid命中与效率,增大缓存容量的作用

使用nginx的url_hash提高squid的使用率[原创]

上次我说了使用squid自己的堆叠机制实现提高squid使用率的方法,这次再来说说和nginx搭配使用提高多台squid的使用率,目标当然是使用有限的squid服务器,缓存住更多的静态文件。

首先进到nginx的目录
执行patch -p0 < /path/to/upstream/hash/directory/nginx.patch

然后在安装的时候加上
–add-module=path/to/upstream/hash/directory

我的测试环境vmvare 模拟3个linux
ip分别:nginx 192.168.211.130
squid01 192.168.211.128
squid02 192.168.211.129
测试网站我反向代理www.tgbus.com

这样nginx上编译完成需要配置,内容如下

http {

upstream www.tgbus.com {
server 192.168.211.128;
server 192.168.211.129;
hash $request_uri;
}
server {
listen 80;
server_name www.tgbus.com;
location / {
proxy_pass http: / /bbs.tgbus.com;
}
}
}

然后启动nginx

两个squid就配置成标准的反向代理就可以了,主要配置如下

cache_peer 61.152.242.1 parent 80 0 no -digest no -query originserver name=www
cache_peer_domain www www.tgbus.com

然后启动squid

修改自己电脑的hosts,把www.tgbus.com的ip指向到nginx那台虚拟机的ip上,接下来就可以测试了
打开两台squid的日志,用tail -f的方式,然后访问www.tgbus.com,可以看到两边的日志的内容是不一样的,从其中一台squid的日志中找一条静态文件的url,通过ie 打开,可以发现,这个url的访问只投到同一台squid上,如此实现了,squid缓存的内容不同,从而增加了squid的缓存容量
当然,如果中间只使用一台nginx,自然这台会成为单点而造成隐患,所以可是使用heartbeat做成双机,增加系统的可靠性。

(更新版)通过脚本人为有选择性的更新squid的cache

squid 缓存文件的格式是DBase 3 data file,使用cat命令虽然也是可以看到里面的内容的,但格式混乱,如果想取出我们需要的东西,相对来说比较的麻烦,linux下有个stings命令,这条命令可以显示可打印的文本,这样,对cache文件进行stings的话,就可以把文本的部分显示出来了,而且每条记录是一行,这样一来,让我想到了以前我在张宴那个脚本基础上进行修改后的脚本就又可以进行第二次的改良了,下面我就把改良的内容写出如下
 
先看下原始cache文件的内容
再看看用stings转换后的内容

脚本文件名:clear_squid_cache.sh

注意:请赋予clear_squid_cache.sh可执行权限(命令:chmod +x ./clear_squid_cache.sh)。请确保脚本所在目录可写。

设置:
  squidcache_path= 表示squid缓存目录的路径
  squidclient_path= 表示squidclient程序所在的路径,默认为squid安装目录下的bin/squidclient
用法:
  1、清除所有Flash缓存(扩展名.swf):
  ./clear_squid_cache.sh swf

  2、清除URL中包含sina.com.cn的所有缓存:
  ./clear_squid_cache.sh sina.com.cn

  3、清除文件名为/images/的所有缓存:
  ./clear_squid_cache.sh /images/

如果对于频繁更新的gif或者什么,可以在crontab中添加对应的命令行
0 * * * * /usr/local/bin/clear_squid_cache.sh gif &
这样就会每隔一个小时进行一次刷新操作了,很是方便
如果需要让图片更新人员自行刷新的话,就可以找相应的人员开发web页面,进行对脚本的调用就可以了
 

注:以上cache内容摘取自squid3.0,2.x版本是否可以使用还请各位验证,总之3.0使用这个脚本后,准确率已经基本能达到100%了,对于以前有了很大程度的提高

原始脚本请参考张宴blog

mysql-proxy安装[原创]

最近在学mysql-proxy,今天先把安装过程写出来

mysql-proxy需要lua和mysql的支持
lua的下载可以去http://www.lua.org/ftp/
mysql的下载就去www.mysql.com就行
首先是lua的安装
32位的

tar zxvf lua-5.1.4.tar.gz
cd lua-5.1.4
make linux
make install

64位系统的

tar zxvf lua-5.1.4.tar.gz
cd lua-5.1.4
vi Makefile
INSTALL_TOP= /usr
INSTALL_BIN= $(INSTALL_TOP)/bin
INSTALL_INC= $(INSTALL_TOP)/include
INSTALL_LIB= $(INSTALL_TOP)/lib64
INSTALL_MAN= $(INSTALL_TOP)/man/man1

INSTALL_LMOD= $(INSTALL_TOP)/share/lua/$V

INSTALL_CMOD= $(INSTALL_TOP)/lib64/lua/$V

保存退出

make linux
make install

安装好lua后,接下来安装mysql-proxy

tar zxvf mysql-proxy-0.6.1.tar.gz
cd mysql-proxy-0.6.1

64位系统执行

export LUA_LIBS="-L/usr/lib64/lua/5.1/ -llua -lm"
export LUA_CFLAGS=" "

32位系统执行

export LUA_LIBS="-L/usr/local/lib/lua/5.1/ -llua -lm"
export LUA_CFLAGS=" "

接下执行

./configure --with-mysql=/pathto/yourmysqldir/bin/mysql_config LDFLAGS="-ldl"
make
make install

如果没有报错基本就是安装成功,如果过程中报相应的错误,请安装相应的缺失文件即可了

安装到此就结束了,继续去学习了。有问题再讨论吧

cfengine学习笔记03[原创]

终于到最后一篇了,也就是cfengine最便捷的所在了,让你只通过一台机器管理你想要管理的任意一个或多个服务器,是不是很神奇,请往下看

前两篇已经把基本的配置都写好且配置好了,这里我仅仅捡关键的写了,cfservd.conf,update.conf及供维护服务器端使用的cfagent.conf文件参考上篇文章,这片文章中我们仅仅需要配置cfrun.hosts文件
内容如下

#
# This is the host list for cfrun
#
# Only these hosts will be contacted by remote connection
#

domain=b.c #设置域
access=root #设置需要访问的用户

192.168.220.130 #维护主机的ip,每个写一行

这样一切准备就绪后,就可以执行/var/cfengine/bin/cfrun -v了,显示结果如下


Domain name = b.c

GNU Cfengine server daemon –

2.2.8

Free Software Foundation 1994-

Donated by Mark Burgess, Oslo University College, Norway

————————————————————————

Host name is: conversion.localhost

Operating System Type is linux

Operating System Release is 2.6.18-8.el5xen

Architecture = i686

Using internal soft-class linux for host linux

The time is now Wed Oct 15 21:53:51 2008

————————————————————————

Additional hard class defined as: 32_bit

Additional hard class defined as: linux_2_6_18_8_el5xen

Additional hard class defined as: linux_i686

Additional hard class defined as: linux_i686_2_6_18_8_el5xen

Additional hard class defined as: linux_i686_2_6_18_8_el5xen__1_SMP_Thu_Mar_15_21_02_53_EDT_2007

GNU autoconf class from compile time: compiled_on_linux_gnu

Address given by nameserver: 127.0.0.1

Checking integrity of the state database

Checking integrity of the module directory

Checking integrity of the input data for RPC

Checking integrity of the output data for RPC

Checking integrity of the PKI directory

Making sure that locks are private…

Loaded /var/cfengine/ppkeys/localhost.priv

Loaded /var/cfengine/ppkeys/localhost.pub

Looking for a source of entropy in /var/cfengine/randseed

cfrun(0): .......... [ Hailing 192.168.220.130 ] ..........
Connecting to server 192.168.220.130 to port 0 with options
Loaded /var/cfengine/ppkeys/root-192.168.220.130.pub
Connect to 192.168.220.130 = 192.168.220.130 on port 5308
Loaded /var/cfengine/ppkeys/root-192.168.220.130.pub

...............................................................
cfrun:conversion.localhost: Strong authentication of server=192.168.220.130connection confirmed
192.168.220.130 replies..

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

cfengine:test:
Executing script /usr/bin/rsync -r no@192.168.220.129::software/upload/ /tmp/test/...(timeout=0,uid=-1,gid=-1)
cfengine:aoyun-web-2: Finished script /usr/bin/rsync -r no@192.168.220.1129::software/upload/ /tmp/test/
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Connection with 192.168.220.130 completed

以上是执行的全过程,我做了一个rsync的操作,这样如果要是需要很多台server同时手动rsync操作或其他操作的话,就可以使用这个了


总之cfengine还是很强大的,cfagent.conf配置文件中有需要参数可以调整,还希望大家在实际使用当中仔细学习了。

cfengine学习笔记02[原创]

书接上回,上次介绍的只是单独使用cfagent程序来完成任务,今天说下cfservd和cfagent配合使用的方法,应用环境和上次的一样,

先在A上的/var/cfengine目录下建立master/inputs文件夹
目录结构如下

/var/cfengine/
|-inputs #用于放置相应的配置文件
|-outputs #程序执行后的输出,通常里面没内容
|-bin #cfengine可执行文件放置的位置

|-master/

|-inputs #用户存放客户机需要的cfagent.conf文件

上面红色的是这次新建立的


在A上放入的master/inputs文件下放入cfagent.conf文件内容如下


##################################################
#
# cfagent.conf
#
# This is a simple file for getting started with
# cfengine. It is harmless. If you get cfengine
# running with this file, you can build on it.
#
##################################################

###
#
# BEGIN cfagent.conf (Only hard classes in this file )
#
###

control:

actionsequence = ( shellcommands ) #定义要执行的动作,此处是执行一个shell命令

domain = ( test.com ) #定义域名

timezone = ( MET ) #定义时区

######################################################################
shellcommands: #需要执行的shell命令

"/bin/touch /tmp/2" #在/tmp目录下建立2这个文件
######################################################################

###
#
# END cfagent.conf
#
###

然后在A的/var/cfengine/inputs文件夹下建立cfservd.conf,内容如下

#########################################################
#
# This is a cfd config file
#
# The access control here follows after any tcpd
# control in /etc/hosts.allow and /etc/hosts.deny
#
#########################################################

#
# Could import cf.groups here and use a structure like
# in cfengine.conf, cf.main, cf.groups
#

control:

domain = ( b.c ) #设置域名
cfrunCommand = ( "/var/cfengine/bin/cfagent" ) #设置cfrun命令执行的命令路径

any::

IfElapsed = ( 1 ) #一个anti-spamming参数,防止client端频繁的请求解析input的文件
ExpireAfeter = ( 15 ) #设置过期时间
MaxConnections = ( 10 ) #设置最大的连接数
MultipleConnections = ( true ) #是否允许多个client端连接
AllowConnectionsFrom = ( 192.168.220 ) #允许从哪里连接,可以是网段,可以是域名
AllMultipleConnectionsFrom = ( 192.168.220 )
TrustKeysFrom = ( 192.168.220 ) #括弧中的主机会自动被信任
LogAllConnections = ( true )

#########################################################

admit: # or grant: #授权哪些机器可以访问什么目录及文件

/var/cfengine/bin/cfagent 192.168.220.*
/var/cfengine/master/inputs 192.168.220.*

现在就可以在A上启动server端了,启动命令

/var/cfengine/bin/cfservd

接下来是B上的工作,cfagent就不需要了,等下会自动从A上把需要的cfagent.conf传过来的

首先在B上建立和A同样的cfservd.conf文件,同时启动服务端,用于两台机器之间的通信用,然后在/var/cfengine/inputs文件夹中建立update.conf文件,内容如下

#######################################################
#
# cf.update - for b.c
#
#######################################################

###
#
# BEGIN cf.update
#
###

#######################################################################
#
# This script distributes the configuration, a simple file so that,
# if there are syntax errors in the main config, we can still
# distribute a correct configuration to the machines afterwards, even
# though the main config won't parse. It is read and run just before the
# main configuration is parsed.
#
#######################################################################

control:

actionsequence = ( copy processes tidy ) # Keep this simple and constant
#设置要执行的动作
domain = ( b.c ) # Needed for remote copy #设置域名

#
# Which host/dir is the master for configuration roll-outs?
#

policyhost = ( 192.168.220.128 ) #主策略服务器,这里可以是A的ip或A的域名
master_cfinput = ( /var/cfengine/master/inputs )
#定义主文件放置位置,也就是cfagent.conf等需要传到client端的配置文件及shell文件放置的位置
AddInstallable = ( new_cfenvd new_cfservd )

#
# Some convenient variables
#

workdir = ( /var/cfengine ) #定义工作目录

cf_install_dir = ( /usr/local/sbin )

###################################################################
#
# Spread the load, make sure the servers get done first though
#
###################################################################

!AllBinaryServers::

SplayTime = ( 1 )

############################################################################

#
# Make sure there is a local copy of the configuration and
# the most important binaries in case we have no connectivity
# e.g. for mobile stations or during DOS attacks
#

copy: #定义copy的动作,从服务端的master_cfinput目录下把文件拷贝到local的inputs文件夹下

$(master_cfinput) dest=$(workdir)/inputs
r=inf
mode=700
type=binary
exclude=*.lst
exclude=*~
exclude=#*
server=$(policyhost)
trustkey=true

!quetzalcoatal::

$(cf_install_dir)/cfagent dest=$(workdir)/bin/cfagent
mode=755
backup=false
type=checksum

$(cf_install_dir)/cfservd dest=$(workdir)/bin/cfservd
mode=755
backup=false
type=checksum
define=new_cfservd

$(cf_install_dir)/cfexecd dest=$(workdir)/bin/cfexecd
mode=755
backup=false
type=checksum

$(cf_install_dir)/cfenvd dest=$(workdir)/bin/cfenvd
mode=755
backup=false
type=checksum
define=new_cfenvd

#####################################################################

tidy:

#
# Cfexecd stores output in this directory.
# Make sure we don't build up files and choke on our own words!
#

$(workdir)/outputs pattern=* age=7

#####################################################################

processes:

new_cfservd::

"cfservd" signal=term restart /var/cfengine/bin/cfservd

new_cfenvd::

"cfenvd" signal=kill restart "/var/cfengine/bin/cfenvd -H"

###
#
# END cf.update
#
##

到这里,update.conf文件也准备完毕了,接下来就是执行了

到现在为止,inputs下还没有cfagetn.conf文件,现在执行

/var/cfengine/bin/cfagent #前提cfagent文件已经copy到/var/cfengine/bin下
或者
/usr/local/sbin/cfagent

不过建议使用cfagent -v执行,这样就能看到执行时的信息了,当一切都完成时,如果正常,可以看到在/var/cfengine/inputs下多了cfagent.conf文件,并且在/tmp下建立了cfagent.conf中定义的2这个文件

排错:
关于排错方面,建议在A上即服务器端使用cfservd -d2来启动,这样执行的时候,服务器端就会把执行的信息显示在屏幕上,从而方便查错。
关于这个的应用,我是这样看的,可以在所有client上定义crontab,每天执行,当shellcommands需要变更时,在服务器端更新master/inputs下的cfagent.conf文件,这样client端再执行就会把新的脚本下载下来了。

cfengine学习笔记01[原创]

cfengine看了有几天了,试验也做了不少了,基本上可以说是入门了,这是一个集中管理的软件,内容分发性质的软件,可以单机使用,也可以多机使用

Cfengine 是一个令人恐怖的系统管理工具。它可自动对联网的计算机进行配置和维护,适用于所有基于UNIX或类UNIX的操作系统,并且它可以通过UNIX兼容的环境/库Cygwin 在较新版本的Windows操作系统中运行。

Cfengine目的是使简单的管理的任务自动化,使困难的任务变得较容易。它的目标是使系统从任何状态收敛到一种理想状态。依照它的作者 Mark Burgess 所说,cfengine 总是使您的系统更接近于您所定义的配置; 它决不会使系统变得更糟。

以上是cfengine网站对此软件的说明,接下来我们就开始吧

环境:vmvare模拟两个linux,hostname分别是linux01(192.168.220.128)和linux02(192.168.220.130)
http://www.cfengine.org下载cfengine的程序,目前稳定版最新的是2.2.8,
安装超级傻瓜,就三步
./configure
make
make install
执行文件被安装到了/usr/local/sbin目录下,都是cf开头的
配置文件模板被放在了/usr/local/share/cfengine目录下
接下来在/var下建立cfening文件夹,及相应的文件夹,目录结构如下

/var/cfengine/
| -inputs #用于放置相应的配置文件
| -outputs #程序执行后的输出,通常里面没内容
| -bin
#cfengine可执行文件放置的位置

文件夹建好后,就把cfengine的应用程序拷贝到bin文件夹下,当然做软连接也是可行的

cp /usr/local /sbin/cf * /var/cfengine/bin/

拷贝三个配置文件到inputs文件夹

cp /usr/local /share/cfengine/cfagent.conf.example /var/cfengine/cfagent.conf
cp /usr/local /share/cfengine/cfservd.conf.example /var/cfengine/cfservd.conf
cp /usr/local /share/cfengine/update.conf.example /var/cfengine/update.conf

先来说下几个应用程序的作用

cfagent 一个独立运行的程序(关键程序)
An autonomous configuration agent (required) .
cfservd cfengine的服务端
A file server and remote activation service (optional) .
cfexecd 计划任务和报告服务(可以替代crontab的东东)
A scheduling and report service (recommended) .
cfenvd
An anomaly detection service (strongly recommended) .
cfrun 远程控制的程序
A way of activating cfagent remotely (use this as you need to) .
cfshow
A way of examining the contents of helper databases (helper) .
cfenvgraph
Ancillary tool for cfenvd (helper) .
cfkey 生成key的程序,只需运行一次就可以了
Key generation tool (run once on every host) .

编辑inputs下的cfagent.conf文件内容如下

##################################################
#
# cfagent.conf
#
# This is a simple file for getting started with
# cfengine. It is harmless. If you get cfengine
# running with this file, you can build on it.
#
##################################################

###
#
# BEGIN cfagent.conf (Only hard classes in this file )
#
###

control:

actionsequence = ( shellcommands ) #定义要执行的动作,此处是执行一个shell命令

domain = ( test.com ) #定义域名

timezone = ( MET ) #定义时区

######################################################################
shellcommands: #需要执行的shell命令

"/bin/touch /tmp/2" #在/tmp目录下建立2这个文件
######################################################################

###
#
# END cfagent.conf
#
###

动作类型包含以下几种,这里举例只使用了shellcommands

groups, control, copy, homeservers, binservers, mailserver, mountables,import, broadcast, resolve, defaultroute, directories, miscmounts,files, ignore, tidy, required, links, disable, shellcommands,strategies,editfiles, processes

保存退出后,执行/var/cfengine/bin/cfagent -v,然后可以看到如下结果

********************************************************************* Main Tree Sched: shellcommands pass 1 @ Mon Sep 22 19:33:57 2008 ********************************************************************* cfengine:linux01: Executing script /bin/touch /tmp/2…(timeout=0,uid=-1,gid=-1) (Setting umask to 77) cfengine:linux01: Finished script /bin/touch /tmp/2 Performance(Exec(/bin/touch /tmp/2)): time=0.0187 secs, av=0.0187 +/- 0.0316 ———————————————————————

你可以在看到/tmp下有刚刚touch好的2文件,如此一个简单的cfengine就做好了,这样如果你需要删除什么目录下的文件,或者拷贝,再或者你自己的脚本,就都可以添加到cfagent.conf文件中,然后通过crontab定义cfagent的定期执行


参考文章:

squid3.0单网卡透明代理服务器[原创]

看网上很多人都做了squid的透明代理,今天自己也试验了一个,使用的是squid3.0stable8版本+iptables,下面就吧我的过程总结如下,首先看下我的拓扑结构
squid单网卡,通过交换机可以直接连接到Internet,A和B两组client可以处在不同的网段或相同的网段,只要可以和squid所在网段互通就行
本文本着只把透明代理实现的最基本过程整理如下,对于squid详细配置,以及iptables相对应的安全配置一概不涉及,有需要的朋友请自行去相应网站查找
言归正传,我的环境如下
vmware6.0模拟两个系统1、centos4.4(squid:192.168.220.128),2、winxp(ip:192.168.220.140)
squid基本配置:

acl manager proto cache_object
acl localhost src 127.0.0.1/32
acl to_localhost dst 127.0.0.0/8
acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
acl SSL_ports port 443
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl CONNECT method CONNECT

http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports

http_access allow localnet

http_access deny all
always_direct allow localnet

http_port 3128 transparent       #透明代理的关键参数

hierarchy_stoplist cgi-bin ?

access_log /opt/squid/var/logs/access.log squid
cache_dir ufs /tmp 10 2 4 no-store

refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern (cgi-bin|?) 0 0% 0
refresh_pattern . 0 20% 4320

visible_hostname 1

cache_effective_user squid
cache_effective_group squid

然后正常启动squid,测试机xp系统ie中设置代理服务器,可以正常上网,说明,squid目前运行正常

接下来是iptables的配置

echo "1" >/proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-ports 3128

完成后,将xp中ie的代理去掉,更改xp的网关为192.168.220.128,然后配置好dns,直接在访问网页,就可以看到你想要的页面了,而squid中也有正常访问的日志了

这次最简单的squid透明代理就做完了

关于实施中的一点点问题,最先开始的时候,squid中我没有添加transparent这个参数,结果加完iptables后,访问返回的错误的页面如下

ERROR
The requested URL could not be retrieved

--------------------------------------------------------------------------------

While trying to retrieve the URL: /

The following error was encountered:

Invalid URL
Some aspect of the requested URL is incorrect. Possible problems:

Missing or incorrect access protocol (should be `http://'' or similar)
Missing hostname
Illegal double-escape in the URL-Path
Illegal character in hostname; underscores are not allowed
Your cache administrator is webmaster.

后来加上这个参数后就正常了