??xml version="1.0" encoding="utf-8" standalone="yes"?>
linux
下实现程序的自动重启有很多方法,q里我们介绍的是通过自己写脚本来实现Q?br />
ps -ef | grep "$1" | grep -v "grep" | wc –l
是获?/span>
$1
Q本例中?/span>
test
Q的q程敎ͼ脚本Ҏq程数来军_下一步的操作。通过一个死循环Q每?/span>
1
U检查一ơ系l中的指定程序的q程数?/span>
代码如下Q?br /> 脚本check
讄crond 本文来自redhat官方文 Cron是根据月、天、周、时间的l合讑֮Q周期性的执行特定d的守护程序?Cron需要系l处于运行状态。如果系l未q行Q则计划d无法被执行。要使用cron服务, 需安装vixie-cron RPM?也要保crond处于q行状态。用rpm -q vixie-cron?定此Y件包是否安装.?sbin/service crond status?定crond?否处于运行状态?cron的主要配|文件在以下?etc/crontab文g??含如下行 ?四行是有兌|cron?务运行的环境变量. SHELL?量的值指定系l用的SHELL???样例为bash shell)QPATH?量定义了执行命o的\径。Cron?输出以电子邮件的形式发给MSILTO?量定义的用户? ?果MAILTO?量定义ؓI字W串(MAILTO=""), 电子邮g?会被发? ?行命令或脚本时HOME?量可用来讄家目录? ??etc/crontab?每行d的描q格式如? minute hour day_of_month month day_of_week command ?于以上各语句,??*)?C所有可用的? ??*?指代month?表示每月执行Q需要符合其他限制条Ӟ该命令? ?数间的连字号(-)?C整数列,??-4?思是整数1,2,3,4. ?定数值由逗号分开。如Q?,4,6,8?C四个指定整数. W?号?”指 定步q设|??<interger>”表 C步q倹{如0-59/2?义每两分钟执行一ơ。步qg可用星号表示。如*/3?来运行每三个月䆾q行指定d. 以?”开 头的为注释行,?会被执行? ?文g/etc/crontab所 C??在RUNQPART?本中指定pȝ每小Ӟ每天Q每周。每月运?cron.hourly, /etc/cron.daily, /etc/cron.weekly, ?etc/cron.monthly?的文?q?些目录中的文件ؓshell?本? ?果一个cron?务需要定期而不是按时,???来执??需要添?etc/cron.d?? q?个目录下的所有文件和文g/etc/crontab?法相? ?看样? ?了root?户之外的用户可以执行crontab?|计划Q务。所有用户定义的crontab?储在目录/var/spool/cron? ?务会以创的w䆾被执行。要以特定用户创Z个crontab, ?以该用户d,?行命令crontab -e, pȝ会启动在VISUAL?者EDITOR?指定的的~辑软g~辑crontab. ?件内容与/etc/crontab?式相? ?更改的crontab需 要保存时,?件会保存在成如下文g/var/spool/cron/username.?件名会根据用户名而不同? cron ?务会每分钟检查一?etc/crontab, /etc/cron.d/, ?var/spool/cron?件下的变??果发现变??会下载到存储器中.???时crontab?件改变了,E?序也不需要重新启动?/p>
Bash shell 在当今的许多 Linux] ?UNIX] pȝ上都可用,?Linux 上常见的默认 shell。Bash 包含强大的编E功能,其中包括丰富的可试文gcd和属性的函数Q以及在多数~程语言中可以用的术和字W串比较函数。理解不同的试q认识到 shell q能把一些操作符解释?shell 元字W,是成为高U?shell 用户的重要一步。这文章摘?developerWorks 教程 LPI exam 102 prep: Shells, scripting, programming, and compilingQ介l了如何理解和?Bash shell 的测试和比较操作?/p>
q个技巧解释了 shell 试和比较函敎ͼ演示了如何向 shell d~程功能。您可能已经看到q?&& ?|| 操作W的?shell 逻辑Q它允许您根据前一条命令的退出状态(正确退出或伴随错误退出)而执行后一条命令。在q个技巧中Q将看到如何把这些基本的技术扩展成更复杂的 shell ~程?/p>
试
在Q何一U编E语a中,学习了如何给变量分配值和传递参C后,都需要测试这些值和参数。在 shell 中,试会设|返回的状态,q与其他命o执行的功能相同。实际上Q?code>test 是个内置命oQ?/p>
test ?[
内置命o 在清?1 的第一个示例中Q?code>-gt 操作W对两个字符g间执行算术比较。在W二个示例中Q用 可以? 可以分别用操作符
说明Q?/b>shell 也用 ?1 昄了一些更常见的文件测试。如果被试的文件存在,而且有指定的特征Q则l果?True?/p>
除了上面的单目测试,q可以用表 2 所C的双目操作W比较两个文Ӟ 其他一些测试可以用来测试文件许可之cȝ内容。请参阅 bash 手册获得更多l节或?
最后,
(( ?[[
同?
在?
甚至q可以在
条g试
虽然使用以上的测试和
If、then、else 语句
bash ? Bash 中的 使用q今为止学到的东西,现在能够构徏单的计算器来计算术表达式,如清?9 所C:
q个计算器利? 如清?9 所C,需要确保在表达式?shell 元字W?—?例如(???gt; ?< ?—?正确地对表达式{义。无论如何,现在有了一个非常方便的计器Q可以像 shell 那样q行术计算?/p>
在清?9 中可能注意到
对输入进行的额外处理出了本技巧的范围Q所以请心使用q个计算器?/p>
当然Q也可以只用
自动重启脚本
假定需要实现重启的E序名ؓ
test
Q我们这里通过判断q程数目来判断程序是否正常?/span>
#!/bin/sh
#------------------------------------------------------------------------------
# 函数: CheckProcess
# 功能: 查一个进E是否存?br /># 参数: $1 --- 要检查的q程名称
# q回: 如果存在q回0, 否则q回1.
#------------------------------------------------------------------------------
CheckProcess()
{
# 查输入的参数是否有效
if [ "$1" = "" ];
then
return 1
fi
#$PROCESS_NUM获取指定q程名的数目Qؓ1q回0Q表C正常,不ؓ1q回1Q表C有错误Q需要重新启?br /> PROCESS_NUM=`ps -ef | grep "$1" | grep -v "grep" | wc -l`
if [ $PROCESS_NUM -eq 1 ];
then
return 0
else
return 1
fi
}
# 查test实例是否已经存在
while [ 1 ] ; do
CheckProcess "test"
CheckQQ_RET=$?
if [ $CheckQQ_RET -eq 1 ];
then
# 杀L有testq程Q可换Q意你需要执行的操作
killall -9 test
exec ./test &
fi
sleep 1
done
脚本startQ?/strong>
加入limit coredumpsize 102400Q设|core file的大,一旦程序Core DumpQ有q可寅R在该脚本中后台执行check脚本Q可以省d多麻烦,
#!/bin/csh
limit coredumpsize 102400
./check &
]]> SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
# record the memory usage of the system every monday
# at 3:30AM in the file /tmp/meminfo
30 3 * * mon cat /proc/meminfo >> /tmp/meminfo
# run custom script the first day of every month at 4:10AM
10 4 1 * * /root/scripts/backup.sh
test
?[ ]
?[[ ]]
?(( ))
?if-then-else
了?/blockquote>
test
Ҏ表达?i>expr 求值的l果q回 0Q真Q或 1Q假Q。也可以使用ҎPtest expr
?[ expr ] 是等L?可以?$?
查返回|可以使用 && ?|| 操作q回|也可以用本技巧后面介l的各种条gl构试q回倹{?/p>
清单 1. 一些简单测?/b>
[ian@pinguino ~]$ test 3 -gt 4 && echo True || echo false
false
[ian@pinguino ~]$ [ "abc" != "def" ];echo $?
0
[ian@pinguino ~]$ test -d "$HOME" ;echo $?
0
[ ]
的Ş式比较两个字W串不相{。在最后一个示例中Q测?HOME 变量的|用单目操作符 -d
查它是不是目录?/p>
-eq
?-ne
?code>-lt?-le
?-gt
?-ge
比较术|它们分别表示{于、不{于、小于、小于等于、大于、大于等于?=
?!=
?code>< ?>
比较字符串是否相{、不相等或者第一个字W串的排序在W二个字W串的前面或后面。单目操作符 -z
试 null 字符Ԍ如果字符串非I?-n
q回 TrueQ或者根本没有操作符Q?/p>
<
?>
操作W进行重定向Q所以必ȝ \<
?\>
加以转义。清?2 昄了字W串试的更多示例。检查它们是否如您预期的一栗?/p>
清单 2. 一些字W串试
[ian@pinguino ~]$ test "abc" = "def" ;echo $?
1
[ian@pinguino ~]$ [ "abc" != "def" ];echo $?
0
[ian@pinguino ~]$ [ "abc" \< "def" ];echo $?
0
[ian@pinguino ~]$ [ "abc" \> "def" ];echo $?
1
[ian@pinguino ~]$ [ "abc" \<"abc" ];echo $?
1
[ian@pinguino ~]$ [ "abc" \> "abc" ];echo $?
1
操作W?/th>
特征
-d
目录
-e
存在Q也可以?-aQ?/td>
-f
普通文?/td>
-h
W号q接Q也可以?-LQ?/td>
-p
命名道
-r
可读
-s
非空
-S
套接?/td>
-w
可写
-N
从上ơ读取之后已l做q修?/td>
操作W?/th>
?True 的情?
-nt
试 file1 是否?file2 更新。修Ҏ期将用于q次和下ơ比较?/td>
-ot
试 file1 是否?file2 旧?/td>
-ef
试 file1 是不?file2 的硬链接?
help test
查看内置试的简要信息。也可以?help
命o了解其他内置命o?/p>
-o
操作W允许测试利?set -o 选项
讄的各U?shell 选项Q如果设|了该选项Q则q回 True (0)Q否则返?False (1)Q如清单 3 所C?/p>
清单 3. 试 shell 选项
[ian@pinguino ~]$ set +o nounset
[ian@pinguino ~]$ [ -o nounset ];echo $?
1
[ian@pinguino ~]$ set -u
[ian@pinguino ~]$ test -o nounset; echo $?
0
-a
?-o
选项允许使用逻辑q算W?AND ?OR 表辑ּl合在一赗单目操作符 !
可以使测试的意义相反。可以用括号把表辑ּ分组Q覆盖默认的优先U。请C shell 通常要在?shell 中运行括号中的表辑ּQ所以需要用 \( ?\) 转义括号Q或者把q些操作W括在单引号或双引号内。清?4 演示了摩Ҏ则在表达式上的应用?/p>
清单 4. l合和分l测?/b>
[ian@pinguino ~]$ test "a" != "$HOME" -a 3 -ge 4 ; echo $?
1
[ian@pinguino ~]$ [ ! \( "a" = "$HOME" -o 3 -lt 4 \) ]; echo $?
1
[ian@pinguino ~]$ [ ! \( "a" = "$HOME" -o '(' 3 -lt 4 ')' ")" ]; echo $?
1
test
命o非常强大Q但是很难满_转义需求以及字W串和算术比较之间的区别。幸q的是,bash 提供了其他两U测试方式,q两U方式对熟悉 C、C++ ?Java] 语法的h来说会更自然些?/p>
(( ))
复合命o 计算术表达式,如果表达式求gؓ 0Q则讄退出状态ؓ 1Q如果求gؓ?0 |则设|ؓ 0。不需要对 ((
?))
之间的操作符转义。算术只Ҏ数进行。除 0 会生错误,但不会生溢出。可以执?C 语言中常见的术、逻辑和位操作?let
命o也能执行一个或多个术表达式。它通常用来为算术变量分配倹{?/p>
清单 5. 分配和测试算术表辑ּ
[ian@pinguino ~]$ let x=2 y=2**3 z=y*3;echo $? $x $y $z
0 2 8 24
[ian@pinguino ~]$ (( w=(y/x) + ( (~ ++x) & 0x0f ) )); echo $? $x $y $w
0 3 8 16
[ian@pinguino ~]$ (( w=(y/x) + ( (~ ++x) & 0x0f ) )); echo $? $x $y $w
0 4 8 13
(( ))
一P利用复合命o [[ ]]
可以Ҏ件名和字W串使用更自然的语法。可以用括号和逻辑操作W把 test
命o支持的测试组合v来?
清单 6. 使用 [[ 复合命o
[ian@pinguino ~]$ [[ ( -d "$HOME" ) && ( -w "$HOME" ) ]] &&
> echo "home is a writable directory"
home is a writable directory
=
?!=
操作W时Q复合命?[[
q能在字W串上进行模式匹配。匹配的方式像清单 7 所C的通配W匹配?/p>
清单 7. ?[[ q行通配W测?/b>
[ian@pinguino ~]$ [[ "abc def .d,x--" == a[abc]*\ ?d* ]]; echo $?
0
[ian@pinguino ~]$ [[ "abc def c" == a[abc]*\ ?d* ]]; echo $?
1
[ian@pinguino ~]$ [[ "abc def d,x" == a[abc]*\ ?d* ]]; echo $?
1
[[
复合命o内执行算术测试,但是千万要小心。除非在 ((
复合命o内,否则 <
?>
操作W会把操作数当成字符串比较ƈ在当前排序序列中试它们的顺序。清?8 用一些示例演CZq一炏V?/p>
清单 8. ?[[ 包含术试
[ian@pinguino ~]$ [[ "abc def d,x" == a[abc]*\ ?d* || (( 3 > 2 )) ]]; echo $?
0
[ian@pinguino ~]$ [[ "abc def d,x" == a[abc]*\ ?d* || 3 -gt 2 ]]; echo $?
0
[ian@pinguino ~]$ [[ "abc def d,x" == a[abc]*\ ?d* || 3 > 2 ]]; echo $?
0
[ian@pinguino ~]$ [[ "abc def d,x" == a[abc]*\ ?d* || a > 2 ]]; echo $?
0
[ian@pinguino ~]$ [[ "abc def d,x" == a[abc]*\ ?d* || a -gt 2 ]]; echo $?
-bash: a: unbound variable
&&
?||
控制操作W能实现许多~程Q但 bash q包含了更熟悉的 “if, then, else??case l构。学习完q些之后Q将学习循环l构Q这h的工L真正得到扩展?/p>
if
命o是个复合命oQ它试一个测试或命oQ?code>$?Q的q回|q根据返回gؓ TrueQ?Q或 FalseQ不?0Q进行分支。虽然上面的试只返?0 ?1 |但命令可能返回其他倹{请参阅 LPI exam 102 prep: Shells, scripting, programming, and compiling 教程学习q方面的更多内容?/p>
if
命o有一?then
子句Q子句中包含试或命令返?0 时要执行的命令列表,可以有一个或多个可选的 elif
子句Q每个子句可执行附加的测试和一?then
子句Q子句中又带有相关的命o列表Q最后是可选的 else
子句及命令列表,在前面的试?elif
子句中的所有测试都不ؓ真的时候执行,最后?fi
标记表示该结构结束?
清单 9. ?if、then、else 计算表达?/b>
[ian@pinguino ~]$ function mycalc ()
> {
> local x
> if [ $# -lt 1 ]; then
> echo "This function evaluates arithmetic for you if you give it some"
> elif (( $* )); then
> let x="$*"
> echo "$* = $x"
> else
> echo "$* = 0 or is not an arithmetic expression"
> fi
> }
[ian@pinguino ~]$ mycalc 3 + 4
3 + 4 = 7
[ian@pinguino ~]$ mycalc 3 + 4**3
3 + 4**3 = 67
[ian@pinguino ~]$ mycalc 3 + (4**3 /2)
-bash: syntax error near unexpected token `('
[ian@pinguino ~]$ mycalc 3 + "(4**3 /2)"
3 + (4**3 /2) = 35
[ian@pinguino ~]$ mycalc xyz
xyz = 0 or is not an arithmetic expression
[ian@pinguino ~]$ mycalc xyz + 3 + "(4**3 /2)" + abc
xyz + 3 + (4**3 /2) + abc = 35
local
语句?x 声明为局部变量,只能?mycalc
函数的范围内使用?code>let 函数h几个可用的选项Q可以执行与它密切关联的 declare
函数。请参?bash 手册或?help let
获得更多信息?/p>
else
子句和最后的两个CZ。可以看刎ͼ?xyz
传递给 mycalc q没有错误,但计结果ؓ 0。这个函数还不够灵yQ不能区分最后用的CZ中的字符|所以不能警告用戗可以用字W串模式匚w试Q例?[[ ! ("$*" == *[a-zA-Z]* ]]
Q或使用适合自己范围的Ş式)消除包含字母表字W的表达式,但是q会妨碍在输入中使用 16 q制标记Q因Z?16 q制标记时可能要?0x0f 表示 15。实际上Qshell 允许的基数最高ؓ 64Q?base#value
标记Q,所以可以在输入中加?_ ?@ 合法C用Q何字母表字符? q制?16 q制使用常用的标记方式,开头ؓ 0 表示八进Ӟ开头ؓ 0x ?0X 表示 16 q制。清?10 昄了一些示例?/p>
清单 10. 用不同的基数q行计算
[ian@pinguino ~]$ mycalc 015
015 = 13
[ian@pinguino ~]$ mycalc 0xff
0xff = 255
[ian@pinguino ~]$ mycalc 29#37
29#37 = 94
[ian@pinguino ~]$ mycalc 64#1az
64#1az = 4771
[ian@pinguino ~]$ mycalc 64#1azA
64#1azA = 305380
[ian@pinguino ~]$ mycalc 64#1azA_@
64#1azA_@ = 1250840574
[ian@pinguino ~]$ mycalc 64#1az*64**3 + 64#A_@
64#1az*64**3 + 64#A_@ = 1250840574
elif
语句非常方便。它允许化羃q,从而有助于脚本~写。在清单 11 中可能会?type
命o?mycalc
函数中的输出感到惊讶?/p>
清单 11. Type mycalc
[ian@pinguino ~]$ type mycalc
mycalc is a function
mycalc ()
{
local x;
if [ $# -lt 1 ]; then
echo "This function evaluates arithmetic for you if you give it some";
else
if (( $* )); then
let x="$*";
echo "$* = $x";
else
echo "$* = 0 or is not an arithmetic expression";
fi;
fi
}
$(( 表达?/i> ))
?echo
命oq行 shell 术q算Q如清单 12 所C。这样就不必学习关于函数或测试的M内容Q但是请注意 shell 不会解释元字W,例如 *Q因此元字符不能?(( 表达?/i> ))
?[[ 表达?/i> ]]
中那h常发挥作用?
清单 12. ?shell 中用 echo ?$(( )) 直接q行计算
[ian@pinguino ~]$ echo $((3 + (4**3 /2)))
35
]]>
[root@localhost shell]# echo $BASH_VERSION
2.05b.0(1)-release
[root@localhost shell]# echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/huyi/bin
[root@localhost shell]# $PATH=$HOME:/usr/bin
bash: /usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/huyi/bin=/root:/usr/bin: ????
[root@localhost shell]#
[root@localhost shell]# export PATH
[root@localhost shell]# hash
hits command
1 /bin/egrep
1 /bin/bash
1 /bin/cat
1 /bin/cp
1 /bin/stty
15 /bin/ls
[root@localhost shell]# $!
[root@localhost shell]# echo ${newfruit:-apple}
apple
[root@localhost shell]# echo ${fruit:-peach}
orange
[root@localhost shell]# food=grapes
[root@localhost shell]# echo ${food:+pears}
pears
[root@localhost shell]# echo $food
grapes
]]>
[huyi@localhost ~]$ rpm -qa|grep vim
vim-enhanced-7.0.109-3.el5.3
vim-common-7.0.109-3.el5.3
vim-minimal-7.0.109-3.el5.3
q少一个包vim-X11-7.0.109-3.el5.3Q?用centos的yum -install vim-X11,下蝲安装后?br />vi 能正常显C彩色了
cat afile | while read oneline
do
echo $oneline
done
q只是个单例子,把文件afile的每一行读入,然后昄出来?/p>
也可以这?如果行中有空格或者tab则无法用此Ҏ,不好意思啊,呵呵):
for i in `cat afile`
do
echo $i
done
pȝ是基于RHEL的centos,包括3,4,5三个版本,当然自己也初学shell,中间肯定用了很多W的办法,效果也不一定怎么?请大家给Ҏ?/p>
注意:q个脚本是根据apache服务器的server-status和系l的dmesg分析l果q行防范?所以非apache用户和没有开启server-status的朋友没法?/p>
可以在服务器的crontab里设定每一分钟q行一ơ脚?
复制下面的脚本到autoblock.sh,
root用户? chmod u+x autoblock.sh
#!/bin/bash
# author hao32
# basic setting
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
# find server-status name
ss_name="/usr/local/autoblock"
if [ -e $ss_name/ss_name ];then
ss_n=`cat $ss_name/ss_name`
else
mkdir /usr/local/autoblock >/dev/null 2>&1
cat `locate httpd.conf|grep -E "httpd/conf/httpd.conf$|apache_ssl/conf/httpd.conf$"`\
|grep "n /server-status"|cut -d/ -f2|cut -d\> -f1 > $ss_name/ss_name
ss_n=`cat $ss_name/ss_name`
fi
# block setting ss_tmp="/tmp/server-status" # block start... # analysedemsg wget -q -O "$ss_tmp" "$ss_url" grep "<i>" $ss_tmp|grep -vE $ip_exclude|awk '{print $1}'|sed 's/<i>//g'|sort|uniq -c\ #iptables -nvL|grep "DROP "|awk '{print $8}'|sort|uniq|sed 's/0\/24/*/g'>$rule_ip fi
#讑֮排除的IP地址
ip_exclude="192.168.1.*|60.195.249.*|222.76.212.*|218.241.156.*|58.215.87.*|218.107.216.110"
ip_amou=25
ss_url="
poss_ip="/tmp/poss_ip"
real_ip="/tmp/real_ip"
if [ -e "$poss_ip" ];then
echo "" > $poss_ip
fi
if [ -e "$real_ip" ];then
echo "" > $real_ip
fi
dmesg |grep "short"|awk '{if($4!="From"){print $4} else {print $5}}'|awk -F: '{print $1}'|sort|uniq>$poss_ip
|awk '{if($1>'$ip_amou') print $2}'>>$poss_ip
rule_ip=`iptables -nvL|grep "DROP "|awk '{print $8}'|sort|uniq|sed 's/0\/24/*/g'|xargs|sed 's/\ /|/g'`
if [ -z $rule_ip ];then
for i in `cat $poss_ip`
do
/sbin/iptables -I INPUT -p all -s $i -j DROP
done
else
cat $poss_ip|grep -vE "$rule_ip" > $real_ip
for i in `cat $real_ip`
do
/sbin/iptables -I INPUT -p all -s $i -j DROP
done
]]>
好了Q下面就是编译expect?br />我用的是
./configure --prefix=/tools --with-tcl=/tools/lib --with-x=no
如果?br />checking for Tcl private headers... checking for tclInt.h... no
configure: error: Can't find Tcl private headers
再添加一个头文g目录参数
--with-tclinclude=../tcl8.4.11/generic
脚本q行正常Q进行执行makeq行~译
make
~译q程中未出现错误Q执行安装:
make install
背景介绍
Q?span lang="EN-US">
代理服务器是使用非常普遍的一U将局域网L联入互联|的一U方式,使用代理上网可以节约紧缺?span lang="EN-US">IP地址资源Q而且可以L外部L对内部主机的讉KQ内部|主机免受外部网L的攻凅R但是,如果惌互联|上的主问内部网的主源(例如Q?span lang="EN-US">Web站点Q,又想使内部网L免受外部|主机攻击,一般的代理服务是不能实现的Q需要用反向代理来实现?span lang="EN-US">
本文详l介l反向代理服务的概念以及如何利用反向代理服务器提?span lang="EN-US">WEB服务器的性能和安全性?span lang="EN-US">
一Q?span style="FONT: 7pt 'Times New Roman'">
反向代理的概?
什么是反向代理呢?其实Q反向代理也是通常所说的WEB服务器加速,它是一U通过在繁忙的WEB服务器和Internet之间增加一个高速的WEB~冲服务器(卻IWEB反向代理服务器)来降低实际的WEB服务器的负蝲。典型的l构如下图所C:
Web
服务器加速(反向代理Q是针对Web服务器提供加速功能的。它作ؓ代理CacheQ但q不针对览器用P而针对一台或多台特定Web服务器(q也是反向代理名U的由来Q。实施反向代理(如上图所C)Q只要将Reverse Proxy Cache讑֤攄在一台或多台Web服务器前端即可。当互联|用戯问某?span lang="EN-US">WEB服务器时Q通过DNS服务器解析后?span lang="EN-US">IP地址?span lang="EN-US">Reverse Proxy Server?span lang="EN-US">IP地址,而非原始Web服务器的IP地址,q时Reverse Proxy Server讑֤充当Web服务器,览器可以与它连接,无需再直接与Web服务器相q。因此,大量Web服务工作量被卸蝲到反向代理服务上。不但能够防止外部网L直接?span lang="EN-US">web服务器直接通信带来的安全隐患,而且能够很大E度上减?span lang="EN-US">web服务器的负担Q提高访问速度?/span>
二.
反向代理和其它代理的比较
下面对几种典型的代理服务作一个简单的比较?/span>
在网l上常见的代理服务器有三U:
1Q?span style="FONT: 7pt 'Times New Roman'">
标准的代理缓冲服务器
一个标准的代理~冲服务被用于缓存静态的|页Q例如:html文g和图片文件等Q到本地|络上的一CZQ即代理服务器)。当被缓存的面被第二次讉K的时候,览器将直接从本C理服务器那里获取h数据而不再向?span lang="EN-US">web站点h数据。这样就节省了宝늚|络带宽Q而且提高了访问速度。但是,要想实现q种方式Q必d每一个内部主机的览器上明确指明代理服务器的IP地址和端口号。客L上网Ӟ每次都把h送给代理服务器处理,代理服务器根据请求确定是否连接到q程web服务器获取数据。如果在本地~冲区有目标文gQ则直接文件传l用户即可。如果没有的话则先取回文Ӟ先在本地保存一份缓Ԍ然后文件发l客L览器?span lang="EN-US">
2Q?span style="FONT: 7pt 'Times New Roman'">
透明代理~冲服务?span lang="EN-US">
透明代理~冲服务和标准代理服务器的功能完全相同。但是,代理操作对客L的浏览器是透明的(即不需指明代理服务器的IP和端口)。透明代理服务器阻断网l通信Qƈ且过滤出讉K外部?span lang="EN-US">HTTPQ?span lang="EN-US">80端口Q流量。如果客L的请求在本地有缓冲则缓冲的数据直接发给用户Q如果在本地没有~冲则向q程web服务器发求,其余操作和标准的代理服务器完全相同。对?span lang="EN-US">Linux操作pȝ来说Q透明代理使用Iptables或?span lang="EN-US">Ipchains实现。因Z需要对览器作M讄Q所以,透明代理对于ISPQ?span lang="EN-US">Internet服务器提供商Q特别有用?span lang="EN-US">
3Q?span style="FONT: 7pt 'Times New Roman'">
反向代理~冲服务?span lang="EN-US">
反向代理是和前两U代理完全不同的一U代理服务。用它可以降低原始WEB服务器的负蝲。反向代理服务器承担了对原始WEB服务器的静态页面的hQ防止原始服务器q蝲。它位于本地WEB服务器和Internet之间Q处理所有对WEB服务器的hQ组l了WEB服务器和Internet的直接通信。如果互联网用户h的页面在代理服务器上有缓冲的话,代理服务器直接将~冲内容发送给用户。如果没有缓冲则先向WEB服务器发求,取回数据Q本地缓存后再发送给用户。这U方式通过降低了向WEB服务器的hC而降低了WEB服务器的负蝲?span lang="EN-US">
三.反向代理工作原理
反向代理服务器位于本?span lang="EN-US">WEB服务器和Internet之间,如下图所C:
当用h览器发出一?span lang="EN-US">HTTPhӞ通过域名解析请求定向到反向代理服务器(如果要实现多?span lang="EN-US">WEB服务器的反向代理Q需要将多个WEB服务器的域名都指向反向代理服务器Q。由反向代理服务器处理器h。反向代理一般只~存可缓冲的数据Q比?span lang="EN-US">html|页和图片等Q,而一?span lang="EN-US">CGI脚本E序或?span lang="EN-US">ASP之类的程序不~存。它Ҏ?span lang="EN-US">WEB服务器返回的HTTP头标记来~冲静态页面。有四个最重要HTTP头标讎ͼ
例如Q在默认情况下,ASP面q回?Cache-control: private.?Q所?span lang="EN-US">ASP面时不会在反向代理服务器缓存的
四.
代理服务器Y?span lang="EN-US">squid?/span>
Squid Internet Object Cache (Harvest Project
的后l版?span lang="EN-US">) 是美国政府大力助的一研I计划,其目的ؓ解决|络带宽不的问题,是现?span lang="EN-US">Unixpȝ上用者最多功能也最完整的一套Y体?span lang="EN-US">Apache?span lang="EN-US">Netscape虽附有相关的Proxy模块Q但因其功能单而不够普及。有?span lang="EN-US">squid的详l说明可?span lang="EN-US">squid|站(http://www.squid-cache.org)查询?span lang="EN-US">
Squid
最典型的应用是代理局域网的机器联入互联网Q它支持现在行的网l协议?/span>
Squid
的另一w常出色的功能是实现反向代理功能?/span>
五.使用Squid配置反向代理Q?span lang="EN-US">HTTP 加速器Q?span lang="EN-US">
通过squid配置反向代理主要是配置?span lang="EN-US">squid.conf”这个配|文件。下面以Linux操作pȝZq行介绍Q其它版本的?span lang="EN-US">UNIX也同样适用。在Linux?span lang="EN-US">squid如果是以源代码方式安装的话,q个文g一般在?span lang="EN-US">/usr/local/squid/etc/”目录下。如果是pȝ自带?span lang="EN-US">squidQ一般配|文件在?span lang="EN-US">/etc/squid/”目录下?span lang="EN-US">
1Q?span style="FONT: 7pt 'Times New Roman'">
Squid
反向代理单个后台WEB服务?span lang="EN-US">
如果WEB服务器和反向代理服务器是两台单独的机器(一般的反向代理应该有两块网卡分别连接了内外部网l)。那么,应该修改下面的内Ҏ讄反向代理服务?span lang="EN-US">
http_port 80 # squid
监听的端?span lang="EN-US">
httpd_accel_host 172.16.250.250 # 内部WEB服务器的IP地址
httpd_accel_port 80 # WEB服务器的IP地址
httpd_accel_single_host on # 转发为缓冲的hC台单独的机器
httpd_accel_with_proxy on #
httpd_accel_uses_host_header off
如果WEB服务器和反向代理服务器是同一台机器。那么,应该讄WEB服务器的监听端口为非80端口Q比如:81端口Q。要修改的内容如下:
http_port 80 # squid
监听的端?span lang="EN-US">
httpd_accel_host localhost # 内部WEB服务器的IP地址
httpd_accel_port 81 # WEB服务器的IP地址
httpd_accel_single_host on # 转发为缓冲的hC台单独的机器
httpd_accel_with_proxy on #
httpd_accel_uses_host_header off
下面解释一下配|指令?/span>
http_port 80
选项 http_port 指定squid监听HTTPh的端口,一般都讄?span lang="EN-US">80端口Q这样用户感觉不到反向代理的存在,像讉K真正?span lang="EN-US">WEB服务器一栗?/span>
httpd_accel_host 172.16.250.250
?
httpd_accel_port 80
选项httpd_accel_host ?span lang="EN-US"> httpd_accel_port 指定WEB服务器的IP地址和端口号Q可以根据自qWEB服务器的实际情况而定?/span>
httpd_accel_single_host on
选项
httpd_accel_single_host
?span lang="EN-US">on Ӟsquid被设|成仅对单一?span lang="EN-US">web服务器作反向代理。不考虑HTTP头信息,Squid转发所有的未被~冲的页面请求到q个web服务器。如?span lang="EN-US">squid需要做多个web服务器反向代理,必须此选项讄?span lang="EN-US">offQƈ且用{向器或?span lang="EN-US">DNSL请求到合适的后台WEB服务器?/span>
httpd_accel_with_proxy on
如果希望squid既作反向代理服务器又作本地机器的上网代理Q需要将httpd_accel_with_proxy
改ؓ
on
Q默认情况下?span lang="EN-US">off
httpd_accel_uses_host_header off
?span lang="EN-US">HTTP协议1.1中,HTTPh包括一个主机头信息Q指?span lang="EN-US">URL的主机名或者主机的IP地址。这个选项可以用来完成多个后台WEB服务器的反向代理功能?/span>
2
Q?/span>
Squid
反向代理多个后台
WEB
服务?/span>
我们可以?/span>
Squid
反向代理多个后台
WEB
服务器。例如:我们可以配置
squid
同时反向代理
www.abc.com, www.xyz.com, www.lmn.com
三个后台
WEB
服务器,C意囑֦下:
Squid
的配|如下:
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_single_host off
httpd_accel_uses_host_header on
Q注?span lang="EN-US">:~译Squid旉Ȁz?span lang="EN-US">Internal DNS选项Q?span lang="EN-US">
然后讄讄反响代理需要的域名解析Q?span lang="EN-US">Internet用户通过q里解析三个|站的域名)如下Q?/span>
www.abc.com 202.102.240.74
www.xyz.com 202.102.240.74
www.lmn.com 202.102.240.74
使三个域名都指向反向代理服务器的IP地址202.102.240.74?span lang="EN-US">
下面讄反向代理所需要的DNS入口信息Q即讄内部DNSQ仅仅是squid在内部用,Internet用户不可见)。有两种Ҏ可以讄内部DNSQ用内?span lang="EN-US">DNS服务器来解析或者?span lang="EN-US">/etc/hosts文g来实现?span lang="EN-US">
使用内部DNS服务器的资源记录如下Q?/span>
www.abc.com IN A 172.16.1.2
www.xyz.com IN A 172.16.1.3
www.lmn.com IN A 172.16.1.4
如果使用/etc/hosts文g来实现内?span lang="EN-US">DNSQ编译时应?span lang="EN-US">disable internal dns选项Q?span lang="EN-US">,~辑/etc/hosts文gd如下条目Q?
172.16.1.2 www.abc.com
172.16.1.3 www.xyz.com
172.16.1.4 www.lmn.com
l论
通过本文中的和相兛_例,可以看出Q反向代理方式不单是一U?span lang="EN-US">WEB服务器加速器Q而且使也一U对外提?span lang="EN-US">Web发布时用的有效的防火墙技术,使用它不但能节约紧缺?span lang="EN-US">IP地址资源Q加?span lang="EN-US">WEB服务器的讉K速度Q而且能够保护WEBLQ因此能够适应多种应用场合?/span>
要用光盘时先把光盘攑օ光驱Q然后执行加载的mount命oQ将光盘加蝲至系l中:
# mount/dev/cdrom/mnt/cdrom ?加蝲光盘
同理Q用Y盘之前也需要和光盘一P必须先加载后才能使用:
# mount/dev/fd0/mut/floppy ?加蝲软盘
2Q卸载的umount命o
如果不需要用光盘或软盘Q则需先执行卸载命令之后,才能光盘或软盘退出。范例如?
# umount / mnt/cdrom ?光盘卸蝲
在不使用软盘时执行umount 命o卸蝲软盘Q再Y盘拿?/p>
# umount / mnt/ ?软盘卸蝲
嵌入式Linux 的NFS 开发环境的实现包括两个斚wQ一是Linux 服务器端的NFS 服务器支持;二是嵌入式目标系l的NFS 客户端的支持。因此,NFS 开发环境的建立需要配|linux 服务器端和嵌入式目标pȝ端?
一、Linux 服务器端NFS 服务器的配置
以root w䆾登陆Linux 服务器,~辑/etc 目录下的׃n目录配置文gexportsQ指定共享目录及权限{?
执行如下命o~辑文g/etc/exportsQ?
# vi /etc/exports
在该文g里添加如下内容:
/home/work 192.168.0.*Qrw,sync,no_root_squashQ?
然后保存退出?
d的内容表C:允许ip 地址范围?92.168.0.*的计机以读写的权限来访?home/work 目录?
/home/work 也称为服务器输出׃n目录?
括号内的参数意义描述如下Q?
rwQ读/写权限,只读权限的参CؓroQ?
syncQ数据同步写入内存和盘Q也可以使用asyncQ此时数据会先暂存于内存中,而不立即写入盘?
no_root_squashQNFS 服务器共享目录用L属性,如果用户?rootQ那么对于这个共享目录来说就h root 的权限?
接着执行如下命oQ启动端口映:
# /etc/rc.d/init.d/portmap start
最后执行如下命令启动NFS 服务Q此时NFS 会激zd护进E,然后开始监?Client 端的hQ?
# /etc/rc.d/init.d/nfs start
用户也可以重新启动Linux 服务器,自动启动NFS 服务?
在NFS 服务器启动后Q还需要检查Linux 服务器的防火墙等讄Q一般需要关闭防火墙服务Q,保没有屏蔽掉NFS 使用的端口和允许通信的主机,主要是检查Linux 服务器iptablesQipchains {选项的设|,以及/etc/hosts.denyQ?etc/hosts.allow 文g?
我们首先在Linux 服务器上q行NFS 服务器的回环试Q验证共享目录是否能够被讉K。在Linux 服务器上q行如下命oQ?
# mount –t nfs 192.168.0.20:/home/work /mnt
# ls /mnt
命oLinux 服务器的NFS 输出׃n目录挂蝲?mnt 目录下,因此Q如果NFS 正常工作Q应该能够在/mnt 目录看到/home/work ׃n目录中的内容?
二、嵌入式目标pȝNFS 客户端的配置
在Linux 服务器设|好后,q需要对客户端进行相关配|。在配置内核旉择Load an Alternate Configuration File输入配置文g的\径和文g名添加内核对NFS的支持:
选中networking optionsQ》IP:kernel level auloconfiguralion?
选中file systemsQ》network file systemsQ》下的root file system on nfs 和nfs file system support重新~译内核下蝲bootloader和kernel到开发板?
在嵌入式目标pȝ的Linux Shell 下,执行如下命o来进行NFS ׃n目录挂蝲Q?
# mkdir /mnt/nfs //建立Linux 服务器输出共享目录的挂蝲点;
# mount –t nfs 192.168.0.20:/home/work /mnt/nfs –o nolock
# cd /mnt/nfs
# ls
此时Q嵌入式目标pȝ端所昄的内容即为Linux 服务器的输出目录的内容,即Linux 服务器的输出目?
?home/work 通过NFS 映射C嵌入式目标系l的/mnt/nfs 目录。用户可以用??修改文g的方式来验证实际效果。mount 命o中的192.168.0.20 为Linux 服务器的IP 地址Q?home/work 为Linux 服务器端所配置的共享输出目录,/mnt/nfs 为嵌入式讑֤上的本地目录?
在开发过E中Q来回输入命令非常烦人,我写了两个简单的脚本来完成nfs的启动,挂蝲?
host启动nfsQ?br /> snfs
#!/bin/bash
ifconfig eth0 192.168.0.20
/etc/rc.d/init.d/portmap start
/etc/rc.d/init.d/nfs start
嵌入式目标机挂蝲nfsQ?br /> mnfsQ?br />
#!/bin/sh
mount -t nfs 192.168.0.20:/home/work/nfs /mnt/nfs -o nolock
echo “nfs okQ?/p>