ACUA是一个基于Linux系统的用户帐户管理工具软件,它经常在ISP、BBS、校园远程拔入服务器、商用远程拔入服务器上。ACUA功能十分强大,使用它能够让你更加有效地管理各种用户帐号。
一、ACUA所能实现的功能
通过ACUA可以实现各种访问控制:
1) 临时冻结某个帐户;
2) 通过E-Mail向用户解释被系统踢出去的原因);
3) 当用户可用时间快到时,给予提示;
4) 当用户帐号快过期时,通过E-Mail给予提示;
5) 将已在系统上发呆太久的用户断开;
6) 对用户实施周期限制(如每天的哪些时间可登录,每月的哪些时间可登录);
7) 可以设定用户优先级:
a. 可将用户优先级映射成为CPU优先级;
b.如果系统需要踢出用户,则先踢低优先的用户;
8) 可以设定数据传输限制,可按每个帐户、也可按每个连接会话进行限制,它可分为传输总数、上载总数、下载总数。
另外,通过ACUA还可以进行各种有效的用户管理:
1) 自动删除过期的用户;
2) 可以临时为用户作一些访问权限增加;
3) 在新建用户时自己做call-back验证;
4) 能够收集、报告所有有效用户的状态信息;
5) 能够很方便地删除已删除用户遗留下的文件;
6) 能够很方便地杀死已删除用户遗留下的进程;
二、下载软件
这个自由软件源于澳大利亚,截止到笔者写这篇文章时,最新版本是3.01版。你可以在http://acua.gist.net.au/files/下载到这个软件。
软件源程序包名称是:acua-3.01-2.tar.gz,它是使用gzip压缩过的,压缩后大小为138K。笔者在此假设你将这个软件下载后,存放在/usr/local目录下。另外,如果你想使安装更加简单一些,可以下载RPM格式的acua-3.01.i386.rpm文件。
三、 安装软件
这个软件的安装十分简单:
1. 以root用户登录系统;
2. 转到/usr/local目录,然后解压缩这个软件:
cd /usr/local
tar -zxvf acua-3.01-2.tar.gz
成功执行后,会在/usr/local目录下新生成一个acua-3.01目录。
3. 依次输入以下命令,进入软件目录,进行软件安装:
1)cd acua-3.01
转入软件目录;
2)make dep
编译前进行一些依赖性检查;
3)make
开始编译软件,屏幕上将会出现许多以gcc开始的输出;
4)make install
最后执行make install命令,将出现以下输出,至此安装完成。
strip –strip-debug libacua.so.2
strip acua_login acua_logout acua_updated acua_verify clean_proc clean_tmp acuaa
install -c -m 0755 libacua.so.2 /usr/lib
ldconfig
install -c -m 0700 acua_adduser acua_deluser acua_nounsub /usr/sbin
install -c -m 0700 acua_login acua_logout acua_updated acua_verify clean_proc cn
install -c -m 0755 acua_stats acua_bytes acua_viewRec /usr/bin
install -c -m 0755 acua /usr/bin
chmod 6755 /usr/sbin/acua_login
chmod 6755 /usr/sbin/acua_logout
chmod 6755 /usr/sbin/acua_verify
if [ -d /usr/lib/acua ]; then
rm -rf /usr/lib/acua.old ;
mv /usr/lib/acua /usr/lib/acua.old ;
fi
mkdir /usr/lib/acua
mkdir /usr/lib/acua/record
mkdir /usr/lib/acua/record/archive
chmod 755 /usr/lib/acua
install -c -m 0644 lib/* /usr/lib/acu
在缺省情况下,ACUA的配置文件、E-mail消息、userbase等等都将存放在/usr/lib/acua目录下。而ACUA的可执行文件则存放在/usr/bin、/usr/sbin目录下,它们大都是以acua开头的。
四、使用之前的一些说明
1.如果想要使用ACUA控制正常的tty、telnet、ssh登录,那就必须先在用户登录之前运行acua_login程序。大多数人都喜欢使用bash,让bash启动时,会自动执行/etc/profile下的内容,我建议你在/etc/profile中加入一行:
/usr/sbin/acua_login logout
2.如果想使用其控制PPP登录,则需在pppd启动之前运行acua_login程序。
3.如果需要,你可以编辑acua_adduser和acua_deluser文件以适合你的系统;
4.如果需要编辑配置文件、消息文件的话,它们存放在/usr/lib/acua目录下;
5.应确保在系统启动时启动acua_updated程序。
五、 软件使用方法
ACUA软件是由acua程序和一些相关的程序组成的。
1.acua程序使用方法
ACUA软件最主要的一个程序就是存放在/usr/bin目录下的acua,它的命令格式是:
acua <子命令> {参数}
下面,我们就一起来看看acua命令的子命令选项,及其功用。
注:<>代表必选项,[]代表可选项,{}代表可选0个或多个。
1) acua adduser
调用acua_adduser脚本创建一个UNIX/ACUA用户帐号,使用时,将替换成相应的帐号。例如,我们要创建一个thing用户,则执行命令:
acua adduser thing
这个命令除了在系统上创建这个帐号,还完成addrec命令,在ACUA上创建这个帐号。
2) acua addRec [session_limit][priority] [ph_no] {class_limit}
这个命令用来创建一个ACUA的用户记录。通常,我们并不直接运行这个命令,因为执行时acua adduser命令时,这个命令就已经一起执行了。但有时,你还是可以通过直接运行,完成一些特殊的任务。以下是每个参数的说明:
:用户帐户名。
:用户帐户的有效期,你可以在此通过以下格式来说明(x是一个数):
x :表示x天,
xd :表示x天,
xm :表示x个月,
xy :表示x年,
或者直接使用日期格式:yy/mm/dd
注意:如果 = 0,则这个帐号将永不远期。而以x、xd、xm、xy这 种格式说明,表示从现在开始多少天后,多少月以后,多少年以后。
例如,我们在2000年12月3日创建的帐户中设置了=1y,那么,这个用户到了2001年12月3日就会失效。
:指定这个用户帐户总共能够使用多少时间。
注意:如果=-1,则表示没有时间限制。
[session_limit]:指定用户帐户总共能够使用多少session,如果没有给出,则缺省设置为。
注意:session_limit <= time_limit,如果session_limit=-1,那么表示没有限制。
[priority]:指定用户帐户的优先级(0-7,7代表最高优先级),缺省值为4。
[ph_no]:用户的电话号码。
{class_limit}:最多可以给出16个值,第1个是class 0,第2个是class1……等等。
3) acua ban [-l] [-p] |
这个命令用来禁止一个电话号码号一组电话号码。
-l:显示出所有被禁止的电话号码;
-p:用来指出所有被禁号码的前缀。
:该禁止的生效期,它的语法与acua rec相同。
:禁止一个指定的用户,设置后,这个用户将马上被断开,用户帐号被 删除,该电话号码被删除。
:指定要禁止的电话号码。以后将没有任何一个用户能够设置成为这个电话号码。
下面就是一些使用实例:
acua ban -p 0:凡是电话号码最前面是0的都禁止,也就是不允许外地用户;
acua ban -p 1234567:禁止电话1234567。
4) acua bytes
这个命令通过调用一个名叫acua_bytes脚本程序,显示出谁是传输数据最多的用户。
5) acua daysleft
这个命令将告诉所有的用户还有多少天,帐户将过期。
6) acua delUser
这个命令将调用acua_deluser脚本,删除一个UNIX/ACUA用户帐号。这个脚本将使用clean-up删除这个用户残留的文件,并且调用acua delrec将ACUA帐号记录删除。
7) acua delRec
删除一个ACUA帐号记录
8) acua dump {login}
这个命令将给出一个ACUA记录的报告。如果有给出{login}的
分类 : 技术文摘 | 发表时间 05-11-2005
分类 : 技术文摘 | 发表时间 24-10-2005
1.oncontextmenu=”window.event.returnvalue=false”将彻底屏蔽鼠标右键
<tableborderoncontextmenu=return(false)><td>no</table>可用于Table
2.<bodyonselectstart=”returnfalse”>取消选取、防止复制
3.onpaste=”returnfalse”不准粘贴
4.oncopy=”returnfalse;”oncut=”returnfalse;”防止复制
5.<linkrel=”ShortcutIcon”href=”favicon.ico”>IE地址栏前换成自己的图标
6.<linkrel=”Bookmark”href=”favicon.ico”>可以在收藏夹中显示出你的图标
7.<inputstyle=”ime-mode:disabled”>关闭输入法
8.永远都会带着框架
<scriptlanguage=”javascript“><!–
if(window==top)top.location.href=”frames.htm”;//frames.htm为框架网页
//–></script>
9.防止被人frame
<SCRIPTLANGUAGE=javascript><!–
if(top.location!=self.location)top.location=self.location;
//–></SCRIPT>
10.<noscript><iframesrc=*.html></iframe></noscript>网页将不能被另存为
11.<inputtype=buttonvalue=查看网页源代码
onclick=”window.location=’view-source:’+'<IMG src=”../../pic/url.gif” align=absMiddle border=0>http://www.csdn.net/”>
12.怎样通过asp的手段来检查来访者是否用了代理
<%ifRequest.ServerVariables(“HTTP_X_FORWARDED_FOR”)<&g t;”"then
response.write”<fontcolor=#FF0000>您通过了代理服务器,”&_
“真实的IP为”&Request.ServerVariables(“HTTP_X_FORWARDED_FOR”)
endif
%>
13.取得控件的绝对位置
//javascript
<scriptlanguage=”javascript“>
functiongetIE(e){
vart=e.offsetTop;
varl=e.offsetLeft;
while(e=e.offsetParent){
t+=e.offsetTop;
l+=e.offsetLeft;
}
alert(“top=”+t+”/nleft=”+l);
}
</script>
//VBScript
<scriptlanguage=”VBScript”><!–
functiongetIE()
dimt,l,a,b
seta=document.all.img1
t=document.all.img1.offsetTop
l=document.all.img1.offsetLeft
whilea.tagName<>”BODY”
seta=a.offsetParent
t=t+a.offsetTop
l=l+a.offsetLeft
wend
msgbox”top=”&t&chr(13)&”left=”&l,64,”得到控件的位置”
endfunction
–></script>
14.光标是停在文本框文字的最后
<scriptlanguage=”javascript“>
functioncc()
{
vare=event.srcElement;
varr=e.createTextRange();
r.moveStart(‘character’,e.value.length);
r.collapse(true);
r.select();
}
</script>
<inputtype=textname=text1value=”123″onfocus=”cc()”>
15.判断上一页的来源
asp:
request.servervariables(“HTTP_REFERER”)
javascript :
document.referrer
16.最小化、最大化、关闭窗口
<objectid=hh1classid=”clsid:ADB880A6-D8FF-11CF-9377-00AA0 03B7A11″>
<paramname=”Command”value=”Minimize”></object>
<objectid=hh2classid=”clsid:ADB880A6-D8FF-11CF-9377-00AA0 03B7A11″>
<paramname=”Command”value=”Maximize”></object>
<OBJECTid=hh3classid=”clsid:adb880a6-d8ff-11cf-9377-00aa0 03b7a11″>
<PARAMNAME=”Command”value=”Close”></OBJECT>
<inputtype=buttonvalue=最小化onclick=hh1.Click()>
<inputtype=buttonvalue=最大化onclick=hh2.Click()>
<inputtype=buttonvalue=关闭onclick=hh3.Click()>
本例适用于IE
17.
<%
‘定义数据库连接的一些常量
ConstadOpenForwardOnly=0′游标只向前浏览记录,不支持分页、Recordset、BookMark
ConstadOpenKeyset=1′键集游标,其他用户对记录说做的修改将反映到记录集中,但其他用户增加或删除记录不会反映到记录集中。支持分页、Recordset、BookMark
ConstadOpenDynamic=2′动态游标功能最强,但耗资源也最多。用户对记录说做的修改,增加或删除记录都将反映到记录集中。支持全功能浏览(ACCESS不支持)。
ConstadOpenStatic=3′静态游标,只是数据的一个快照,用户对记录说做的修改,增加或删除记录都不会反映到记录集中。支持向前或向后移动
ConstadLockReadOnly=1′锁定类型,默认的,只读,不能作任何修改
ConstadLockPessimistic=2′当编辑时立即锁定记录,最安全的方式
ConstadLockOptimistic=3′只有在调用Update方法时才锁定记录集,而在此前的其他操作仍可对当前记录进行更改、插入和删除等
ConstadLockBatchOptimistic=4′当编辑时记录不会被锁定,而更改、插入和删除是在批处理方式下完成的
ConstadCmdText=&H0001
ConstadCmdTable=&H0002
%>
18.网页不会被缓存
HTM网页
<METAHTTP-EQUIV=”pragma”CONTENT=”no-cache”>
<METAHTTP-EQUIV=”Cache-Control”CONTENT=”no-cache,must-rev alidate”>
<METAHTTP-EQUIV=”expires”CONTENT=”Wed,26Feb199708:21:57GM T”>
或者<METAHTTP-EQUIV=”expires”CONTENT=”0″>
ASP网页
Response.Expires=-1
Response.ExpiresAbsolute=Now()-1
Response.cachecontrol=”no-cache”
PHP网页
header(“Expires:Mon,26Jul199705:00:00GMT”);
header(“Cache-Control:no-cache,must-revalidate”);
header(“Pragma:no-cache”);
19.检查一段字符串是否全由数字组成
<scriptlanguage=”javascript“><!–
functioncheckNum(str){returnstr.match(//D/)==null}
alert(checkNum(“1232142141″))
alert(checkNum(“123214214a1″))
//–></script>
20.获得一个窗口的大小
document.body.clientWidth,document.body.clientHeight
21.怎么判断是否是字符
if(/[^/x00-/xff]/g.test(s))alert(“含有汉字”);
elsealert(“全是字符”);
22.TEXTAREA自适应文字行数的多少
<textarearows=1 name=s1 cols=27 onpropertychange=”this.style.posHeight=this.scrollHeight”> ; ;
</textarea>
23.日期减去天数等于第二个日期
<scriptlanguage=javascript>
functioncc(dd,dadd)
{
//可以加上错误处理
vara=newDate(dd)
a=a.valueOf()
a=a-dadd*24*60*60*1000
a=newDate(a)
alert(a.getFullYear()+”年”+(a.getMonth()+1)+”月”+a.getDate()+”日”)
}
cc(“12/23/2002″,2)
</script>
24.选择了哪一个Radio
<HTML><scriptlanguage=”vbscript”>
functioncheckme()
foreachobinradio1
ifob.checkedthenwindow.alertob.value
next
endfunction
</script><BODY>
<INPUT name=”radio1″ type=”radio” value=”style” checked>Style
<INPUT name=”radio1″ type=”radio” value=”barcode”>Barcode
<INPUT type=”button” value=”check”onclick=”checkme()”>
</BODY></HTML>
25.获得本页url的request.servervariables(“”)集合
Response.Write”<TABLEborder=1><!–TableHeader–> <TR><TD><B>Variables</B></TD>& lt;TD><B>value</B></TD></TR>”
foreachobinRequest.ServerVariables
Response.Write”<TR><TD>”&ob&”</TD> <TD>”&Request.ServerVariables(ob)&”</TD> </TR>”
next
Response.Write”</TABLE>”
26.
本机ip<%=request.servervariables(“remote_addr”)%>
服务器名<%=Request.ServerVariables(“SERVER_NAME”)%>
服务器IP<%=Request.ServerVariables(“LOCAL_ADDR”)%>
服务器端口<%=Request.ServerVariables(“SERVER_PORT”)%>
服务器时间<%=now%>
IIS版本<%=Request.ServerVariables”SERVER_SOFTWARE”)%>
脚本超时时间<%=Server.ScriptTimeout%>
本文件路径<%=server.mappath(Request.ServerVariables(“SCRIPT_NAME”))%>
服务器CPU数量<%=Request.ServerVariables(“NUMBER_OF_PROCESSORS”)%>
服务器解译引擎<%=ScriptEngine&a
mp;”/” & ScriptEngineMajorVersion &”.” & ScriptEngineMinorVersion & “.” & ScriptEngineBuildVersion%>
服务器操作系统<%=Request.ServerVariables(“OS”)%>
27.ENTER键可以让光标移到下一个输入框
<input onkeydown=”if(event.keyCode==13)event.keyCode=9″>
28.检测某个网站的链接速度:
把如下代码加入<body>区域中:
<scriptlanguage=javascript>
tim=1
setInterval(“tim++”,100)
b=1
varautourl=newArray()
autourl[1]=”< src=”../../pic/url.gif” align=absMiddle border=0>www.njcatv.net”
autourl[2]=”javacool.3322.net”
autourl[3]=”< src=”../../pic/url.gif” align=absMiddle border=0>www.sina.com.cn”
autourl[4]=”www.nuaa.edu.cn”
autourl[5]=”< src=”../../pic/url.gif” align=absMiddle border=0>www.cctv.com”
functionbutt(){
document.write(“<formname=autof>”)
for(vari=1;i<autourl.length;i++)
document.write(“<inputtype=textname=txt”+i+”size=10value=测试中……>=》<inputtype=textname=url”+i+”size=40>=》<inputtype=buttonvalue=GOonclick=window.open(this.form.url”+i+”.value)><br/>”)
document.write(“<inputtype=submitvalue=刷新></form>”)
}
butt()
functionauto(url){
document.forms[0]["url"+b].value=url
if(tim>200)
{document.forms[0]["txt"+b].value=”链接超时”}
else
{document.forms[0]["txt"+b].value=”时间”+tim/10+”秒”}
b++
}
functionrun(){for(vari=1;i<autourl.length;i++)document.wr ite(“<imgsrc=http://”+autourl +”/”+Math.random()+”width=1height=1onerror=auto(‘< src=”../../pic/url.gif” align=absMiddle border=0>http://”;+autourl+”‘)>”)}
run()</script>
29.各种样式的光标
auto:标准光标
default:标准箭头
hand:手形光标
wait:等待光标
text:I形光标
vertical-text:水平I形光标
no-drop:不可拖动光标
not-allowed:无效光标
help:?帮助光标
all-scroll:三角方向标
move:移动标
crosshair:十字标
e-resize
n-resize
nw-resize
w-resize
s-resize
se-resize
sw-resize
1.本地无缓存,每次自动刷新
response.expires=0
response.addHeader”pragma”,”no-cache”
response.addHeader”cache-control”,”private”
2.修改contentType并下载gif等格式
<%
functiondl(f,n)
onerrorresumenext
sets=CreateObject(“Adodb.Stream”)
S.Mode=3
S.Type=1
S.Open
s.LoadFromFile(server.mappath(f))
iferr.number>0then
response.writeerr.number&”:”&err.description
else
response.contentType=”application/x-gzip”
response.addheader”Content-Disposition:”,”attachment;filenam e=”&n
response.binarywrite(s.Read(s.size))
endif
endfunction
calldl(“012922501.gif”,”t1.gif”)
%>
19.检查一段字符串是否全由数字组成
<scriptlanguage=”javascript“><!–
functioncheckNum(str){return!//D/.test(str)}
alert(checkNum(“1232142141″))
alert(checkNum(“123214214a1″))
//–></script>
20.获得一个窗口的大小
document.body.clientWidth,document.body.clientHeight
document.body.offsetWidth,document.body.offsetHeight
有时还需要知道window.screenTop,window.screenLeft
21.怎么判断是否含有汉字
if(escape(str).indexOf(“%u”)!=-1)alert(“含有汉字”);
elsealert(“全是字符”);
22.TEXTAREA自适应文字行数的多少
IE5.5+可以用overflow-y:visible
<textarearows=1name=s1cols=27style=”overflow-y:visible”&g t;
</textarea>
23.日期减去天数等于第二个日期
<scriptlanguage=javascript>
functioncc(dd,dadd)
{
//可以加上错误处理
vard=newDate(dd.replace(“-”,”/”))
d.setDate(d.getDate()+dadd)
alert(d.getFullYear()+”年”+(d.getMonth()+1)+”月”+d.getDate()+”日”)
}
cc(“2002-2-28″,2)
</script>
分类 : 技术文摘 | 发表时间 15-10-2005
在网络中,不少服务器采用的是Linux系统。为了进一步提高服务器的性能,可能需要根据特定的硬件及需求重新编译Linux内核。编译Linux内核,需要根据规定的步骤进行,编译内核过程中涉及到几个重要的文件。比如对于RedHat Linux,在/boot目录下有一些与Linux内核有关的文件,进入/boot执行。
编译过RedHat Linux内核的人对其中的System.map、vmlinuz、initrd-2.4.7-10.img印象可能比较深刻,因为编译内核过程中涉及到这些文件的建立等操作。那么这几个文件是怎么产生的?又有什么作用呢?本文对此做些介绍。
一、vmlinuz
vmlinuz是可引导的、压缩的内核。“vm”代表“Virtual Memory”。Linux 支持虚拟内存,不像老的操作系统比如DOS有640KB内存的限制。Linux能够使用硬盘空间作为虚拟内存,因此得名“vm”。vmlinuz是可执行的Linux内核,它位于/boot/vmlinuz,它一般是一个软链接,比如图中是vmlinuz-2.4.7-10的软链接。
vmlinuz的建立有两种方式。一是编译内核时通过“make zImage”创建,然后通过:“cp /usr/src/linux-2.4/arch/i386/linux/boot/zImage/boot/vmlinuz”产生。zImage适用于小内核的情况,它的存在是为了向后的兼容性。
二是内核编译时通过命令make bzImage创建,然后通过:“cp/usr/src/linux-2.4/arch/i386/linux/boot/bzImage /boot/vmlinuz”产生。bzImage是压缩的内核映像,需要注意,bzImage不是用bzip2压缩的,bzImage中的bz容易引起误解,bz表示“big zImage”。 bzImage中的b是“big”意思。 zImage(vmlinuz)和bzImage(vmlinuz)都是用gzip压缩的。它们不仅是一个压缩文件,而且在这两个文件的开头部分内嵌有gzip解压缩代码。所以你不能用gunzip 或 gzip –dc解包vmlinuz。
内核文件中包含一个微型的gzip用于解压缩内核并引导它。两者的不同之处在于,老的zImage解压缩内核到低端内存(第一个640K),bzImage解压缩内核到高端内存(1M以上)。如果内核比较小,那么可以采用zImage或bzImage之一,两种方式引导的系统运行时是相同的。大的内核采用bzImage,不能采用zImage。vmlinux是未压缩的内核,vmlinuz是vmlinux的压缩文件。
二、initrd-x.x.x.img
initrd是“initial ramdisk”的简写。initrd一般被用来临时的引导硬件到实际内核vmlinuz能够接管并继续引导的状态。图中的initrd-2.4.7-10.img主要是用于加载ext3等文件系统及scsi设备的驱动。
比如,使用的是scsi硬盘,而内核vmlinuz中并没有这个scsi硬件的驱动,那么在装入scsi模块之前,内核不能加载根文件系统,但scsi模块存储在根文件系统的/lib/modules下。为了解决这个问题,可以引导一个能够读实际内核的initrd内核并用initrd修正scsi引导问题。initrd-2.4.7-10.img是用gzip压缩的文件,initrd实现加载一些模块和安装文件系统等功能。
initrd映象文件是使用mkinitrd创建的。mkinitrd实用程序能够创建initrd映象文件。这个命令是RedHat专有的。其它Linux发行版或许有相应的命令。这是个很方便的实用程序。具体情况请看帮助:man mkinitrd下面的命令创建initrd映象文件。
三、System.map
System.map是一个特定内核的内核符号表。它是你当前运行的内核的System.map的链接。
内核符号表是怎么创建的呢? System.map是由“nm vmlinux”产生并且不相关的符号被滤出。
对于本文中的例子,编译内核时,System.map创建在/usr/src/linux-2.4/System.map。像下面这样:
nm /boot/vmlinux-2.4.7-10 > System.map
下面几行来自/usr/src/linux-2.4/Makefile:
nm vmlinux | grep -v ‘\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)’ | sort > System.map
然后复制到/boot:
cp /usr/src/linux/System.map /boot/System.map-2.4.7-10
下图是System.map文件的一部分:
在进行程序设计时,会命名一些变量名或函数名之类的符号。Linux内核是一个很复杂的代码块,有许许多多的全局符号。
Linux内核不使用符号名,而是通过变量或函数的地址来识别变量或函数名。比如不是使用size_t BytesRead这样的符号,而是像c0343f20这样引用这个变量。
对于使用计算机的人来说,更喜欢使用那些像size_t BytesRead这样的名字,而不喜欢像c0343f20这样的名字。内核主要是用c写的,所以编译器/连接器允许我们编码时使用符号名,当内核运行时使用地址。
然而,在有的情况下,我们需要知道符号的地址,或者需要知道地址对应的符号。这由符号表来完成,符号表是所有符号连同它们的地址的列表。上图就是一个内核符号表,由上图可知变量名checkCPUtype在内核地址c01000a5。
Linux 符号表使用到2个文件:
/proc/ksyms
System.map
/proc/ksyms是一个“proc file”,在内核引导时创建。实际上,它并不真正的是一个文件,它只不过是内核数据的表示,却给人们是一个磁盘文件的假象,这从它的文件大小是0可以看出来。然而,System.map是存在于你的文件系统上的实际文件。
当你编译一个新内核时,各个符号名的地址要发生变化,你的老的System.map具有的是错误的符号信息。每次内核编译时产生一个新的System.map,你应当用新的System.map来取代老的System.map。
虽然内核本身并不真正使用System.map,但其它程序比如klogd,lsof和ps等软件需要一个正确的System.map。如果你使用错误的或没有System.map,klogd的输出将是不可靠的,这对于排除程序故障会带来困难。没有System.map,你可能会面临一些令人烦恼的提示信息。
另外少数驱动需要System.map来解析符号,没有为你当前运行的特定内核创建的System.map它们就不能正常工作。
Linux的内核日志守护进程klogd为了执行名称-地址解析,klogd需要使用System.map。System.map应当放在使用它的软件能够找到它的地方。执行:man klogd可知,如果没有将System.map作为一个变量的位置给klogd,那么它将按照下面的顺序,在三个地方查找System.map:
/boot/System.map
/System.map
/usr/src/linux/System.map
System.map也有版本信息,klogd能够智能地查找正确的映象(map)文件。
分类 : 技术文摘 | 发表时间 13-10-2005
一、安装反向代理服务器
1.下载反向代理服务器软件采用squid,下载地址:
http://www.squid-cache.org/Versions/v2/2.2/squid-2.2.STABLE5-src.tar.gz
下载后存放在/usr/local/squid/src目录里,文件名是
squid-2.2.STABLE5-src.tar.gz ;
2.解压代理服务器软件包:
进入/usr/local/squid/src目录,键入如下命令:
gzip -dc squid-2.2.STABLE5-src.tar.gz | tar -xvf -
这个命令将代理服务器软件包解开,建立一个目录叫作squid-2.2.STABLE5,并且把所有的文件放在这个目录里面。
3. 编译源程序
首先运行配置脚本,以便生成适合您的机器的编译脚本。命令格式是:
./configure
这种方式产生的编译脚本编译后默认安装路径是/usr/local/squid。
如果想改变安装路径,需要用以下格式:
./configure -prefix=/some/other/directory
这种方法编译后安装到/some/other/directory里面。
生成编译脚本后,可以正式开始编译了。命令为:
make
4、 安装Squid代理服务器
编译通过后,用以下命令安装:
make install
安装完成后,会在您指定的安装路径里产生一个squid目录,squid目录下有三个目录:etc、bin、logs。其中etc里面是配置文件,bin里面是执行文件,logs里面是日志文件。
二、调试反向代理服务器
安装结束后就是调试服务器,使其按照您的要求工作。Squid的配置文件只有一个,在etc目录里,名字是squid.conf,所有的配置选项都在这个文件里面。而且每个配置项目都有注释说明。我们只介绍与反向代理有关的几个项目。
首先,在squid文件里面找到下列配置项:
cache_mem
这里可以添上您准备给squid作为高速缓存使用的内存大小。注意,如果您的机器有N兆内存,那么,推荐您在这里添的数字是N/3。
cache_dir /usr/local/squid/cache 100 16 256
这里的第一个数字100是您准备给squid作为cache使用的硬盘空间大小,单位是兆。如果您想划100M空间当作cache,那么这里就写100。
acl, http_access, icp_access
填写”allowedip”和”allowedip1″ACL访问控制列表。这里应该填写你对外公开的服务器的IP,比如此例的两个WEB服务器对应的外部地址为202.99.157.10 和 202.99.157.18,
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl all src 0.0.0.0/0.0.0.0
acl allowedip src 202.99.157.10/255.255.255.255
acl allowedip1 src 202.99.157.18/255.255.255.255
http_access deny manager all
http_access allow allowedip
http_access allow allowedip1
http_access deny all
icp_access allow allowedip
icp_access allow allowedip1
icp_access deny all
cache_mgr webmaster@test.com.cn
这里填写cache管理员的Email地址,系统出错会自动提醒cache管理员。
******以上部分均为squid的通用设置以下为关于反向代理部分的设置******
httpd_accel_host test.com.cn
httpd_accel_host test1.com.cn
此处设置反向代理的主机名
httpd_accel_port 80
此处设置反向代理的WEB服务端口号
#httpd_accel_with_proxy off
此处设置开反向代理的同时,是否开普通代理服务
修改完配置文件,在正式运行squid代理服务器之前,先进行初始化。命令如下:
% /usr/local/squid/bin/squid -z
% /usr/local/squid/bin/squid
检查cache.log文件确保所有部分运行正常。如果有出错信息或系统不能正常启动,一般情况是由于目录和文件的存取权限导致的,请仔细检查各目录和文件的权限设置。 其中特别需要注意的是初始化之前应该将squid目录设置成可写,然后将创建的cache目录和logs目录设置成可写。如果一切正常,那么就可以投入使用了。系统默认的服务端口是3128。
反向代理服务器软件安装完毕后,将该服务器在80端口的http服务设置成不启用。
三、调整DNS服务器设置
假设DNS服务器(以下称标准DNS服务器)将test.com.cn解析为202.99.157.10,将test1.com.cn解析为202.99.157.18,那么我们在配置反向代理服务器这台机器的DNS服务时(我们以下称为内部DNS服务器),可以针对内部地址的WEB做如下变换:
主机名 标准DNS解析为 内部
DNS解析为
www.test.com.cn 202.99.157.10 192.168.1.10
www.test1.com.cn 202.99.157.18 192.168.1.18
然后把202.99.157.10和202.99.157.18这两个IP绑定到反向代理服务器上,这样,外界对www.test.com.cn和www.test1.com.cn 的访问就会由标准DNS解析到反向代理服务器上,默认WEB服务器的服务端口是80,但是由于反向代理服务器的80端口的http服务已经终止,此时的访问会没有结果。为了能使该访问请求能够成功完成,需要在反向代理服务器和真实的www.test.com.cn 和www.test1.com.cn 的WEB服务器之间建立联系。要和有内部地址的真实WEB服务器建立联系,首先反向代理服务器上需要再绑定一个内部IP,比如192.168.1.2,其余部分由transproxy这个透明代理软件来完成。Transproxy服务软件通过设置,启用端口81和squid建立联系,把内部DNS对www.test.com.cn和www.test1.com.cn的解析地址传给squid服务器,然后通过squid.conf里面关于服务器端口的设置,将服务端口设置为80,这样,squid就访问内部真实WEB服务器192.168.1.10和192.168.1.18的80端口,把需要访问的WEB内容取回来,放在squid的cache里供外界访问。透明代理软件transproxy设置完成后,需要通过设置ipchains规则,将外界发往反向代理服务器的80端口的http请求转发到transproxy 的81端口,这样就建立了外界通过反向代理间接和真实WEB服务器之间的联系。
四、安装透明代理软件
透明代理服务器安装分如下几步:下载、解压、编译、安装、配置几步。首先需要到http://www.transproxy.nlc.net.au/transproxy-1.3.tgz下载transproxy软件包,也放在/usr/local/src目录里,然后用gzip解压该软件包。具体命令是:
gzip -dc transproxy-1.3.tgz |tar -xvf -
解压后在/usr/local/src目录下面生成tproxy目录,里面是transproxy的源程序。
进入该目录,用make命令编译该软件,用make install命令安装transproxy。Transproxy的编译和安装都很简单,下面就需要配置transproxy。根据系统负荷的轻重不同,transproxy可以配置为两种运行方式:负荷轻时,用inetd方式,负荷重时,用standalone server方式。具体配置方法如下:
1. inetd方式:
在/etc/services文件中添加下面一行:
tproxy 81/tcp #transproxy
在/etc/inetd.conf文件中添加下面一行:
tproxy stream tcp nowait nobody /usr/sbin/tcpd tproxy 202.99.157.10 3128
或
tproxy stream tcp nowait nobody /usr/sbin/tcpd tproxy 202.99.157.18 3128
2. standalone server方式:
在/etc/rc.d/rc.local文件中加入下面一行:
/usr/local/sbin/tproxy -s 81 -r nobody 202.99.157.10 3128
或
/usr/local/sbin/tproxy -s 81 -r nobody 202.99.157.18
3128
设置完毕后重新启动反向代理服务器,所有新设置的功能即可实现。
五、设置转发规则
ipchains -A input -p tcp -d 202.99.157.10/255.255.255.255 80 -j REDIRECT 81
ipchains -A input -p tcp -d 202.99.157.18/255.255.255.255 80 -j REDIRECT 81
这里将送往202.99.157.10和202.99.157.18的80端口的所有http请求转发给由transproxy管理的端口81。
到此为止,透明反向代理配置完成了。
让我们模拟一下一位因特网用户访问www.test.com.cn这台拥有内部IP(192.168.1.10)的WEB服务器的过程。首先,该用户的请求由标准DNS服务器解析为202.99.157.10,则用户的机器向202.99.157.10的80端口发出请求,要求浏览www.test.com.cn这台WEB服务器的页面,而202.99.157.10这台机器正是我们的反向代理服务器,按照反向代理服务器的ipchains规则发往该服务器80端口的请求被转发到81端口,而81端口由transproxy 控制,transproxy把请求发给squid,让squid去取www.test.com.cn这个页面。而反向代理服务器上的内部DNS服务器把www.test.com.cn解析为192.168.1.10,默认的反向代理端口是80,这样,squid就到192.168.1.10的端口80上请求WEB服务。而192.168.1.10正是我们的www.test.com.cn的真实WEB服务器,它的80端口开放着http服务。这样,squid从192.168.1.10服务器上取回页面传回给202.99.157.10 然后再传回给因特网上的对www.test.com.cn有访问请求的用户,并把该页面放在squid的cache中。这样就完成了一次因特网用户到拥有内部IP的WEB服务器的访问过程。以后再有因特网用户再访问www.test.com.cn这个页面时,squid就直接从cache里提取缓存的页面,这样可以提高WEB服务器的访问效率。
因特网用户对www.test1.com.cn的访问也和对www.test.com.cn的访问一样,原理是相同的,只不过访问的真实服务器不同而已。
从上面的访问例子我们可以看出,因特网上的用户在访问www.test.com.cn这个WEB 服务器时,根本不和真正提供www.test.com.cn页面的服务器打交道,只和反向代理服务器打交道,这样,在破坏互联网主机的黑客行为日益猖獗的情况下,只要正确设置反向代理服务器,确保反向代理服务器不被攻破,就会很大程度上杜绝因特网上的黑客对内部服务器的攻击。万一代理服务器被攻破,也不会对您的WEB服务器造成什么损害,您只要恢复反向代理服务器就行了。因此,本方法对您的WEB服务器起到一定程度的保护作用。而且在WEB浏览量较多的情况下,由于squid的反向代理有加速功能,可以加快页面的浏览速度。
六、其他
反向代理应用过程中,要注意访问控制功能,应该只允许访问你开放的内部服务器,而不允许访问其他服务器,否则,你的反向代理服务器就会成为互联网上一台公开的不用验证的代理服务器,那就危险啦。另外,如果您有多台WEB服务器,可以选一台性能较好的作为反向代理服务器,内部的若干WEB服务器可以用PC或低档服务器代替,因为外部的访问压力主要集中在反向代理服务器上。
另外此方案如果和linux下面的防火墙方案结合使用会更加完美。
分类 : 技术文摘 | 发表时间 02-10-2005
1:为什么会有Tripwire,什么是Tripwire
对unix管理员来说,主机系统的安全一直是个课题,一方面管理员通过更新patch,安装软硬件防火墙等手段努力使自己的系统可靠性增强,而另一方面unix操作系统的漏洞总是不断被发现并被公布出来,如BUGTRAQ这样的安全列表,从这个角度上可以很绝对的说,互联网上没有安全的主机。任何一台放在Internet上的主机被入侵的潜在可能性是不可逃脱的,而且,对入侵者而言,利用漏洞进入系统往往只是第一步,如果想得到更多的,如超级用户的密码,数据库的口令等,往往需要下点功夫,最便捷也是最有效的就是改动或特洛伊化受侵害的主机上的文件,如放置自己的监听程序,替代某些关键文件,修改编辑可信文件,设置suid文件等。
一些管理员通unix自带的命令来检查文件的安全性,如检查文件生成的时间戳,但这样的可靠性微乎其微,有经验的入侵者可以很轻松的修改文件生成时间,有兴趣的管理员可以试试以下操作:
secu.unix.org# echo “+ +” > /.rhosts
这一步生成一个.rhosts文件,看看它的时间。
Secu.Unix.org# ls -l /.rhosts
-rw-r–r– 1 root other 4 Jul 2 16:45 /.rhosts
好,我们如下操作看看会怎么样?
Secu.unix.org# touch -r /bin/sh /.rhosts
有什么效果? 我们再次ls –l看一下,
secu.unix.org# ls -l /.rhosts
-rw-r–r– 1 root other 4 Apr 5 16:32 /.rhosts
我们看到时间戳已经变了。变成了一个”老”文件,这样很可能就会逃脱管理员的视线。。
又比如,入侵者替换掉了su文件,在正当用户每次试图su时,这个特洛伊化的su文件都会读取口令并将口令记载下来,然后才把控制权交给真正的su程序,口令通过这种途径泄密了,虽然这不是管理员所期望的,但毕竟unix太大太复杂,发现起来很困难。
Tripwire就是解决这一问题的经典工具,它是目前最为著名的unix下文件系统完整性检查的软件工具,这一软件采用的技术核心就是对每个要监控的文件产生一个数字签名,保留下来。当文件现在的数字签名与保留的数字签名不一致时,那么现在这个文件必定被改动过了。具体到监控项目,在Tripwire的配置文件中有如下相应说明:
access permissions and file mode settings, including effective execution settings
inode number in the file system
number of links
user ID of the owner
group ID of the group of users to which access may be granted
size of the item
date and time the item was last accessed, the last modification made to the item, and the creation date and time associated with the item’s inode
由上,我们可以看到Tripwire对文件的管理面是很宽的。
2: Tripwire的工作原理
当Tripwire运行在数据库生成模式时,会根据管理员设置的一个配置文件对指定要监控的文件进行读取,对每个文件生成相应数字签名,并将这些结果保存在自己的数据库中,在缺省状态下,MD5和SNCFRN(Xerox的安全哈希函数)加密手段被结合用来生成文件的数字签名。除此以外,管理员还可使用MD4,CRC32,SHA等哈希函数,但实际上,使用上述两种哈希函数的可靠性已相当高了,而且结合MD5和sncfrn两种算法(尤其是sncfrn)对系统资源的耗费已较大,所以在使用时可根据文件的重要性做取舍。当怀疑系统被入侵时,可由Tripwire根据先前生成的,数据库文件来做一次数字签名的对照,如果文件被替换,则与Tripwire数据库内相应数字签名不匹配, 这时Tripwire会报告相应文件被更动,管理员就明白系统不”干净”了。
有一点要注意,上述保障机制的重点在于数据库内的数字签名,如果数据库是不可靠的,则一切工作都丧失意义。所以在Tripwire生成数据库后,这个库文件的安全极为重要。比较常见的做法是将数据库文件, Tripwire二进制文件,配置文件单独保留到”可拿走并锁起来”的介质上,如软盘,将上述文件复制到软盘后,关闭写保护口,锁到保险柜中。除软盘外, 一次性介质,如cd-r也是很好的选择,这样即使侵入者拿到盘也无计可施。
除这种办法外,利用PGP等加密工具对上述关键文件进行数字签名也是一个很好的选择。
当然,当管理员自身对某些文件更动时, Tripwire的数据库必然是需要随之更新的, Tripwire考虑到了这一点,它有四种工作模式:数据库生成,完整性检查,数据库更新。交互更新。当管理员更动文件后,可运行数据库更新模式来产生新的数据库文件。
3:下载Tripwire,安装前的准备工作
Tripwire支持绝大多数Unix操作系统,它的安装需要编译环境,如gcc,cc等,还需要gzip,gunzip等解压工具。这些工具管理员可从相应站点获取,这里不讨论。
Tripwire可从http://www.tripwire.com获得,到它的…ad的Tripwire1.3 ASR版本,下载下来就是。
4:安装Tripwire
Tripwire的tar包解开后,我们可以看到如下目录结构,建议先看看根下的README文件,对Tripwire有个整体的了解。随后,我们就可以一步步的安装这个软件了。
步骤1:匹配主机环境
在Tripwire的根下有Ported这个文件,它是对支持的系统及相关配置文件的描述,管理员第一步需要打开这个文件,找到符合自己系统的描述,本文的测试环境是solaris2.6,我们截取相关部分来看看,
vendor: Sun Microsystems, Inc.
os: SunOS
os version: 5.x (Solaris 2.x)
compiler: cc
cflags: -O
ldflags:
libs:
conf.h: conf-svr4.h
tw.config: tw.Conf.sunos5
notes:
在这一段描述中,要尤其注意的是conf.h 和tw.config对应的行,在下几步的配置中需要用到它们两个对应的文件。此处要注意的是:每种操作系统这两个地方所对应的文件是不同的。
步骤2:配置监控目标
进入include目录,编辑config.h文件,将第一步Ported中conf.h后对应的文件名和路径写入config.h开始#include部分,此例中即为
#include “../configs/conf-svr4.h”
同时注意的是,在configh文件中还有Tripwire配置文件,Tripwire数据库文件的放置路径及生成数据库的文件名等设置,管理员按照个人喜好设置即可。
编辑好config.h后,还要根据本机情况编辑修改位于configs目录下的Tripwire配置文件,也就是上面Ported 文件中tw.config对应的tw.conf.sunos5,我们知道,对文件,目录等的监控就是在这里设置的。我们一段段的选取一部分这个文件来看看:
#
# – : ignore the following atributes
# + : do not ignore the following attributes
#
# p : permission and file mode bits a: access timestamp
# i : inode number m: modification timestamp
# n : number of links (ref count) c: inode creation timestamp
# u : user id of owner 1: signature 1
# g : group id of owner 2:
signature 2
# s : size of file
注意上述p,I,n,u,g,s,a,c,1,2等,它表示可以对文件,目录设置的监控项目,管理员可组合使用,最前面的-,+号表示选取或忽略这些属性。如下例:
/var +pinugsm12-a
它表示对目录/var下所有文件检查,监控项目分别有文件属性,inode,链接数,属组,属主,修改时间,生成时间,数字签名等,但是,对这个目录下的文件的访问不加监控,如果访问也监控的话,正常的用户访问也会被Tripwire捕捉,这没有必要。
为了方便起见,Tripwire作者把常见组合做成了模板,如下,
#
# Templates: (default) R : [R]ead-only (+pinugsm12-a)
# L : [L]og file (+pinug-sam12)
# N : ignore [N]othing (+pinusgsamc12)
# E : ignore [E]verything (-pinusgsamc12)
#
tw.conf.sunos5这个文件再向下,就是管理员根据情况填写了,把需要监控的文件及目录加入列表,赋予相应属性即可。如下:
/ R
/.rhosts R # may not exist
/.profile R # may not exist
/etc/dfs/dfstab R
/etc/hosts.equiv R
/etc/inet/inetd.conf R
/etc/inet/protocols R
/etc/inet/services R
/etc/init.d R
/etc/motd L
#/etc/named.boot R # may not exist
/etc/opt R
/etc/passwd L
/etc/profile R
步骤3:编译
完成上两步后,就可以编译了,在Tripwire的根下,执行make,系统即会自动编译,编译成功后,可以再执行make test, Tripwire会自动检查编译情况及工作状态,它会一段一段的测试,我们选取一段如下:
=== test.Update.sh: DESCRIPTION
This shell script exercises all the Tripwire integrity checking
and database update functionalities。
=== test.update.sh: Setting up auxiliary scripts ===
=== test.update.sh: BEGIN ===
../src/tripwire -loosedir -c /tmp/twtest/tw.config -d /tmp/twtest/tw.db -i all
=== test.update.sh: testing GROWING (safe) files ===
=== test.update.sh: testing GROWING (unsafe) files ===
=== test.update.sh: testing ADDED files ===
=== test.update.sh: testing DELETED files ===
=== test.update.sh: testing CHANGED files ===
=== test.update.sh: testing input schemes ===
=== test.update.sh: tw.config from stdin
=== test.update.sh: database from stdin
=== test.update.sh: testing complex UPDATE cases
=== test.update.sh: changed ignore-mask (UPDATE file)
=== test.update.sh: changed ignore-mask (UPDATE entry)
=== test.update.sh: testing UPDATED files (7 cases)
=== test.update.sh: case 1: update: add new file ===
=== test.update.sh: case 2: update: delete file ===
=== test.update.sh: case 3: update: update file ===
=== test.update.sh: case 4: nonsense case (skipping) ===
=== test.update.sh: case 6: update: delete entry ===
=== test.update.sh: case 5: update: add entry ===
=== test.update.sh: case 7: update: update entry ===
=== test.update.sh: PASS ===
我们可以看到,Tripwire对update功能一项项的做检测,并在最后PASS了,当Tripwire所有的检测项目都PASS后,编译就OK了。
步骤4:生成数据库
成功编译Tripwire,我们准备开始对需要监控的文件进行扫描,以生成Tripwire数据库,在Tripwire 的src目录下:如下操作。/tripwire –init,则系统会根据tw.conf.sunos5文件内的设置,开始扫描并生成相应的数据库,上面提到,数据库文件的路径是在第二步configh中设置的,在本例中为/var/tripwire,我们得到了名为tw.db_secu.unix.com的数据库文件。建议此时将Tripwire可执行文件,数据库文件,配置文件COPY到软盘等地方,放到安全的地方。以后需要安全鉴别时直接在软盘上执行即可。
步骤5:测试
数据库生成了,我们来测试一下吧,首先我们在根下touch生成一个goadd文件,其次我们把根下的.cshrc文件做一下改动,在里面加入几个#注释号。然后我们来运行一下Tripwire看如何:
。/ Tripwire –c ./tw.config.sunos5 –d ./tw.db_secu.unix.com
Tripwire(tm) ASR (Academic Source Release) 1.3.1
File Integrity Assessment Software
(c) 1992, Purdue Research Foundation, (c) 1997, 1999 Tripwire
Security Systems, Inc。 All Rights Reserved。 Use Restricted to
Authorized Licensees。
### Phase 1: Reading configuration file
### Phase 2: Generating file list
./tripwire: /.profile: No such file or directory
./tripwire: /kernel/unix: No such file or directory
### Phase 3: Creating file information database
### Phase 4: Searching for inconsistencies
###
### Total files scanned: 4437
### Files added: 1
### Files deleted: 0
### Files changed: 1
###
### Total file violations: 2
###
added: -rw-r–r– root 0 Jul 3 18:45:31 2000 /goadd
changed: -r–r–r– root 669 Jul 3 18:46:15 2000 /.cshrc
### Phase 5: Generating observed/expected pairs for changed files
###
### Attr Observed (what it is) Expected (what it should be)
### =========== ============================= =============================
/.cshrc
st_size: 669 668
st_mtime: Mon Jul 3 18:46:15 2000 Mon Jul 3 09:00:41 2000
st_ctime: Mon Jul 3 18:46:15 2000 Mon Jul 3 09:00:41 2000
md5 (sig1): 3z9gKjlZGq5GbeWOxpYaF9 1Z7K0n3ZKAyuPpAZB1G8uq
snefru (sig2): 1vCDeMR45lpRCChmDithiW 1oRYPpQ:oZA6hVx6Zi4.NG
可以看到,系统运行经过了5个步骤,首先读取配置文件,其次生成配置文件中设置为需要监控,但实际并不存在的文件列表。第三部生成文件信息库,第四步报告检查情况。我们看到共扫描了4437个文件,其中有一个文件是新增加的,有一个文件发生了改变。在下面它列出了这两个文件-正是我们做了手脚的文件!在最后一步Tripwire将发生了改变的文件现在字节数,生成时间,修改时间, md5, snefru签名及数据库中的记录对比列出,是不是很爽?
上面我们讲到的是Tripwire的主要功能,在命令行状态下敲入tripwire –h 就会有其它使用参数的介绍,有兴趣的管理员不妨一试。
分类 : 技术文摘 | 发表时间 27-09-2005
内核简介
内核,是一个操作系统的核心。它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。
Linux的一个重要的特点就是其源代码的公开性,所有的内核源程序都可以在/usr/src/linux下找到,大部分应用软件也都是遵循GPL而设计的,你都可以获取相应的源程序代码。
全世界任何一个软件工程师都可以将自己认为优秀的代码加入到其中,由此引发的一个明显的好处就是Linux修补漏洞的快速以及对最新软件技术的利用。而Linux的内核则是这些特点的最直接的代表。
想象一下,拥有了内核的源程序对你来说意味着什么?首先,我们可以了解系统是如何工作的。通过通读源代码,我们就可以了解系统的工作原理,这在Windows下简直是天方夜谭。其次,我们可以针对自己的情况,量体裁衣,定制适合自己的系统,这样就需要重新编译内核。
在Windows下是什么情况呢?相信很多人都被越来越庞大的Windows整得莫名其妙过。再次,我们可以对内核进行修改,以符合自己的需要。这意味着什么?没错,相当于自己开发了一个操作系统,但是大部分的工作已经做好了,你所要做的就是要增加并实现自己需要的功能。在Windows下,除非你是微软的核心技术人员,否则就不用痴心妄想了。
内核版本号
由于Linux的源程序是完全公开的,任何人只要遵循GPL,就可以对内核加以修改并发布给他人使用。Linux的开发采用的是集市模型(bazaar,与cathedral–教堂模型–对应),为了确保这些无序的开发过程能够有序地进行,Linux采用了双树系统。
一个树是稳定树(stable tree),另一个树是非稳定树(unstable tree)或者开发树(development tree)。一些新特性、实验性改进等都将首先在开发树中进行。如果在开发树中所做的改进也可以应用于稳定树,那么在开发树中经过测试以后,在稳定树中将进行相同的改进。一旦开发树经过了足够的发展,开发树就会成为新的稳定树。
开发数就体现在源程序的版本号中;源程序版本号的形式为x.y.z:对于稳定树来说,y是偶数;对于开发树来说,y比相应的稳定树大一(因此,是奇数)。到目前为止,稳定树的最高版本是2.2.16,最新发布的Redhat7.0所采用的就是2.2.16的内核;开发树的最新版本是2.3.99。也许你已经发现和多网站上都有2.4.0-test9-pre7之类的内核,但是这并不是正式版本。内核版本的更新可以访问http://www.kernel.org。
为什么重新编译内核
Linux作为一个自由软件,在广大爱好者的支持下,内核版本不断更新。新的内核修订了旧内核的bug,并增加了许多新的特性。如果用户想要使用这些新特性,或想根据自己的系统度身定制一个更高效,更稳定的内核,就需要重新编译内核。
通常,更新的内核会支持更多的硬件,具备更好的进程管理能力,运行速度更快、 更稳定,并且一般会修复老版本中发现的许多漏洞等,经常性地选择升级更新的系统内核是Linux使用者的必要操作内容。
为了正确的合理地设置内核编译配置选项,从而只编译系统需要的功能的代码,一般主要有下面四个考虑:
自己定制编译的内核运行更快(具有更少的代码)
系统将拥有更多的内存(内核部分将不会被交换到虚拟内存中)
不需要的功能编译进入内核可能会增加被系统攻击者利用的漏洞
将某种功能编译为模块方式会比编译到内核内的方式速度要慢一些
内核编译模式
要增加对某部分功能的支持,比如网络之类,可以把相应部分编译到内核中(build-in),也可以把该部分编译成模块(module),动态调用。
如果编译到内核中,在内核启动时就可以自动支持相应部分的功能,这样的优点是方便、速度快,机器一启动,你就可以使用这部分功能了;缺点是会使内核变得庞大起来,不管你是否需要这部分功能,它都会存在,这就是Windows惯用的招数,建议经常使用的部分直接编译到内核中,比如网卡。
如果编译成模块,就会生成对应的.o文件,在使用的时候可以动态加载,优点是不会使内核过分庞大,缺点是你得自己来调用这些模块。
内核编译详解
新版本内核的获取和更新
Linux内核版本发布的官方网站是http://www.kernel.org,国内各大ftp上一般都可以找到某些版本的内核。新版本的内核的发布有两种形式,一种是完整的内核版本,另外一种是patch文件,即补丁。
完整的内核版本比较大,比如linux-2.4.0-test8.tar.bz2就有18M之多,网速快的用户可以下载使用。完整内核版本一般是.tar.gz(.tgz)文件或者是.bz2文件,二者分别是使用gzip或者bzip2进行压缩的文件,使用时需要解压缩。
patch文件则比较小,一般只有几十K到几百K,极少的会超过1M,网速慢的用户可以使用patch文件来升级内核。但是patch文件是针对于特定的版本的,你需要找到自己对应的版本才能使用。
编译内核需要root权限,以下操作都假定你是root用户。请把你需要升级的内核拷贝到/usr/src/下(下文中以2.4.0test8的内核的linux-2.4.0test8.tar.gz为例),命令为
#cp linux-2.4.0test8.tar.gz /usr/src
让我们先来查看一下当前/usr/src的内容,注意到有一个linux的符号链接,它指向一个类似于linux-2.2.14(对应于你现在使用的内核版本号)的目录。首先删除这个链接:
#cd /usr/src
#rm -f linux
现在解压我们下载的源程序文件。如果所下载的是.tar.gz(.tgz)文件,请使用下面的命令:
#tar -xzvf linux-2.4.0test8.tar.gz
如果你所下载的是.bz2文件,例如linux-2.4.0test8.tar.bz2,请使用下面的命令
#bzip2 -d linux-2.4.0test8.tar.bz2
#tar -xvf linux.2.4.0.test8.tar
现在让我们再来看一下/usr/src下的内容,你会发现现在有了一个名为linux的目录,里面就是我们需要升级到的版本的内核的源程序。还记得那个名为linux的链接么?之所以使用那个链接就是防止在升级内核的时候会不慎把原来版本内核的源程序给覆盖掉了。我们也需要同样处理:
#mv linux linux-2.4.0test8
#ln -s linux-2.4.0test8 linux
这样我们也有了一个名为linux的符号链接,就不用担心以后会把它覆盖掉了(也许你会觉得重新建立linux的符号链接没有必要,但实际上这是必不可少的,下文中会有介绍)。如果你还下载了patch文件,比如patch-2.4.0test8,你就可以进行patch操作(下面假设patch-2.4.0test8已经位于/usr/src目录下了,否则你需要先把该文件拷贝到/usr/src下):
#patch -p0 < patch-2.4.0test8
现在,我们已经把内核源程序升级到最新版本了,下面就让我们开始内核编译的旅程吧。
通常要运行的第一个命令是:
#cd /usr/src/linux;make mrproper
该命令确保源代码目录下没有不正确的.o文件以及文件的互相依赖。由于我们使用刚下载的完整的源程序包进行编译,所以本步可以省略。而如果你多次使用了这些源程序编译内核,那么最好要先运行一下这个命令。
确保/usr/include/目录下的asm、linux和scsi等链接是指向要升
分类 : 技术文摘 | 发表时间 06-08-2005
注:httpd.conf是*nix环境下的Apache服务器主要配置文件
# 基于 NCSA 服务的配置文件。
#
#这是Apache服务器主要配置文件。
#它包含服务器的影响服务器运行的配置指令。
#参见<URL:<a href=”http://httpd.ache.org/doc-2.0/” target=”_blank”>http://httpd.ache.org/doc-2.0/</a>>以取得关于这些指令的详细信息
#
#不要只是简单的阅读这些指令信息而不去理解它。
#这里只是做了简单的说明,如果你没有参考在线文件,你就会被警告。
#
#这些配置指令被分为下面三个部分:
#1. 控制整个Apache服务器行为的部分(即全局环境变量)
#2. 定义主要或者默认服务参数的指令,也为所有虚拟主机提供默认的设置参数
#3. 虚拟主机的设置参数
#
#配置和日志文件名:如果你指定的文件名以“/”开始(win32下以“dirver:/”),
#服务器将使用绝对路径,如果文件名不是以“/”开始的,那么它将把ServerRoot
#的值附加在文件名的前面,例如,对“logs/foo.log”,如果ServerRoot的值
#为“/usr/local/apache2”,则该文件应为“/usr/local/apache2/logs/foo.log”
#
##第一区:全局环境参数
#
#这里设置的参数将影响整个Apache服务器的行为;
#例如Apache能够处理的并发请求的数量等。
#
#ServerRoot:指出服务器保存其配置、出错和日志文件等的根目录。
#
#注意!如果你想要将它指定为NFS或其它网络上的位置,
#请一定要去阅读与LockFile有关的文档(可能在
#<URL:<a href=”http://httpd.apache.org/docs-2.0/mod/mpm_common.html#lockfile” target=”_blank”>http://httpd.apache.org/docs-2.0/mo…n.html#lockfile</a>> )。
#这将会使你自己也能解决很多问题。
#
#路径的结尾不要添加斜线。
#
ServerRoot “/usr/loacl/apache2″
#
#串行访问的锁文件必须保存在本地磁盘上
#
<IfModule !mpm_winnt.c>
<IfModule !mpm_neware.c>
#LockFile logs/accept.lock
</IfModule>
</IfModule>
#ScoreBoardFile:用来保存内部服务进程信息的文件。
#如果未指明(默认),记分板(scoreboard)将被保存在一个匿名的共享内存段中,
#并且它不能被第三方软件所使用。
#如果指定了,要确保不能使用两个Apache使用同一个记分板文件,
#这个记分板文件必须保存在本地磁盘上。
#
<IfModule !mpm_netware.c>
<IfModule !perchild.c>
#ScoreBoardFile logs/apache_runtime_status
<IfModule>
<IfModule>
#
#PidFile:记录服务器启动进程号的文件。
#
<IfModule !mpm_neware.c>
PidFile logs/httpd.pid
</IfModule>
#
#Timeout:接收和发送前超时秒数
#
Timeout 300
#
#KeepAlive:是否允许稳固的连接(每个连接有多个请求),
#设为”Off”则停用。
#
KeepAlive On
#
#MaxKeepAliveRequests:在稳固连接期间允许的最大请求数,
#设为0表示无限制接入。
#我们推荐你将其设为一个较大的值,以便提高性能
MaxKeepAliveRequests 100
#
#KeepAliveTimeout:在同一个连接上从同一台客户上接收请求的秒数
#
KeepAliveTimeout 15
##
##Server-Pool大小设定(针对MPM的)
##
# prefork MPM
# StartServers:启动时服务器启动的进程数
# MinSpareServers:保有的备用进程的最小数目
# MaxSpareServers:保有的备用进程的最大数目
# MaxClients:服务器允许启动的最大进程数
# MaxRequestsPerChild:一个服务进程允许的最大请求数
<IfModule prefork.c>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestPerChild 0
</IfModule>
# worker MPM
# StartServers:服务器启动时的服务进程数目
# MaxClients:允许同时连接的最大用户数目
# MinSpareThreads:保有的最小工作线程数目
# MaxSpareThreads:允许保有的最大工作线程数目
# ThreadsPerChild:每个服务进程中的工作线程常数
# MaxRequestsPerChild:服务进程中允许的最大请求数目
<IfModule worker.c>
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
# perchild MPM
# NumServers:服务进程数量
# StartThreads:每个服务进程中的起始线程数量
# MinSpareThreads:保有的最小线程数量
# MaxSpareThreads:保有的最大线程数量
# MaxThreadsPerChild:每个服务进程允许的最大线程数
# MaxRequestsPerChild:每个服务进程允许连接的最大数量
<IfModule perchild.c>
NumServers 5
StartThreads 5
MinSpareThreads 5
MaxSpareThreads 10
MaxThreadsPerChild 20
MaxRequestsPerChild 0
</IfModule>
# WinNT MPM
# ThreadsPerChild:服务进程中工作线程常数
# MaxRequestsPerChild:服务进程允许的最大请求数
<IfModule mpm_winnt.c>
ThreadsPerChild 250
MaxRequestsPerChild 0
</IfModule>
# BeOS MPM
# StartThreads:服务器启动时启动的线程数
# MaxClients:可以启动的最大线程数(一个线程等于一个用户)
# MaxRequestsPerThread:每个线程允许的最大请求数
<IfModule beos.c>
StartThreads 10
MaxClients 50
MaxRequestsPerThread 10000
</IfModule>
# NetWare MPM
# ThreadStachSize:为每个工作线程分配的堆栈尺寸
# StartThreads:服务器启动时启动的线程数
# MinSpareThreads:用于处理实发请求的空闲线程数
# MaxSpareThreads:空闲线程的最大数量
# MaxThreads:在同一时间活动的最大线程数
# MaxRequestPerChild:一个线程服务请求的最大数量,
# 推荐将其设置为0,以实现无限制的接入
<IfModule mpm_netware.c>
ThreadStackSize 65536
StartThreads 250
MinSpareThreads 25
MaxSpareThreads 250
MaxThreads 1000
MaxRequestPerChild 0
</IfModule>
# OS/2 MPM
# StartServers:启动的服务进程数量
# MinSpareThreads:每个进程允许的最小空闲线程
# MaxSpareThreads:每个进程允许的最大空闲线程
# MaxRequestsPerChild:每个服务进程允许的最大连接数
<IfModule mpmt_os2.c>
StartServers 2
MinSpareThreads 5
MaxSpareThreads 10
MaxRequestsPerChild 0
</IfModule>
#
# Listen:允许你绑定Apache服务到指定的IP地址和端口上,以取代默认值
# 参见<VirtualHost>指令
# 使用如下命令使Apache只在指定的IP地址上监听,
# 以防止它在IP地址0.0.0.0上监听
#
# Listen 12.34.56.78:80
Listen 80
#
# 动态共享支持(DSO)
#
# 为了能够使用那些以DSO模式编译的模块中的函数,你必须有相应的“LoadModule”行,
# 因此,在这里包含了这些指令,以便能在使用它之前激活。
# 那些静态编译的模块不需要在这里列出 (即以“httpd -l”列出的模块)
#
# 示例:
# LoadModule foo_module modules/mod_foo.so
#
#
# ExtendedStatus:当调用“server-status”时,控制Apache是产生“全”状态
# 信息(ExtendedStatus On),还是产生基本信息(ExtendedStatus Off)。
# 默认为off
#
# ExtendedStatus On
### 第二区:“主”服务配置
#
# 这一区建立被 “主” 服务器用的指令值,以回应那些不被 <VirtualHost>
# 定义处理的任何请求。
# 这些数值也提供默认值给后面定义的<VirtualHost>容器。
# 如果<Virtua
lHost>中有定义,那么这里定义的指令值将被
# <VirtualHost>中的定义所覆盖。
#
<IfModule !mpm_winnt.c>
<IfModule !mpm_neware.c>
#
# 如果你想使httpd以另外的用户或组来运行,你必须在开始时以root方式启动
# 然后再将它切换为你想要使用的用户或组。
#
# User/Group:运行httpd的用户和组
# 在SCO (ODT3)上使用“User nouser”和“Group nogroup”
# 在HPUX上,你可能不能以nobody身份使用共享内存,建议创建一个www用户。
# 注意一些核心(kernel)在组ID大于60000时拒绝setgid(Group)或semctl(IPC_SET),
#节在这些系统上不要使用“Group #-1”。
#
User nobody
Group #-1
</IfModule>
</IfModule>
#
# ServerAdmin:你的邮件地址,当发生问题时Apache将向你发出邮件。
# 作为一个出错文档,这个地址显示在server-generated页上,
# 例如:admin@your-domain.com
#
ServerAdmin kreny@sina.com
#
# ServerName指定Apache用于识别自身的名字和端口号。
# 通常这个值是自动指定的,但是我们推荐你显式的指定它以防止启动时出错
#
# 如果你为你的主机指定了一个无效的DNS名,server-generated重定向将不能工作。
# 参见UseCanonicalName指令
#
# 如果你的主机没有注册DNS名,在这里键入它的IP地址
# 无论如何,你必须使用它的IP地址来提供服务,
# 这里使用一种容易理解的方式重定向服务
ServerName <a href=”http://www.dalouis.com:80″ target=”_blank”>www.dalouis.com:80</a>
#
# UseCanonicalName:决定Apache如何构造URLS和 SERVER_NAME 和 SERVER_PORT 的指令。
# 当设置为 “Off”时,Apache会使用用户端提供的主机名和端口号。
# 当设置为“On”,Apache会使用ServerName指令的值。
#
UseCanonicalName Off
#
# DocumentRoot:你的文档的根目录。默认情况下,所有的请求从这个目录进行应答。
# 但是可以使用符号链接和别名来指向到其他的位置。
#
DocumentRoot “/home/redhat/public_html”
#
# Apache可以存取的每个目录都可以配置存取权限(包括它的子目录)。
#
# 首先,我们配置一个高限制的特征。
# 这将禁止访问文件系统所在的目录,并添加你希望允许访问的目录块。
# 如下所示
<Directory />
Order Deny,Allow
Deny from all
</Directory>
#
# 注意从这里开始你一定要明确地允许哪些特别的特征能够被使用。
# – 所以,如果Apache没有象你所期待的那样工作的话,
# 请检查你是否在下面明确的指定它可用。
#
#
# 这将改变到你设置的DocumentRoot
#
<Directory “/home/redhat/public_html”>
#
# Options:这个指令的值可以是“None”,“All”,或者下列选项的任意组合:
# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#
# 注意,“MultiViews”必须被显式的指定,“Options All”不能为你提供这个特性。
#
# 这个指令既复杂又重要,请参见
#“<a href=”http://httpd.apache.org/docs-2.0/mod/core.html#optioins”以取得更多的信息。” target=”_blank”>http://httpd.apache.org/docs-2.0/mo…〉酶嗟男畔ⅰ?lt;/a>
#
Options FollowSymLinks
#
# AllowOverride控制那些被放置在.htaccess文件中的指令。
# 它可以是“All”,“None”,或者下列指令的组合:
# Options FileInfo AuthConfig Limit
#
AllowOverride None
#
# 控制谁可以获得服务。
#
Order allow,deny
Allow from all
</Directory>
#
# UserDir:指定在得到一个~user请求时将会添加到用户home目录后的目录名。
#
UserDir public_html
# 为防止在UserDir指令上的漏洞,对root用户设置
# 象“./”这样的UserDir是非常有用的。
# 如果你使用Apache 1.3或以上版本,我们强烈建议你
# 在你的服务器配置文件中包含下面的行
UserDir disabled root
#
# 下面是一个使用UserDir指令使一个站点的目录具有只读属性的示例:
#
# <Directory /home/*/public_html>
# AllowOverride FileInfo AuthConfig Limit Indexes
# Options MultiViews Indexes SymLinksIfOwnerMatch IncludeNoExec
# <Limit GET POST OPTIONS PROPFIND>
# Order allow,deny
# Allow from all
# </Limit>
# <LimitExcept GET POST OPTIONS PROPFIND>
# Order deny,allow
# Deny from all
# </LimitExcept>
# </Directory>
#
# DirectoryIndex:定义请求是一个目录时,Apache向用户提供服务的文件名
#
# index.html.var文件(一个类型映象文件)用于提供一个文档处理列表,
# 出于同样的目的,也可以使用MultiViews选项,但是它会非常慢。
#
DirectoryIndex index.php index.html index.html.var
#
# AccessFileName:在每个目录中查询为目录提供附加配置指令的文件的文件名。
# 参见AllowOverride指令。
#
AccessFileName .htaccess
#
# 下面的行防止.htaccess和.htpasswd文件被Web客户查看。
#
<Files ~ “^.ht”>
Order allow,deny
Deny from all
</Files>
#
# Typeconfig:定义在哪里查询mime.types文件。
#
TypeConfig conf/mime.types
#
# DefaultType:定义当不能确定MIME类型时服务器提供的默认MIME类型。
# 如果你的服务主要包含text或HTML文档,“text/plain”是一个好的选择;
# 如果大多是二进制文档,诸如软件或图像,你应使用
# “application/octer-stream”来防止浏览器象显示文本那样显示二进制文件。
#
DefaultType text/plain
#
# mod_mime_magic允许服务器从自己定义自己类型的文件中使用不同的线索(hints),
# 这个MIMEMagicFile指令定义hints定义所在的文件。
#
<IfModule mod_mime_magic.c>
MIMEMagicFile conf/magic
</IfModule>
#
# HostnameLookups:指定记录用户端的名字还是IP地址,例如,本指令为on时
# 记录主机名,如<a href=”http://www.apache.org;为off时记录IP地址,204.62.129.132。” target=”_blank”>www.apache.org;为off时记录IP地址,204.62.129.132。</a>
# 默认值为off,这要比设为on好得多,因为如果设为on则每个用户端请求都将会
# 至少造成对 nameserver 进行一次查询。
#
HostnameLookups Off
#
# EnableMMAP:控制是否进行内存转储(如果操作系统支持的话)。
# 默认为on,如果你的服务器安装在网络文件系统上(NFS),请关闭它。
# 在一些系统上,关闭它会提升系统性能(与文件系统类型无关);
# 具体情况请参阅<a href=”http://httpd.apache.org/docs-2.0/mod/core.html#enablemmap” target=”_blank”>http://httpd.apache.org/docs-2.0/mo…html#enablemmap</a>
#
# EnableMMAP off
#
# EnableSendfile:控制是否使用sendfile kernel支持发送文件
# (如果操作系统支持的话)。默认为on,如果你的服务器安装在网络文件系统
# (NFS)上,请你关闭它。
# 参见<a href=”http://httpd.apache.org/docs-2.0/mod/core.html#enablesendfile” target=”_blank”>http://httpd.apache.org/docs-2.0/mo…#enablesendfile</a>
#
# EnableSendfile off
#
# ErrorLog:错误日志文件定位。
# 如果你没有在<VirtualHost>内定义ErrorLog指令,这个虚拟主机的错误信息
# 将记录在这里。如果你在那儿定义了ErrorLog,这些错误信息将记录在你所
# 定义的文件里,而不是这儿定
义的文件。
#
ErrorLog logs/error_log
#
# LogLevel:控制记录在错误日志文件中的日志信息数量。
# 可能的值包括:debug,info,notice,warn,error,crit,alert,emerg。
#
LogLevel warn
#
# 下面的指令为CustomLog指令定义格式别名。
#
LogFormat “%h %l %u %t \”%r\” %>s %b \”%{Referer}i\” \”%{User-Agent}i\”" combined
LogFormat “%h %l %u %t \”%r\” %>s %b” common
LogFormat “%{Referer}i -> %U” referer
LogFormat “%{User-agent}i” agent
# 你需要安装了mod_logio.c模块才能使用%I和%O。
# LogFormat “%h %l %u %t \”%r\” %>s %b \”%{Referer}i\” \”%{User-Agent}i\” %I %O” combinedio
#
# 指定接入日志文件的定位和格式(一般日志格式)。
# 如果你没有在<VirtualHost>内定义这个指令,传输信息将记录在这里,
# 如果你定义了这个指令,则记录在你指定的位置,而不是这儿定义的位置。
#
CustomLog logs/access_log common
#
# 如果你想要记录agent和referer信息,可以使用下面的指令
#
# CustomLog logs/referer_log referer
# CustomLog logs/agent_log agent
#
# 如果你想要使用一个文件记录access,agent和referer信息,
# 你可以如下定义这个指令:
#
# CustomLog logs/access_log combined
#
# ServerTokens
# 这个指令定义包含在HTTP回应头中的信息类型。默认为“Full”,
# 这表示在回应头中将包含模块中的操作系统类型和编译信息。
# 可以设为列各值中的一个:
# Full | OS | Minor | Minimal | Major | Prod
# Full传达的信息最多,而Prod最少。
#
ServerTokens Full
#
# 随意的添加包含服务器版本和虚拟主机名字一行信息到server-generated输出页中
# (内部错误文档,FTP目录列表,mod_status和mod_info输出等等,除了CGI错误
# 或自定义的错误文档以外)。
# 设为“EMail”将包含一个指向ServerAdmin的mailto:连接。
# 可以为如下值:On | Off | EMail
#
ServerSignature On
#
# Aliases:在这时添加你需要的别名,格式如下:
# Alias 别名 真实名
#
# 注意,如果你在别名的未尾包含了“/”,那么在URL中也需要包含“/”。
# 因此,“/icons”不是这个示例中的别名。
# 如果别名中以“/”结尾,那么真实名也必须以“/”结尾,
# 如果别名中省略了结尾的“/”,那么真实名也必须省略。
#
# 我们使用别名“/icons/”来表示FancyIndexed目录列表,如果你不使用、
# FancyIndexing,你可以注释掉它。
#
# Alias /icons/ “/usr/local/apache2/icons/”
# <Directory “/usr/local/apache2/icons”>
# Options Indexes MultiViews
# AllowOverride None
# Order allow,deny
## Allow from all
# </Directory>
#
# 这将改变ServerRoot/manual。这个别名提供了手册页所在的位置,
# 即使你改变了你的DocumentRoot。如果你对有无手册页并不在意的话,
# 你可以注释掉它。
#
Alias /manual “/usr/loacl/apache2/manual”
<Directory “/usr/local/apache2/manual”>
Options Indexes FollowSymLinks MultiViews IncludesNoExec
AddOutputFilter Includes html
Order allow,deny
Allow from all
</Directory>
#
# ScriptAlias:指定包含服务脚本的目录。
# ScriptAliases 本质上与Aliases一样,除了这里的文档在请求时做为程序处理处理以外。
# 尾部的“/”规则与Alias一样
#
ScriptAlias /cgi-bin/ “/usr/loacl/apache2/cgi-bin/”
# 这里是添加php 4支持的指令
AddType application/x-httpd-php .php
LoadModule php4_module modules/libphp4.so
<IfModule mod_cgid.c>
#
# 添加mod_cgid.c设置,mod_cgid提供使用cgid进行通讯的UNIX套接字的
# 脚本接口路径。
#
# Scriptsock logs/cgisock
</IfModule>
#
# 将”/usr/local/apache2/cgi-bin”改为你的ScriptAliased指定的CGI目录,
# 如果你配置了的话。
#
<Directory “/usr/local/apache2/cgi-bin”>
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>
#
# Redirect允许你告诉客户端使用存在于服务器名字空间中的文档,
# 而不是现在的,这帮助客户定位那些改变了位置的文档。
# 例如:
# Redirect permanent /foo <a href=”http://www.example.com/bar” target=”_blank”>http://www.example.com/bar</a>
#
# 控制server-generated目录列表显示的指令
#
#
# IndexOptions:控制server-generated目录列表显示特征。
#
IndexOptions FancyIndexing VersionSort
#
# AddIcon* 指令告诉服务器不同扩展名的图象文件如何显示,
# 只适用于FancyIndexed指令
#
AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip
AddIconByType (TXT,/icons/text.gif) text
# 基于 NCSA 服务的配置文件。
#
#这是Apache服务器主要配置文件。
#它包含服务器的影响服务器运行的配置指令。
#参见<URL:<a href=”http://httpd.ache.org/doc-2.0/” target=”_blank”>http://httpd.ache.org/doc-2.0/</a>>以取得关于这些指令的详细信息
#
#不要只是简单的阅读这些指令信息而不去理解它。
#这里只是做了简单的说明,如果你没有参考在线文件,你就会被警告。
#
#这些配置指令被分为下面三个部分:
#1. 控制整个Apache服务器行为的部分(即全局环境变量)
#2. 定义主要或者默认服务参数的指令,也为所有虚拟主机提供默认的设置参数
#3. 虚拟主机的设置参数
#
#配置和日志文件名:如果你指定的文件名以“/”开始(win32下以“dirver:/”),
#服务器将使用绝对路径,如果文件名不是以“/”开始的,那么它将把ServerRoot
#的值附加在文件名的前面,例如,对“logs/foo.log”,如果ServerRoot的值
#为“/usr/local/apache2”,则该文件应为“/usr/local/apache2/logs/foo.log”
#
##第一区:全局环境参数
#
#这里设置的参数将影响整个Apache服务器的行为;
#例如Apache能够处理的并发请求的数量等。
#
#ServerRoot:指出服务器保存其配置、出错和日志文件等的根目录。
#
#注意!如果你想要将它指定为NFS或其它网络上的位置,
#请一定要去阅读与LockFile有关的文档(可能在
#<URL:<a href=”http://httpd.apache.org/docs-2.0/mod/mpm_common.html#lockfile” target=”_blank”>http://httpd.apache.org/docs-2.0/mo…n.html#lockfile</a>> )。
#这将会使你自己也能解决很多问题。
#
#路径的结尾不要添加斜线。
#
ServerRoot “/usr/loacl/apache2″
#
#串行访问的锁文件必须保存在本地磁盘上
#
<IfModule !mpm_winnt.c>
<IfModule !mpm_neware.c>
#LockFile logs/accept.lock
</IfModule>
</IfModule>
#ScoreBoardFile:用来保存内部服务进程信息的文件。
#如果未指明(默认),记分板(scoreboard)将被保存在一个匿名的共享内存段中,
#并且它不能被第三方软件所使用。
#如果指定了,要确保不能使用两个Apache使用同一个记分板文件,
#这个记分板文件必须保存在本地磁盘上。
#
<IfModule !mpm_netware.c>
<IfModule !perchild.c>
#ScoreBoardFile logs/apache_runtime_status
<IfModule>
<IfModule>
#
#PidFile:记录服务器启动进程号的文件。
#
<IfModule !mpm_neware.c>
PidFile logs/httpd.pid
</IfModul
e>
#
#Timeout:接收和发送前超时秒数
#
Timeout 300
#
#KeepAlive:是否允许稳固的连接(每个连接有多个请求),
#设为”Off”则停用。
#
KeepAlive On
#
#MaxKeepAliveRequests:在稳固连接期间允许的最大请求数,
#设为0表示无限制接入。
#我们推荐你将其设为一个较大的值,以便提高性能
MaxKeepAliveRequests 100
#
#KeepAliveTimeout:在同一个连接上从同一台客户上接收请求的秒数
#
KeepAliveTimeout 15
##
##Server-Pool大小设定(针对MPM的)
##
# prefork MPM
# StartServers:启动时服务器启动的进程数
# MinSpareServers:保有的备用进程的最小数目
# MaxSpareServers:保有的备用进程的最大数目
# MaxClients:服务器允许启动的最大进程数
# MaxRequestsPerChild:一个服务进程允许的最大请求数
<IfModule prefork.c>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestPerChild 0
</IfModule>
# worker MPM
# StartServers:服务器启动时的服务进程数目
# MaxClients:允许同时连接的最大用户数目
# MinSpareThreads:保有的最小工作线程数目
# MaxSpareThreads:允许保有的最大工作线程数目
# ThreadsPerChild:每个服务进程中的工作线程常数
# MaxRequestsPerChild:服务进程中允许的最大请求数目
<IfModule worker.c>
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
# perchild MPM
# NumServers:服务进程数量
# StartThreads:每个服务进程中的起始线程数量
# MinSpareThreads:保有的最小线程数量
# MaxSpareThreads:保有的最大线程数量
# MaxThreadsPerChild:每个服务进程允许的最大线程数
# MaxRequestsPerChild:每个服务进程允许连接的最大数量
<IfModule perchild.c>
NumServers 5
StartThreads 5
MinSpareThreads 5
MaxSpareThreads 10
MaxThreadsPerChild 20
MaxRequestsPerChild 0
</IfModule>
# WinNT MPM
# ThreadsPerChild:服务进程中工作线程常数
# MaxRequestsPerChild:服务进程允许的最大请求数
<IfModule mpm_winnt.c>
ThreadsPerChild 250
MaxRequestsPerChild 0
</IfModule>
# BeOS MPM
# StartThreads:服务器启动时启动的线程数
# MaxClients:可以启动的最大线程数(一个线程等于一个用户)
# MaxRequestsPerThread:每个线程允许的最大请求数
<IfModule beos.c>
StartThreads 10
MaxClients 50
MaxRequestsPerThread 10000
</IfModule>
# NetWare MPM
# ThreadStachSize:为每个工作线程分配的堆栈尺寸
# StartThreads:服务器启动时启动的线程数
# MinSpareThreads:用于处理实发请求的空闲线程数
# MaxSpareThreads:空闲线程的最大数量
# MaxThreads:在同一时间活动的最大线程数
# MaxRequestPerChild:一个线程服务请求的最大数量,
# 推荐将其设置为0,以实现无限制的接入
<IfModule mpm_netware.c>
ThreadStackSize 65536
StartThreads 250
MinSpareThreads 25
MaxSpareThreads 250
MaxThreads 1000
MaxRequestPerChild 0
</IfModule>
# OS/2 MPM
# StartServers:启动的服务进程数量
# MinSpareThreads:每个进程允许的最小空闲线程
# MaxSpareThreads:每个进程允许的最大空闲线程
# MaxRequestsPerChild:每个服务进程允许的最大连接数
<IfModule mpmt_os2.c>
StartServers 2
MinSpareThreads 5
MaxSpareThreads 10
MaxRequestsPerChild 0
</IfModule>
#
# Listen:允许你绑定Apache服务到指定的IP地址和端口上,以取代默认值
# 参见<VirtualHost>指令
# 使用如下命令使Apache只在指定的IP地址上监听,
# 以防止它在IP地址0.0.0.0上监听
#
# Listen 12.34.56.78:80
Listen 80
#
# 动态共享支持(DSO)
#
# 为了能够使用那些以DSO模式编译的模块中的函数,你必须有相应的“LoadModule”行,
# 因此,在这里包含了这些指令,以便能在使用它之前激活。
# 那些静态编译的模块不需要在这里列出 (即以“httpd -l”列出的模块)
#
# 示例:
# LoadModule foo_module modules/mod_foo.so
#
#
# ExtendedStatus:当调用“server-status”时,控制Apache是产生“全”状态
# 信息(ExtendedStatus On),还是产生基本信息(ExtendedStatus Off)。
# 默认为off
#
# ExtendedStatus On
### 第二区:“主”服务配置
#
# 这一区建立被 “主” 服务器用的指令值,以回应那些不被 <VirtualHost>
# 定义处理的任何请求。
# 这些数值也提供默认值给后面定义的<VirtualHost>容器。
# 如果<VirtualHost>中有定义,那么这里定义的指令值将被
# <VirtualHost>中的定义所覆盖。
#
<IfModule !mpm_winnt.c>
<IfModule !mpm_neware.c>
#
# 如果你想使httpd以另外的用户或组来运行,你必须在开始时以root方式启动
# 然后再将它切换为你想要使用的用户或组。
#
# User/Group:运行httpd的用户和组
# 在SCO (ODT3)上使用“User nouser”和“Group nogroup”
# 在HPUX上,你可能不能以nobody身份使用共享内存,建议创建一个www用户。
# 注意一些核心(kernel)在组ID大于60000时拒绝setgid(Group)或semctl(IPC_SET),
#节在这些系统上不要使用“Group #-1”。
#
User nobody
Group #-1
</IfModule>
</IfModule>
#
# ServerAdmin:你的邮件地址,当发生问题时Apache将向你发出邮件。
# 作为一个出错文档,这个地址显示在server-generated页上,
# 例如:admin@your-domain.com
#
ServerAdmin kreny@sina.com
#
# ServerName指定Apache用于识别自身的名字和端口号。
# 通常这个值是自动指定的,但是我们推荐你显式的指定它以防止启动时出错
#
# 如果你为你的主机指定了一个无效的DNS名,server-generated重定向将不能工作。
# 参见UseCanonicalName指令
#
# 如果你的主机没有注册DNS名,在这里键入它的IP地址
# 无论如何,你必须使用它的IP地址来提供服务,
# 这里使用一种容易理解的方式重定向服务
ServerName <a href=”http://www.dalouis.com:80″ target=”_blank”>www.dalouis.com:80</a>
#
# UseCanonicalName:决定Apache如何构造URLS和 SERVER_NAME 和 SERVER_PORT 的指令。
# 当设置为 “Off”时,Apache会使用用户端提供的主机名和端口号。
# 当设置为“On”,Apache会使用ServerName指令的值。
#
UseCanonicalName Off
#
# DocumentRoot:你的文档的根目录。默认情况下,所有的请求从这个目录进行应答。
# 但是可以使用符号链接和别名来指向到其他的位置。
#
DocumentRoot “/home/redhat/public_html”
#
# Apache可以存取的每个目录都可以配置存取权限(包括它的子目录)。
#
# 首先,我们配置一个高限制的特征。
# 这将禁止访问文件系统所在的目录,并添加你希望允许访问的目录块。
# 如下所示
<Directory />
Order Deny,Allow
Deny from all
</Directory>
#
# 注意从这里开始你一定要明确地允许哪些特别的特征能够被使用。
# – 所以,如果Apache没有象你所期待的那样工作的话,
# 请检查你是否在下面明确的指定它可用。
#
#
# 这将改变到你设置的DocumentRoot
#
<Dir
ectory “/home/redhat/public_html”>
#
# Options:这个指令的值可以是“None”,“All”,或者下列选项的任意组合:
# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#
# 注意,“MultiViews”必须被显式的指定,“Options All”不能为你提供这个特性。
#
# 这个指令既复杂又重要,请参见
#“<a href=”http://httpd.apache.org/docs-2.0/mod/core.html#optioins”以取得更多的信息。” target=”_blank”>http://httpd.apache.org/docs-2.0/mo…〉酶嗟男畔ⅰ?lt;/a>
#
Options FollowSymLinks
#
# AllowOverride控制那些被放置在.htaccess文件中的指令。
# 它可以是“All”,“None”,或者下列指令的组合:
# Options FileInfo AuthConfig Limit
#
AllowOverride None
#
# 控制谁可以获得服务。
#
Order allow,deny
Allow from all
</Directory>
#
# UserDir:指定在得到一个~user请求时将会添加到用户home目录后的目录名。
#
UserDir public_html
# 为防止在UserDir指令上的漏洞,对root用户设置
# 象“./”这样的UserDir是非常有用的。
# 如果你使用Apache 1.3或以上版本,我们强烈建议你
# 在你的服务器配置文件中包含下面的行
UserDir disabled root
#
# 下面是一个使用UserDir指令使一个站点的目录具有只读属性的示例:
#
# <Directory /home/*/public_html>
# AllowOverride FileInfo AuthConfig Limit Indexes
# Options MultiViews Indexes SymLinksIfOwnerMatch IncludeNoExec
# <Limit GET POST OPTIONS PROPFIND>
# Order allow,deny
# Allow from all
# </Limit>
# <LimitExcept GET POST OPTIONS PROPFIND>
# Order deny,allow
# Deny from all
# </LimitExcept>
# </Directory>
#
# DirectoryIndex:定义请求是一个目录时,Apache向用户提供服务的文件名
#
# index.html.var文件(一个类型映象文件)用于提供一个文档处理列表,
# 出于同样的目的,也可以使用MultiViews选项,但是它会非常慢。
#
DirectoryIndex index.php index.html index.html.var
#
# AccessFileName:在每个目录中查询为目录提供附加配置指令的文件的文件名。
# 参见AllowOverride指令。
#
AccessFileName .htaccess
#
# 下面的行防止.htaccess和.htpasswd文件被Web客户查看。
#
<Files ~ “^.ht”>
Order allow,deny
Deny from all
</Files>
#
# Typeconfig:定义在哪里查询mime.types文件。
#
TypeConfig conf/mime.types
#
# DefaultType:定义当不能确定MIME类型时服务器提供的默认MIME类型。
# 如果你的服务主要包含text或HTML文档,“text/plain”是一个好的选择;
# 如果大多是二进制文档,诸如软件或图像,你应使用
# “application/octer-stream”来防止浏览器象显示文本那样显示二进制文件。
#
DefaultType text/plain
#
# mod_mime_magic允许服务器从自己定义自己类型的文件中使用不同的线索(hints),
# 这个MIMEMagicFile指令定义hints定义所在的文件。
#
<IfModule mod_mime_magic.c>
MIMEMagicFile conf/magic
</IfModule>
#
# HostnameLookups:指定记录用户端的名字还是IP地址,例如,本指令为on时
# 记录主机名,如<a href=”http://www.apache.org;为off时记录IP地址,204.62.129.132。” target=”_blank”>www.apache.org;为off时记录IP地址,204.62.129.132。</a>
# 默认值为off,这要比设为on好得多,因为如果设为on则每个用户端请求都将会
# 至少造成对 nameserver 进行一次查询。
#
HostnameLookups Off
#
# EnableMMAP:控制是否进行内存转储(如果操作系统支持的话)。
# 默认为on,如果你的服务器安装在网络文件系统上(NFS),请关闭它。
# 在一些系统上,关闭它会提升系统性能(与文件系统类型无关);
# 具体情况请参阅<a href=”http://httpd.apache.org/docs-2.0/mod/core.html#enablemmap” target=”_blank”>http://httpd.apache.org/docs-2.0/mo…html#enablemmap</a>
#
# EnableMMAP off
#
# EnableSendfile:控制是否使用sendfile kernel支持发送文件
# (如果操作系统支持的话)。默认为on,如果你的服务器安装在网络文件系统
# (NFS)上,请你关闭它。
# 参见<a href=”http://httpd.apache.org/docs-2.0/mod/core.html#enablesendfile” target=”_blank”>http://httpd.apache.org/docs-2.0/mo…#enablesendfile</a>
#
# EnableSendfile off
#
# ErrorLog:错误日志文件定位。
# 如果你没有在<VirtualHost>内定义ErrorLog指令,这个虚拟主机的错误信息
# 将记录在这里。如果你在那儿定义了ErrorLog,这些错误信息将记录在你所
# 定义的文件里,而不是这儿定义的文件。
#
ErrorLog logs/error_log
#
# LogLevel:控制记录在错误日志文件中的日志信息数量。
# 可能的值包括:debug,info,notice,warn,error,crit,alert,emerg。
#
LogLevel warn
#
# 下面的指令为CustomLog指令定义格式别名。
#
LogFormat “%h %l %u %t \”%r\” %>s %b \”%{Referer}i\” \”%{User-Agent}i\”" combined
LogFormat “%h %l %u %t \”%r\” %>s %b” common
LogFormat “%{Referer}i -> %U” referer
LogFormat “%{User-agent}i” agent
# 你需要安装了mod_logio.c模块才能使用%I和%O。
# LogFormat “%h %l %u %t \”%r\” %>s %b \”%{Referer}i\” \”%{User-Agent}i\” %I %O” combinedio
#
# 指定接入日志文件的定位和格式(一般日志格式)。
# 如果你没有在<VirtualHost>内定义这个指令,传输信息将记录在这里,
# 如果你定义了这个指令,则记录在你指定的位置,而不是这儿定义的位置。
#
CustomLog logs/access_log common
#
# 如果你想要记录agent和referer信息,可以使用下面的指令
#
# CustomLog logs/referer_log referer
# CustomLog logs/agent_log agent
#
# 如果你想要使用一个文件记录access,agent和referer信息,
# 你可以如下定义这个指令:
#
# CustomLog logs/access_log combined
#
# ServerTokens
# 这个指令定义包含在HTTP回应头中的信息类型。默认为“Full”,
# 这表示在回应头中将包含模块中的操作系统类型和编译信息。
# 可以设为列各值中的一个:
# Full | OS | Minor | Minimal | Major | Prod
# Full传达的信息最多,而Prod最少。
#
ServerTokens Full
#
# 随意的添加包含服务器版本和虚拟主机名字一行信息到server-generated输出页中
# (内部错误文档,FTP目录列表,mod_status和mod_info输出等等,除了CGI错误
# 或自定义的错误文档以外)。
# 设为“EMail”将包含一个指向ServerAdmin的mailto:连接。
# 可以为如下值:On | Off | EMail
#
ServerSignature On
#
# Aliases:在这时添加你需要的别名,格式如下:
# Alias 别名 真实名
#
# 注意,如果你在别名的未尾包含了“/”,那么在URL中也需要包含“/”。
# 因此,“/icons”不是这个示例中的别名。
# 如果别名中以“/”结尾,那么真实名也必须以“/”结尾,
# 如果别名中省略了结尾的“/”,那么真实名也必须省略。
#
# 我们使用别名“/icons/”来表示FancyIndexed目录列表,如果你不使用、
# FancyIndexing,你可以注释掉它。
#
# Alias /icons/ “/usr/local/apache2/icons/”
# <Directory “/usr/local/apache2/icons”>
# Options Indexes MultiView
s
# AllowOverride None
# Order allow,deny
## Allow from all
# </Directory>
#
# 这将改变ServerRoot/manual。这个别名提供了手册页所在的位置,
# 即使你改变了你的DocumentRoot。如果你对有无手册页并不在意的话,
# 你可以注释掉它。
#
Alias /manual “/usr/loacl/apache2/manual”
<Directory “/usr/local/apache2/manual”>
Options Indexes FollowSymLinks MultiViews IncludesNoExec
AddOutputFilter Includes html
Order allow,deny
Allow from all
</Directory>
#
# ScriptAlias:指定包含服务脚本的目录。
# ScriptAliases 本质上与Aliases一样,除了这里的文档在请求时做为程序处理处理以外。
# 尾部的“/”规则与Alias一样
#
ScriptAlias /cgi-bin/ “/usr/loacl/apache2/cgi-bin/”
# 这里是添加php 4支持的指令
AddType application/x-httpd-php .php
LoadModule php4_module modules/libphp4.so
<IfModule mod_cgid.c>
#
# 添加mod_cgid.c设置,mod_cgid提供使用cgid进行通讯的UNIX套接字的
# 脚本接口路径。
#
# Scriptsock logs/cgisock
</IfModule>
#
# 将”/usr/local/apache2/cgi-bin”改为你的ScriptAliased指定的CGI目录,
# 如果你配置了的话。
#
<Directory “/usr/local/apache2/cgi-bin”>
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>
#
# Redirect允许你告诉客户端使用存在于服务器名字空间中的文档,
# 而不是现在的,这帮助客户定位那些改变了位置的文档。
# 例如:
# Redirect permanent /foo <a href=”http://www.example.com/bar” target=”_blank”>http://www.example.com/bar</a>
#
# 控制server-generated目录列表显示的指令
#
#
# IndexOptions:控制server-generated目录列表显示特征。
#
IndexOptions FancyIndexing VersionSort
#
# AddIcon* 指令告诉服务器不同扩展名的图象文件如何显示,
# 只适用于FancyIndexed指令
#
AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip
AddIconByType (TXT,/icons/text.gif) text
