PHP中的加密功能zPsLinux联盟 数据加密在我们生活中的地位已经越来越重要了,尤其是考虑到在网络上发生的大量交易和传输的大量数据。如果对于采用安全措施有兴趣的话,也一定会有兴趣了解PHP提供的一系列安全功能。在本篇文章中,我们将介绍这些功能,提供一些基本的用法,以便你能够为自己的应用软件中增加安全功能。 预备知识 zPsLinux联盟 在详细介绍PHP的安全功能之前,我们需要花点时间来向没有接触过这方面内容的读者介绍一些有关密码学的基本知识,如果对密码学的基本概念已经非常熟悉,就可以跳过去这一部分。 zPsLinux联盟 密码学可以通俗地被描述为对加/解密的研究和实验,加密是将易懂的资料转换为不易懂资料的过程,解密则是将不易懂的资料转换为原来易懂资料的过程。不易懂的资料被称作密码,易懂的资料被称作明码。 zPsLinux联盟 数据的加/解密都需要一定的算法,这些算法可以非常地简单,如著名的凯撒码,但当前的加密算法要相对复杂得多,其中一些利用现有的方法甚至是无法破译的。 zPsLinux联盟 PHP的加密功能 zPsLinux联盟 只要有一点使用非Windows平台经验的人可能对crypt()也相当熟悉,这一函数完成被称作单向加密的功能,它可以加密一些明码,但不能够将密码转换为原来的明码。尽管从表面上来看这似乎是一个没有什么用处的功能,但它的确被广泛用来保证系统密码的完整性。因为,单向加密的口令一旦落入第三方人的手里,由于不能被还原为明文,因此也没有什么大用处。在验证用户输入的口令时,用户的输入采用的也是单向算法,如果输入与存储的经加密后的口令相匹配,则输入的口信一定是正确的。 zPsLinux联盟 PHP同样提供了使用其crypt()函数完成单向加密功能的可能性。我将在这里简要地介绍该函数: zPsLinux联盟 string crypt (string input_string [, string salt]) zPsLinux联盟 其中的input_string参数是需要加密的字符串,第二个可选的salt是一个位字串,它能够影响加密的暗码,进一步地排除被称作预计算攻击的可能性。缺省情况下,PHP使用一个2个字符的DES干扰串,如果你的系统使用的是MD5(我将在以后介绍MD5算法),它会使用一个12个字符的干扰串。顺便说一下,可以通过执行下面的命令发现系统将要使用的干扰串的长度: zPsLinux联盟 print "My system salt size is: ". CRYPT_SALT_LENGTH; zPsLinux联盟 系统也可能支持其他的加密算法。crypt()支持四种算法,下面是它支持的算法和相应的salt参数的长度: zPsLinux联盟 算法 Salt长度 zPsLinux联盟 CRYPT_STD_DES 2-character (Default) zPsLinux联盟 CRYPT_EXT_DES 9-character zPsLinux联盟 CRYPT_MD5 12-character beginning with $1$ zPsLinux联盟 CRYPT_BLOWFISH 16-character beginning ith $2$ zPsLinux联盟 用crypt()实现用户身份验证 zPsLinux联盟 作为crypt()函数的一个例子,考虑这样一种情况,你希望创建一段PHP脚本程序限制对一个目录的访问,只允许能够提供正确的用户名和口令的用户访问这一目录。我将把资料存储在我喜欢的数据库MySQL的一个表中。下面我们以创建这个被称作members的表开始我们的例子: zPsLinux联盟 mysql>CREATE TABLE members ( zPsLinux联盟 ->username CHAR(14) NOT NULL, zPsLinux联盟 ->password CHAR(32) NOT NULL, zPsLinux联盟 ->PRIMARY KEY(username) zPsLinux联盟 ->); zPsLinux联盟 然后,我们假定下面的数据已经存储在该表中: zPsLinux联盟 用户名 密码 zPsLinux联盟 clark keloD1C377lKE zPsLinux联盟 bruce ba1T7vnz9AWgk zPsLinux联盟 peter paLUvRWsRLZ4U zPsLinux联盟 这些加密的口令对应的明码分别是kent、banner和parker。注意一下每个口令的前二个字母,这是因为我使用了下面的代码,根据口令的前二个字母创建干扰串的: zPsLinux联盟 $enteredPassword. zPsLinux联盟 $salt = substr($enteredPassword, 0, 2); zPsLinux联盟 $userPswd = crypt($enteredPassword, $salt); zPsLinux联盟 // $userPswd然后就和用户名一起存储在MySQL中 zPsLinux联盟 我将使用Apache的口令-应答认证配置提示用户输入用户名和口令,一个鲜为人知的有关PHP的信息是,它可以把Apache的口令-应答系统输入的用户名和口令识别为$PHP_AUTH_USER和$PHP_AUTH_PW,我将在身份验证脚本中用到这二个变量。花一些时间仔细阅读下面的脚本,多注意一下其中的解释,以便更好地理解下面的代码: zPsLinux联盟 crypt()和Apache的口令-应答验证系统的应用 zPsLinux联盟 <?php zPsLinux联盟 $host = "localhost"; zPsLinux联盟 $user = "zorro"; zPsLinux联盟 $pswd = "hellodolly"; zPsLinux联盟 $db = "users"; zPsLinux联盟 // Set authorization to False zPsLinux联盟 $authorization = 0; zPsLinux联盟 // Verify that user has entered username and password zPsLinux联盟 if (isset($PHP_AUTH_USER) && isset($PHP_AUTH_PW)) : zPsLinux联盟 mysql_pconnect($host, $user, $pswd) or die("Can't connect to MySQL zPsLinux联盟 server!"); zPsLinux联盟 mysql_select_db($db) or die("Can't select database!"); zPsLinux联盟 // Perform the encryption zPsLinux联盟 $salt = substr($PHP_AUTH_PW, 0, 2); zPsLinux联盟 $encrypted_pswd = crypt($PHP_AUTH_PW, $salt); zPsLinux联盟 // Build the query zPsLinux联盟 $query = "SELECT username FROM members WHERE zPsLinux联盟 username = '$PHP_AUTH_USER' AND zPsLinux联盟 password = '$encrypted_pswd'"; zPsLinux联盟 // Execute the query zPsLinux联盟 if (mysql_numrows(mysql_query($query)) == 1) : zPsLinux联盟 $authorization = 1; zPsLinux联盟 endif; zPsLinux联盟 endif; zPsLinux联盟 // confirm authorization zPsLinux联盟 if (! $authorization) : zPsLinux联盟 header('WWW-Authenticate: Basic realm="Private"'); zPsLinux联盟 header('HTTP/1.0 401 Unauthorized'); zPsLinux联盟 print "You are unauthorized to enter this area."; zPsLinux联盟 exit; zPsLinux联盟 else : zPsLinux联盟 print "This is the secret data!"; zPsLinux联盟 endif; zPsLinux联盟 ?> zPsLinux联盟 上面就是一个核实用户访问权限的简单身份验证系统。在使用crypt()保护重要的机密资料时,记住在缺省状态下使用的crypt()并不是最安全的,只能用在对安全性要求较低的系统中,如果需要较高的安全性能,就需要我在本篇文章的后面介绍的算法。 zPsLinux联盟 下面我将介绍另一个PHP支持的函数━━md5(),这一函数使用MD5散列算法,它有几种很有趣的用法值得一提: zPsLinux联盟 混编 zPsLinux联盟 一个混编函数可以将一个可变长度的信息变换为具有固定长度被混编过的输出,也被称作"信息文摘"。这是十分有用的,因为一个固定长度的字符串可以用来检查文件的完整性和验证数字签名以及用户身份验证。由于它适合于PHP,PHP内置的md5()混编函数将把一个可变长度的信息转换为128位(32个字符)的信息文摘。混编的一个有趣的特点是不能通过分析混编后的信息得到原来的明码,因为混编后的结果与原来的明码内容没有依赖关系。 即便只改变一个字符串中的一个字符,也将使得MD5混编算法计算出二个截然不同的结果。我们首先来看下表的内容及其相应的结果: zPsLinux联盟 zPsLinux联盟 使用md5()混编字符串 zPsLinux联盟 <?php zPsLinux联盟 $msg = "This is some message that I just wrote"; zPsLinux联盟 $enc_msg = md5($msg); zPsLinux联盟 print "hash: $enc_msg "; zPsLinux联盟 ?> zPsLinux联盟 结果: zPsLinux联盟 hash: 81ea092649ca32b5ba375e81d8f4972c zPsLinux联盟 注意,结果的长度为32个字符。再来看一下下面的表,其中的$msg的值有了一点微小的变化: zPsLinux联盟 使用md5()对一个稍微变化的字符串进行混编 zPsLinux联盟 <?php zPsLinux联盟 //注意,message中少了一个s zPsLinux联盟 $msg = "This is some mesage that I just wrote"; zPsLinux联盟 $enc_msg = md5($msg); zPsLinux联盟 print "hash2: $enc_msg <br /><br />"; zPsLinux联盟 ?> zPsLinux联盟 结果: zPsLinux联盟 hash2: e86cf511bd5490d46d5cd61738c82c0c zPsLinux联盟 可以发现,尽管二个结果的长度都是32个字符,但明文中一点微小的变化使得结果发生了很大的变化,因此,混编和md5()函数是检查数据中微小变化的一个很好的工具。 zPsLinux联盟 尽管crypt()和md5()各有用处,但二者在功能上都受到一定的限制。在下面的部分中,我们将介绍二个非常有用的被称作Mcrypt和Mhash的PHP扩展,将大大拓展PHP用户在加密方面的选择。 zPsLinux联盟 尽管我们在上面的小节中说明了单向加密的重要性,但有时我们可能需要在加密后,再把密码数据还原成原来的数据,幸运的是,PHP通过Mcrypt扩展库的形式提供了这种可能性。 zPsLinux联盟 Mcrypt zPsLinux联盟 Mcrypt 2.5.7 Unix | Win32 zPsLinux联盟 Mcrypt 2.4.7是一个功能强大的加密算法扩展库,它包括有22种算法,其中就包括下面的几种算法: zPsLinux联盟 Blowfish RC2 Safer-sk64 xtea zPsLinux联盟 Cast-256 RC4 Safer-sk128 zPsLinux联盟 DES RC4-iv Serpent zPsLinux联盟 Enigma Rijndael-128 Threeway zPsLinux联盟 Gost Rijndael-192 TripleDES zPsLinux联盟 LOKI97 Rijndael-256 Twofish zPsLinux联盟 PanamaSaferplus Wake zPsLinux联盟 安装: zPsLinux联盟 在标准的PHP软件包中不包括Mcrypt,因此需要下载它,下载的地址为:ftp://argeas.cs-net.gr/pub/unix/mcr...它扩充在PHP中: zPsLinux联盟 下载Mcrypt软件包。 zPsLinux联盟 gunzipmcrypt-x.x.x.tar.gz zPsLinux联盟 tar -xvfmcrypt-x.x.x.tar zPsLinux联盟 ./configure --disable-posix-threads zPsLinux联盟 make zPsLinux联盟 make install zPsLinux联盟 cd to your PHP directory. zPsLinux联盟 ./configure -with-mcrypt=[dir] [--other-configuration-directives] zPsLinux联盟 make zPsLinux联盟 make install zPsLinux联盟 当然了,根据你的要求和PHP安装时与互联网服务器软件的关系,上面的过程可能需要作适当的修改。 zPsLinux联盟 使用Mcrypt zPsLinux联盟 Mcrypt的优点不仅仅在于其提供的加密算法较多,还在于它可以对数据进行加/解密处理,此外,它还提供了35种处理数据用的函数。尽管对这些函数进行详细介绍已经超出了这篇文章的范围,我还是要就几个典型的函数作一下简要的介绍。 zPsLinux联盟 首先,我将介绍如何使用Mcrypt扩展库对数据进行加密,然后再介绍如何使用它进行解密。下面的代码对这一过程进行了演示,首先是对数据进行加密,然后在浏览器上显示加密后的数据,并将加密后的数据还原为原来的字符串,将它显示在浏览器上。 zPsLinux联盟 使用Mcrypt对数据进行加、解密 zPsLinux联盟 <?php zPsLinux联盟 // Designate string to be encrypted zPsLinux联盟 $string = "Applied Cryptography, by Bruce Schneier, is zPsLinux联盟 a wonderful cryptography reference."; zPsLinux联盟 // Encryption/decryption key zPsLinux联盟 $key = "Four score and twenty years ago"; zPsLinux联盟 // Encryption Algorithm zPsLinux联盟 $cipher_alg = MCRYPT_RIJNDAEL_128; zPsLinux联盟 // Create the initialization vector for added security. zPsLinux联盟 $iv = mcrypt_create_iv(mcrypt_get_iv_size($cipher_alg, zPsLinux联盟 MCRYPT_MODE_ECB), MCRYPT_RAND); zPsLinux联盟 // Output original string zPsLinux联盟 print "Original string: $string <p>"; zPsLinux联盟 // Encrypt $string zPsLinux联盟 $encrypted_string = mcrypt_encrypt($cipher_alg, $key, zPsLinux联盟 $string, MCRYPT_MODE_CBC, $iv); zPsLinux联盟 // Convert to hexadecimal and output to browser zPsLinux联盟 print "Encrypted string: ".bin2hex($encrypted_string)."<p>"; zPsLinux联盟 $decrypted_string = mcrypt_decrypt($cipher_alg, $key, zPsLinux联盟 $encrypted_string, MCRYPT_MODE_CBC, $iv); zPsLinux联盟 print "Decrypted string: $decrypted_string"; zPsLinux联盟 ?> zPsLinux联盟 执行上面的脚本将会产生下面的输出: zPsLinux联盟 Original string: Applied Cryptography, by Bruce Schneier, is a wonderful cryptography reference. zPsLinux联盟 Encrypted string: 02a7c58b1ebd22a9523468694b091e60411cc4dea8652bb8072 34fa06bbfb20e71ecf525f29df58e28f3d9bf541f7ebcecf62b c89fde4d8e7ba1e6cc9ea24850478c11742f5cfa1d23fe22fe8 bfbab5e zPsLinux联盟 Decrypted string: Applied Cryptography, by Bruce Schneier, is a wonderful cryptography reference. zPsLinux联盟 上面的代码中二个最典型的函数是mcrypt_encrypt()和mcrypt_decrypt(),它们的用途是显而易见的。我使用了"电报密码本"模式,Mcrypt提供了几种加密方式,由于每种加密方式都有可以影响密码安全的特定字符,因此每种模式都需要了解。对于没有接触过密码系统的读者来说,可能对mcrypt_create_iv()函数更有兴趣,尽管对这一函数进行彻底的解释已经超出了本篇文章的范围,但我仍然会提到它创建的初始化向量(hence, iv),这一向量可以使每条信息彼此独立。尽管不是所有的模式都需要这一初始化变量,但如果在要求的模式中没有提供这一变量,PHP就会给出警告信息。 zPsLinux联盟 Mhash扩展库 zPsLinux联盟 http://sourcefore.net/projects/mhash/ zPsLinux联盟 0.8.3版的Mhash扩展库支持12种混编算法,仔细检查Mhash v.0.8.3的头文件mhash.h可以知道,它支持下面的混编算法: zPsLinux联盟 CRC32 HAVAL160 MD5 zPsLinux联盟 CRC32B HAVAL192 RIPEMD160 zPsLinux联盟 GOST HAVAL224 SHA1 zPsLinux联盟 HAVAL128 HAVAL256 TIGER zPsLinux联盟 安装 zPsLinux联盟 象Mcrypt一样,Mhash也没有包括在PHP软件包中,对于非Windows用户而言,下面是安装过程: zPsLinux联盟 下载Mhash扩展库 zPsLinux联盟 gunzipmhash-x.x.x.tar.gz zPsLinux联盟 tar -xvfmhash-x.x.x.tar zPsLinux联盟 ./configure zPsLinux联盟 make zPsLinux联盟 make install zPsLinux联盟 cd <PHP所在的目录> zPsLinux联盟 ./configure -with-mhash=[dir] [--other-configuration-directives] zPsLinux联盟 make zPsLinux联盟 make install zPsLinux联盟 象Mcrypt一样,根据PHP在互联网服务器软件上的安装方式,可能需要对Mhash进行其他的配置。 zPsLinux联盟 对于Windows用户而言,http://www.php4win.de 中有一个很好的包括Mhash扩展库在内的PHP软件包。只要下载并进行解压缩,然后根据其中的readme.first文档中的指令进行安装即可zPsLinux联盟 使用Mhash zPsLinux联盟 对信息进行混编非常简单,看一下下面的例子: zPsLinux联盟 <?php zPsLinux联盟 $hash_alg = MHASH_TIGER; zPsLinux联盟 $message = "These are the directions to the secret fort. Two steps left, three steps right, and cha chacha."; zPsLinux联盟 $hashed_message = mhash($hash_alg, $message); zPsLinux联盟 print "The hashed message is ". bin2hex($hashed_message); zPsLinux联盟 ?> zPsLinux联盟 执行这一段脚本程序将得到下面的输出结果: zPsLinux联盟 The hashed message is 07a92a4db3a4177f19ec9034ae5400eb60d1a9fbb4ade461 zPsLinux联盟 在这里使用bin2hex()函数的目的是方便我们理解$hashed_message的输出,这是因为混编的结果是二进制格式,为了能够将它转化为易于理解的格式,必须将它转换为十六进制格式。 zPsLinux联盟 需要注意的是,混编是单向功能,其结果不依赖输入,因此可以公开显示这一信息。这一策略通常用于让用户比较下载文件和系统管理员提供的文件,以确保文件的完整性。 zPsLinux联盟 Mhash还有其他一些有用的函数。例如,我需要输出一个Mhash支持的算法的名字,由于Mhash支持的所有算法的名字都以MHASH_开头,因此,可以通过执行如下的代码完成这一任务: zPsLinux联盟 <?php zPsLinux联盟 $hash_alg = MHASH_TIGER; zPsLinux联盟 print "This data has been hashed with the".mhash_get_hash_name($hashed_message)."hashing algorithm."; zPsLinux联盟 ?> zPsLinux联盟 得到的输出是: zPsLinux联盟 This data has been hashed with the TIGER hashing algorithm. zPsLinux联盟 关于PHP和加密最后需要注意的一个问题 zPsLinux联盟 关于PHP和加密需要注意的最后的一个重要问题是在服务器和客户端之间传输的数据在传输过程中是不安全的!PHP是一种服务器端技术,不能阻止数据在传输过程中泄密。因此,如果想实现一个完整的安全应用,建议选用Apache-SSL或其他的安全服务器布置。 zPsLinux联盟 结论 zPsLinux联盟 这篇文章介绍了PHP最有用的功能之一━━数据加密,不仅讨论了PHP内置的crypt() 和md5()加密函数,还讨论了用于数据加密的功能强大的扩展库━━Mcrypt和Mhash。在这篇文章最后,我需要指出的是,一个真正安全的PHP应用还应该包括安全的服务器,由于PHP是一种服务器端的技术,因此,在数据由客户端向服务器端进行传输时,它不能保证数据的安全。 zPsLinux联盟 原作者:刘彦青zPsLinux联盟 zPsLinux联盟 - 作者: BluEmOoNz 2004年12月4日, 星期六 12:46 回复(0) | 引用(0) 加入博采 zPsLinux联盟 转载:小组开发环境搭建备忘 zPsLinux联盟 ——dhcp+apache+ftp+cvs+sambazPsLinux联盟 版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明zPsLinux联盟 http://www.chedong.com/tech/dev.htmlzPsLinux联盟 关键词:linux develop environment cvs version contral gnats bug tracking samba dhcpd wget zPsLinux联盟 内容摘要:本文主要介绍一些小组开发环境搭建中经常会遇到一些服务器服务设置,这些服务很多都是鉴于大部分的开发客户端仍然是Windows设置的,每个服务都提供了简单的基本配置示范。包括:zPsLinux联盟 IP管理(DHCP):服务器IP地址的管理和解析(结合SAMBA的WINS服务),开发客户端的IP管理; zPsLinux联盟 WEB服务(APACHE):文档共享,CVS的WEB界面浏览,论坛工具等; zPsLinux联盟 FTP服务(FTP):用于文件下载/共享; zPsLinux联盟 版本控制(CVS):程序源代码和文档的版本控制; zPsLinux联盟 文件共享(SAMBA):基于NETBIOS的文件共享,方便WINDOWS客户端的访问(比如一些工具的安装等); zPsLinux联盟 数据库服务器(MYSQL):一些应用的后台数据库服务; zPsLinux联盟 备份机制(wget + rsync):备份 zPsLinux联盟 很多设置是缺省按照在bash环境中,在tcsh环境中,有一些设置不太一直。zPsLinux联盟 服务器规划如下:zPsLinux联盟 主服务器 (Main) 备份服务器(Backup) __________________ _______________|APACHE WEB SERVER | | File Backup | |SAMBA SHARE | | ||DHCP SERVER | | DHCP Backup ||CVS SERVER | | MySQL server ||WIKI/BLOG SERVER | <=Backup=> | ||Database backup | | | ------------------ --------------- 硬件准备:至少要2台服务器zPsLinux联盟 从理论上说,任何系统的崩溃只是时间问题,而且谁也不能保证开发者不犯错误;zPsLinux联盟 解决以上问题的办法只有:备份,备份,备份...... zPsLinux联盟 操作系统准备zPsLinux联盟 FreeBSD或GNU/Linux,系统安装时,本文的配置主要以在RedHat 8上运行为例。注意:安装时要将"开发工具"大类选上,后面的很多工具都需要使用GCC进行编译,有的应用脚本运行用到了perl。2台主服务器分别使用 IP地址192.168.0.200和192.168.0.201 zPsLinux联盟 语言环境缺省设置: zPsLinux联盟 vi /etc/sysconfig/i18n zPsLinux联盟 删除UTF-8相关设置:zPsLinux联盟 LANG="en_US"zPsLinux联盟 SUPPORTED="en_US:en"zPsLinux联盟 SYSFONT="latarcyrheb-sun16"zPsLinux联盟 GNU/Linux安装完后:经常有很多不必要的服务需要删除,但根据服务器的不同,要删除的服务也不一样:本来是想总结一个统一的脚本,后来发现是需要删除的服务比需要保留的服务多,而且缺省有那些服务和系统版本,安装的模式也相关。这里我总结的了一个简单的方法来删除不必要的服务:首先:备份原始服务设置: #chkconfig --list > chkconfig.orig生成删除脚本:把所有在LEVEL 3启动的服务过滤出来,并生成chkconfig service off 这样的命令#chkconfig --list | grep 3:on | awk '{print "chkconfig "$1" off"}'chkconfig kudzu offchkconfig syslog offchkconfig netfs offchkconfig network offchkconfig random offzPsLinux联盟 chkconfig rawdevices offzPsLinux联盟 chkconfig pcmcia offzPsLinux联盟 chkconfig keytable offzPsLinux联盟 chkconfig apmd offzPsLinux联盟 chkconfig atd offzPsLinux联盟 chkconfig gpm offzPsLinux联盟 chkconfig autofs offzPsLinux联盟 chkconfig iptables offzPsLinux联盟 chkconfig isdn offzPsLinux联盟 chkconfig sshd offzPsLinux联盟 chkconfig portmap offzPsLinux联盟 chkconfig nfslock offzPsLinux联盟 chkconfig sendmail offzPsLinux联盟 chkconfig rhnsd offzPsLinux联盟 chkconfig crond offzPsLinux联盟 chkconfig anacron offzPsLinux联盟 chkconfig xfs offzPsLinux联盟 chkconfig xinetd offzPsLinux联盟 我们把需要保留的服务从这个列表中删除:zPsLinux联盟 一般WEB服务器只留network sshd crond atd syslogzPsLinux联盟 删掉相应的行以后就生成了不需要的服务删除脚本:zPsLinux联盟 chkconfig kudzu offzPsLinux联盟 chkconfig syslog offzPsLinux联盟 chkconfig netfs offzPsLinux联盟 chkconfig rawdevices offzPsLinux联盟 chkconfig pcmcia offzPsLinux联盟 chkconfig keytable offzPsLinux联盟 chkconfig apmd offzPsLinux联盟 chkconfig gpm offzPsLinux联盟 chkconfig autofs offzPsLinux联盟 chkconfig iptables offzPsLinux联盟 chkconfig isdn offzPsLinux联盟 chkconfig ortmap offzPsLinux联盟 chkconfig nfslock offzPsLinux联盟 chkconfig sendmail offzPsLinux联盟 chkconfig rhnsd offzPsLinux联盟 chkconfig xfs offzPsLinux联盟 chkconfig xinetd off zPsLinux联盟 2台机器上都安装的服务:SSH FTP DHCP服务zPsLinux联盟 SSHzPsLinux联盟 基本的登陆服务,对于内部分开发来说一般用缺省的就可以了,但是建议将/etc/ssh/sshd_config中的:zPsLinux联盟 PermitRootLogin yes改成PermitRootLogin nozPsLinux联盟 FTP zPsLinux联盟 建议用proftpd代替原有的ftp服务:http://www.proftpd.org/ 当然如果是vsftpd就不用换了zPsLinux联盟 安装:tar zxf proftpd-version.tar.gz; cd proftpd-version/; ./configure; make; make installzPsLinux联盟 缺省配置/usr/local/etc/proftpd.confzPsLinux联盟 ServerName "ProFTPD"zPsLinux联盟 ServerType standalonezPsLinux联盟 DefaultServer onAllowOverwrite onzPsLinux联盟 Port 21zPsLinux联盟 Umask 022zPsLinux联盟 UseReverseDNS offzPsLinux联盟 MaxInstances 30zPsLinux联盟 User apachezPsLinux联盟 Group apache不反相解析登陆机器的域名 UseReverseDNS off zPsLinux联盟 使用了系统缺省的apache用户/组运行服务 zPsLinux联盟 使用AuthUserFile把一些虚拟用户映射成系统帐户是一种更安全的方式,可以把多个只需要FTP权限的开发者用虚拟帐号映射成一个系统用户。这些虚拟用户的认证密码在ftpd.passwd中设置,从而实现了于系统认证的分离:zPsLinux联盟 ftpasswd是一个perl脚本,下载即可使用: ftpasswd --passwd --name=test --uid=501 --gid=501 --home=/home/test --shell=/sbin/nologin --file=/etc/ftpd.passwdzPsLinux联盟 然后在proftpd.conf配置中增加:DefaultRoot ~ 让用户只能在自己的目录下工作,不能通过cd ..转向更上级目录进行操作zPsLinux联盟 AuthUserFile /etc/ftpd.passwdzPsLinux联盟 DefaultRoot ~zPsLinux联盟 DHCPzPsLinux联盟 为了更方便的管理在同一个局域网中开发者的IP地址和服务器的IP地址,最好将服务器安排在一定范围内的静态IP内(比如 192.168.0.200以上),将(192.168.0.10-200)范围内为开发机客户端提供动态IP。假设我们的主服务器 (192.168.0.200)和辅助开发服务器(192.168.0.201)使用静态IP,同时为网段内提供192.168.0.10-200动态 IP分配服务。DHCP服务在2台服务器上都安装,一个做主DHCP服务,用于给子网IP池提供70%的IP,另外一台做备份,拥有IP池的30%。在例子中:200负责10-100,201负责110-150。缺省dhcpd没有安装的话,从安装盘上找到DHCP软件包安装或者从http://www.isc.org下载源文件编译即可(安装位置和配置文件可能有所不同)。缺省配置文件位于/etc/dhcpd.conf zPsLinux联盟 http://www.isc.org下载源文件编译即可(安装位置和配置文件可能有所不同)。缺省配置文件位于/etc/dhcpd.conf http://www.isc.org下载源文件编译即可(安装位置和配置文件可能有所不同)。缺省配置文件位于/etc/dhcpd.conf http://www.isc.org下载源文件编译即可(安装位置和配置文件可能有所不同)。缺省配置文件位于/etc/dhcpd.conf zPsLinux联盟 DHCPzPsLinux联盟 为了更方便的管理在同一个局域网中开发者的IP地址和服务器的IP地址,最好将服务器安排在一定范围内的静态IP内(比如 192.168.0.200以上),将(192.168.0.10-200)范围内为开发机客户端提供动态IP。假设我们的主服务器 (192.168.0.200)和辅助开发服务器(192.168.0.201)使用静态IP,同时为网段内提供192.168.0.10-200动态 IP分配服务。DHCP服务在2台服务器上都安装,一个做主DHCP服务,用于给子网IP池提供70%的IP,另外一台做备份,拥有IP池的30%。在例子中:200负责10-100,201负责110-150。缺省dhcpd没有安装的话,从安装盘上找到DHCP软件包安装或者从http://www.isc.org下载源文件编译即可(安装位置和配置文件可能有所不同)。缺省配置文件位于/etc/dhcpd.conf zPsLinux联盟 缺省配置:主服务器上zPsLinux联盟 ddns-update-style none;default-lease-time 120000; max-lease-time 920000; option subnet-mask 255.255.255.0; option broadcast-address 192.168.0.255; option netbios-name-servers 192.168.0.200;option routers 192.168.0.1; option domain-name-servers 202.106.196.115,202.96.199.133; option domain-name "example.com"; subnet 192.168.0.0 netmask 255.255.255.0{ range 192.168.0.10 192.168.0.100; }说明:zPsLinux联盟 缺省每个IP租期2天: default-lease-time 120000; zPsLinux联盟 最长租期: max-lease-time 920000; zPsLinux联盟 缺省子网掩码:option subnet-mask 255.255.255.0; zPsLinux联盟 缺省广播地址:option broadcast-address 192.168.0.255; zPsLinux联盟 让192.168.0.200上的samba服务启用WINS服务:用于内部域名解析 zPsLinux联盟 option netbios-name-servers 192.168.0.200;zPsLinux联盟 缺省网关 option routers 192.168.0.1; zPsLinux联盟 缺省域名服务器 option domain-name-servers 202.106.196.115,202.96.199.133; zPsLinux联盟 缺省域名 option domain-name "example.com"; zPsLinux联盟 #一个缺省的子网设置:zPsLinux联盟 subnet 192.168.0.0 netmask 255.255.255.0{zPsLinux联盟 #为子网动态分配0.10-100的IPzPsLinux联盟 range 192.168.0.10 192.168.0.100; zPsLinux联盟 } zPsLinux联盟 辅DHCP服务器上唯一不同的地方是:为子网动态分配0.110-150的IP,主DHCP和附DHCP服务器的IP池不能相互重叠 zPsLinux联盟 subnet 192.168.0.0 netmask 255.255.255.0{ range 192.168.0.110 192.168.0.150; }zPsLinux联盟 注意:zPsLinux联盟 如果主服务器是2块网卡并同时用作NAT服务,则外网IP是DHCP不能广播的,需要将外网IP地址屏蔽广播zPsLinux联盟 加入:zPsLinux联盟 subnet 202.102.34.102 netmask 255.255.255.255 {}zPsLinux联盟 主服务器上的应用安装:zPsLinux联盟 SAMBA服务:用于文件的共享和内部WINS解析zPsLinux联盟 这里只做一个只读共享的简单配置,zPsLinux联盟 [global] #别人会通过"网上邻居"看到WORKGROUP组里名为的Linux机器,注释是:My Samba Server workgroup = WORKGROUP netbios name = Linux server string = My Samba Server #日志设置 log file = /var/log/samba/%m.log max log size = 50 #安全设置 security = share #用SAMBA的WINS服务支持,并且用/etc/hosts做内部域名解析 wins support = yes name resolve order = hosts lmhosts wins bcast dns proxy = yes[public] #一个共享设置 comment = Public Stuff path = /home/share public = yes guest ok = yes read only = yes writable = no printable = no [docs] #一个需要密码验证的设置,密码通过#smbpasswd -a user password增加 comment = Public Stuff security = user encrypt passwords = yes smb passwd file = /etc/samba/smbpasswd path = /home/docs public = yes guest ok = no read only = yes writable = no在这里为了让大家能够在内部使用dev.example.com访问主服务器(192.168.0.200),我用DHCP设置主服务器(192.168.0.200)同时也是是内部的WINS服务器,而在200的SAMBA服务中,启用了WINS支持,并设置WINS用可以利用DNS做 NETBIOS名称解析。这样如果DNS读取的是/etc/hosts文件中的设置的话,hosts文件就可以当作WINS域名配置文件了,在 /etc/hosts里设置了:192.168.0.200 dev.example.com bbs.example.com dev bbs192.168.0.201 bak.example.com backup后,通过DHCP获得IP的内网客户端就可以直接通过: dev.example.com访问开发服务器了。所有的机器名前缀我都使用了缩写:dev, bbs bak之类的,原因是samba的NMBD实际上是NETBIOS名称的解析,名称长度是16个字符(实际是15个)有限制的。因此,虽然 192.168.0.202 username.example.com虽然是一个合法的DNS名称解析,但由于username.example.com长度超过了16个字符,所以通过SAMBA的WINS服务解析仍然无法找到。dev.chedong.com相当于\\dev.chedong.com\这样的一台机器。当初用 SAMBA的WINS解析在客户端总是ping不通testing.chedong.com这个问题困扰了我好一阵。WEB服务:APACHE + php + resinzPsLinux联盟 主要用作文件的WEB共享和一些应用的前端浏览(CVSWEB GNATSWEB PHPMYADMIN等),Apache,这里仍然使用了1.3,因为很多应用,比如PHP在2.0上运行还不是完整。 zPsLinux联盟 安装: http://httpd.apache.org下载最新版本:zPsLinux联盟 编译选项:这样可以让所有的模块都通过配置文件动态加载,方便后面其他应用模块的添加删除:zPsLinux联盟 ./configure --prefix=/home/apache --enable-shared=max --enable-module=mostzPsLinux联盟 更多安装说明可以参考: APACHE安装笔记 zPsLinux联盟 重复如下:zPsLinux联盟 apache:zPsLinux联盟 diff httpd.h httpd.h.origzPsLinux联盟 314c314zPsLinux联盟 < #define HARD_SERVER_LIMIT 2560zPsLinux联盟 ---zPsLinux联盟 > #define HARD_SERVER_LIMIT 256zPsLinux联盟 ./configure --prefix=/home/apache --enable-shared=max --enable-module=mostzPsLinux联盟 zPsLinux联盟 删除过多的注释:zPsLinux联盟 grep -v "#" httpd.conf.deault >httpd.confzPsLinux联盟 php + mysqlzPsLinux联盟 mysql: innodb效率和ORACLE差不多,一般应用用不上zPsLinux联盟 ./configure --prefix=/home/mysql --without-innodb zPsLinux联盟 zPsLinux联盟 ./configure --with-apxs=/home/apache/bin/apxs --enable-track-vars \zPsLinux联盟 --with-mysql=/home/mysql \zPsLinux联盟 --with-oci8=/home/oracle/product/8.1.7 \zPsLinux联盟 --with-oracle=/home/oracle/product/8.1.7zPsLinux联盟 make zPsLinux联盟 #make installzPsLinux联盟 修改httpd.confzPsLinux联盟 DirectoryIndex index.html index.php index.php3zPsLinux联盟 在中加入:zPsLinux联盟 AddType application/x-httpd-php .php .php3zPsLinux联盟 resinzPsLinux联盟 ./configure --with-apxs=/home/apache/bin/apxszPsLinux联盟 makezPsLinux联盟 make installzPsLinux联盟 修改httpd.confzPsLinux联盟 CauchoConfigFile /home/resin/conf/resin.confzPsLinux联盟 zPsLinux联盟 文档共享技巧:zPsLinux联盟 1 对于文档的共享来说,autoindex模块非常有用,让APACHE自动索引目录缺省是按文件/目录名排序的,而且文件名40个字符以上部分是被截断的,为了能显示完整的文件名,并且像资源管理器那样将目录排在前面,文件排在后面:zPsLinux联盟 在模块设置中:zPsLinux联盟 #增加NameWidth选项,并且文件名长度是*(自动适应当前目录下最长文件名)zPsLinux联盟 #增加FoldersFirst选项,让目录列在前面(类似于资源管理器)zPsLinux联盟 #增加了ScanHTMLTitles用HTML文件的TITLE做文件的描述,并设置描述长度是*(自适应最长)zPsLinux联盟 IndexOptions FancyIndexing +NameWidth=* FoldersFirst ScanHTMLTitles +DescriptionWidth=*zPsLinux联盟 2 如果是CGI开发,如何让用户在自己的目录下能够发布CGI程序,比如:http://192.168.0.200/~chedong/cgi- bin/my_cgi:在zPsLinux联盟 模块设置中,添加正则表达式:zPsLinux联盟 ScriptAliasMatch ~([a-z]+)/cgi-bin/(.*) /home/$1/cgi-bin/$2zPsLinux联盟 意思是匹配~user_name/cgi-bin/cgi_name自动映射到/home/user_name/cgi-bin/cgi-name脚本zPsLinux联盟 3 如果允许所有目录可以自动索引浏览autoindex,需要将zPsLinux联盟 <===改成 zPsLinux联盟 zPsLinux联盟 版本控制:CVSzPsLinux联盟 CVS缺省在服务器上几乎都安装好了,只要按照以下步骤初始化即可:zPsLinux联盟 在/etc/profile里:zPsLinux联盟 CVS库所在的主服务器设置:zPsLinux联盟 export CVSROOT=/home/cvsrootzPsLinux联盟 在其他开发服务器里设置:zPsLinux联盟 export CVSROOT=:ext:$USER@192.168.0.200:/home/cvsrootzPsLinux联盟 export CVS_RSH=sshzPsLinux联盟 然后在主服务器上cvs init初始化:zPsLinux联盟 关于CVSWEB的设置,重复以下CVS常用命令手册中CVSWEB的内容:zPsLinux联盟 CVSWEB的下载:CVSWEB从最初的版本已经演化出很多功能界面更丰富的版本,这个是个人感觉安装设置比较方便的:zPsLinux联盟 http://www.spaghetti-code.de/software/linux/cvsweb/zPsLinux联盟 下载解包:zPsLinux联盟 tar zxf cvsweb.tgzzPsLinux联盟 把配置文件cvsweb.conf放到安全的地方(比如和apache的配置放在同一个目录下),zPsLinux联盟 修改:cvsweb.cgi让CGI找到配置文件:zPsLinux联盟 $config = $ENV{'CVSWEB_CONFIG'} || '/path/to/apache/conf/cvsweb.conf';zPsLinux联盟 转到/path/to/apache/conf下并修改cvsweb.conf:zPsLinux联盟 修改CVSROOT路径设置:zPsLinux联盟 %CVSROOT = (zPsLinux联盟 'Development' => '/path/to/cvsroot', #<==修改指向本地的CVSROOTzPsLinux联盟 ); zPsLinux联盟 缺省不显示已经删除的文档:zPsLinux联盟 "hideattic" => "1",#<==缺省不显示已经删除的文档 zPsLinux联盟 在配置文件cvsweb.conf中还可以定制页头的描述信息,你可以修改$long_intro成你需要的文字 zPsLinux联盟 首先可以CVS进库里的就是以上系统的安装文档。zPsLinux联盟 更多的关于CVS的扩展应用可以参考CVS常用命令手册CVSTRAC部分zPsLinux联盟 多个服务之间的资源共享zPsLinux联盟 一般可以通过链接解决,比如:zPsLinux联盟 我希望匿名ftp共享的内容(比如在/var/ftp/pub目录下)都可以WEB发布,zPsLinux联盟 ln -s /var/ftp/pub /home/apache/htdocs/pubzPsLinux联盟 我希望/usr/share/doc里的文档大家可以通过WEB浏览:zPsLinux联盟 ln -s /usr/share/doc /home/apache/htdocs/doczPsLinux联盟 我希望WEB发布的内容大家通过WINDOWS网络邻居也可以访问:假设/home/share是samba发布的只读共享路径zPsLinux联盟 ln -s /home/apache/htdocs /home/sharezPsLinux联盟 服务的自动启动:zPsLinux联盟 系统已经安装的服务一般可以通过setup的服务配置是否自动启动,否则就在/etc/rc.local里加一些启动脚本即可。zPsLinux联盟 比如:zPsLinux联盟 zPsLinux联盟 备份和日志统计zPsLinux联盟 可以将以下脚本写在主服务器的ROOT的CRON里:zPsLinux联盟 #time sync0 5 * * 1 (/usr/bin/rdate -s YOUR_DATE_TIME_SERVER)#backup cvsroot5 3 * * * (cd /home; tar czf /home/backup/cvsroot.`date +\%w`.tgz cvsroot)#backup apache8 3 * * * (cd /home; tar czf /home/backup/apache.`date +\%w`.tgz apache)#webalizer demo3 5 * * * (/usr/local/bin/webalizer -c /home/apache/conf/webalizer.conf /home/apache/logs/`date -d yesterday +\%w`/access_log)#remove last week web log3 4 * * * (find /home/apache/logs/ -name access_log -mtime +4 -exec rm -f {} ;)这样,在/home/backup目录下会有按星期轮训的7个备份。然后通过在辅助服务器上设置CRON用wget的-m选项镜像主服务器上的 /home/backup目录或者用rsync做同步就可以了。后面的2条是关于使用webalzier做服务器的日志统计,APACHE的日志通过 cronolog进行了轮循。具体设置请参考:zPsLinux联盟 注意:zPsLinux联盟 在CRONTAB中 %需要转义\%,比如:tar czf /home/backup/apache.`date +\%w`.tgz apachezPsLinux联盟 而命令行中需要转义的\; 在crontab 中不需要转义,比如:...-mtime +4 -exec rm -f {} ;zPsLinux联盟 基于RSYNC的同步备份:zPsLinux联盟 主服务器:设置启动rsync服务zPsLinux联盟 /etc/rsyncd.conf zPsLinux联盟 hosts allow 192.168.0.*zPsLinux联盟 [ftp]zPsLinux联盟 path = /home/apache/htdocszPsLinux联盟 comment = docs need backupzPsLinux联盟 备份服务器:每天6点同步一次数据zPsLinux联盟 2 6 * * * (/usr/bin/rsync -au --delete rsync://192.168.0.200/ftp /home/apache/htdocs ) zPsLinux联盟 如何给用户设置缺省密码:zPsLinux联盟 /home/apache/bin/htpasswd -bmn chedong 123zPsLinux联盟 chedong:$apr1$5hoi./..$XlpyjZk6rw7R9D5QPo6V6/zPsLinux联盟 -b don't promptzPsLinux联盟 -m md5zPsLinux联盟 -n print to stoutzPsLinux联盟 zPsLinux联盟 TODO:zPsLinux联盟 基于WIKI的文档共享:twikizPsLinux联盟 zPsLinux联盟 打印服务;zPsLinux联盟 参考资料:zPsLinux联盟 O'Reilly在线手册:Using SambazPsLinux联盟 http://www.oreilly.com/catalog/samba/chapter/book/index.html zPsLinux联盟 - 作者: BluEmOoNz 2004年12月1日, 星期三 20:54 回复(0) | 引用(0) 加入博采 zPsLinux联盟 转载:Apache学习笔记 zPsLinux联盟 版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明zPsLinux联盟 http://www.chedong.com/tech/apache_install.htmlzPsLinux联盟 关键词: apache install php resin mod_gzip mod_expire webalizer cronologzPsLinux联盟 内容摘要:zPsLinux联盟 Apache是一个历史悠久并且功能十分强大的WEB服务器,但其丰富的功能对于一个新手来说往往不知道从何下手。我个人感觉Apache的设计充分体现了模块化设计的优势,通过在动态模块加载(DSO)模式下的安装,任何子应用模块都可以通过配置文件的简单修改进行积木式的灵活配置。安装的过程可以从简单的静态html服务开始,一个模块一个模块的学习使用。从单纯的HTML静态服务(core),到复杂的动态页面服务(core + php, core + resin, core + php + mod_gzip, core + resin + mod_expire)。zPsLinux联盟 zPsLinux联盟 本文主要从简化安装==>性能调优==>维护方便的角度,介绍了WEB服务的规划、HTTPD安装/应用模块配置、升级/维护等过程。让Apache和PHP,esin等应用模块的独立升级,完全互不影响。zPsLinux联盟 WEB应用容量规划:根据硬件配置和WEB应用的特点进行WEB服务的规划及一些简单的估算公式; zPsLinux联盟 Apache安装过程:apache的通用的简化安装选项,方便以后的应用的模块化配置;zPsLinux联盟 修改 HARD_SERVER_LIMIT:zPsLinux联盟 vi /path/to/apache_src/src/include/httpd.hzPsLinux联盟 #define HARD_SERVER_LIMIT 2560 <===将原来的 HARD_SERVER_LIMIT 256 后面加个"0"zPsLinux联盟 apache编译:zPsLinux联盟 ./configure --prefix=/home/apache --enable-shared=max --enable-module=most zPsLinux联盟 可选应用模块/工具的安装:php resin mod_gzip mod_expire及各个模块之间的配合;zPsLinux联盟 mod_php安装:./configure --with-apxs=/home/apache/bin/apxs --enable-track-vars --with-mysqlzPsLinux联盟 mod_resin安装:./configure --with-apxs=/home/apache/bin/apxs zPsLinux联盟 mod_gzip安装:修改Makefile中的 apxs路径:然后make make installzPsLinux联盟 工具:日志轮循工具cronolog安装:http://www.cronolog.org zPsLinux联盟 升级/维护:看看通用和模块化的安装过程如何简化了日常的升级/维护工作;zPsLinux联盟 按照以上的方法:系统管理员和应用管理员的职责可以清楚的分开,互相独立。zPsLinux联盟 系统安装:系统管理员的职责就是安装好一台DSO模式的Apache,然后COLON即可,zPsLinux联盟 应用安装:由应用管理员负责具体应用所需要的模块,比如PHP Resin等,并设置httpd.conf中相关的配置。zPsLinux联盟 系统升级:系统管理员:升级操作系统/升级ApachezPsLinux联盟 应用升级:应用管理员:升级应用模块,PHP Resin等。 zPsLinux联盟 WEB应用的容量规划zPsLinux联盟 Apache主要是一个内存消耗型的服务应用,我个人总结的经验公式:zPsLinux联盟 apache_max_process_with_good_perfermance < (total_hardware_memory / apache_memory_per_process ) * 2zPsLinux联盟 apache_max_process = apache_max_process_with_good_perfermance * 1.5zPsLinux联盟 为什么会有一个apache_max_process_with_good_perfermance和apache_max_process呢?原因是在低负载下系统可以使用更多的内存用于文件系统的缓存,从而进一步提高单个请求的响应速度。在高负载下,系统的单个请求响应速度会慢不少,而超过 apache_max_process,系统会因为开始使用硬盘做虚拟内存交换空间而导致系统效率急剧下降。此外,同样的服务:2G内存的机器的 apache_max_process一般只设置到1G内存的1.7倍,因为Apache本身会因为进程过多导致性能下降。zPsLinux联盟 例子1:zPsLinux联盟 一个apache + mod_php的服务器:一个apache进程一般需要4M内存zPsLinux联盟 因此在一个1G内存的机器上:apache_max_process_with_good_perfermance < (1g / 4m) * 2 = 500zPsLinux联盟 apache_max_process = 500 * 1.5 = 750zPsLinux联盟 所以规划你的应用让服务尽量跑在500个进程以下以保持比较高的效率,并设置Apache的软上限在800个。zPsLinux联盟 例子2:zPsLinux联盟 一个apache + mod_resin的服务器: 一个apache进程一般需要2M内存zPsLinux联盟 在一个2G内存的机器上: zPsLinux联盟 apache_max_process_with_good_perfermance < (2g / 2m ) * 2 = 2000zPsLinux联盟 apache_max_process = 2000 * 1.5 = 3000zPsLinux联盟 以上估算都是按小文件服务估算的(一个请求一般大小在20k以下)。对于文件下载类型站点,可能还会受其他因素:比如带宽等的影响。zPsLinux联盟 Apache安装过程zPsLinux联盟 服务器个数的硬上限HARD_SERVER_LIMIT的修改:zPsLinux联盟 在Apache的源代码中缺省的最大进程数是256个,需要修改apache_1.3.xx/src/include/httpd.hzPsLinux联盟 #ifndef HARD_SERVER_LIMITzPsLinux联盟 #ifdef WIN32zPsLinux联盟 #define HARD_SERVER_LIMIT 1024zPsLinux联盟 #elif defined(NETWARE)zPsLinux联盟 #define HARD_SERVER_LIMIT 2048zPsLinux联盟 #elsezPsLinux联盟 #define HARD_SERVER_LIMIT 2560 <===将原来的HARD_SERVER_LIMIT 256 后面加个"0"zPsLinux联盟 #endifzPsLinux联盟 #endifzPsLinux联盟 解释:zPsLinux联盟 Apache缺省的最大用户数是256个:这个配置对于服务器内存还是256M左右的时代是一个非常好的缺省设置,但随着内存成本的急剧下降,现在大型站点的服务器内存配置一般比当时要高一个数量级不止。所以256个进程的硬限制对于一台1G内存的机器来说是太浪费了,而且Apache的软上限 max_client是受限于HARD_SERVER_LIMIT的,因此如果WEB服务器内存大于256M,都应该调高Apache的 HARD_SERVER_LIMIT。根据个人的经验:2560已经可以满足大部分小于2G内存的服务器的容量规划了(Apache的软上限的规划请看后面)。zPsLinux联盟 Apache的编译:以下通用的编译选项能满足以后任意模块的安装zPsLinux联盟 ./configure --prefix=/another_driver/apache/ --enable-shared=max --enable-module=mostzPsLinux联盟 比如:zPsLinux联盟 ./configure --prefix=/home/apache/ --enable-shared=max --enable-module=mostzPsLinux联盟 zPsLinux联盟 解释:zPsLinux联盟 --prefix=/another_driver/apache/:建议将apache服务安装在另外一个驱动设备上的目的在于硬盘往往是一个系统使用寿命最低的设备,因此:将服务数据和系统完全分开,不仅能提高了数据的访问速度,更重要的,大大方便系统升级,应用备份和恢复过程。zPsLinux联盟 --shared-module=max:使用动态加载方式载入子模块会带来5%的性能下降,但和带来的配置方便相比更本不算什么:比如模块升级方便,系统升级风险降低,安装过程标准化等zPsLinux联盟 --enable-module=most:用most可以将一些不常用的module编译进来,比如后面讲到的mod_expire是就不在 apache的缺省常用模块中zPsLinux联盟 如果不想build so, 也可以这样:zPsLinux联盟 ./configure \zPsLinux联盟 "--with-layout=Apache" \zPsLinux联盟 "--prefix=/path/to/apache" \zPsLinux联盟 "--disable-module=access" \zPsLinux联盟 "--disable-module=actions" \zPsLinux联盟 "--disable-module=autoindex" \zPsLinux联盟 "--disable-module=env" \zPsLinux联盟 "--disable-module=imap" \zPsLinux联盟 "--disable-module=negotiation" \zPsLinux联盟 "--disable-module=setenvif" \zPsLinux联盟 "--disable-module=status" \zPsLinux联盟 "--disable-module=userdir" \zPsLinux联盟 "--disable-module=cgi" \zPsLinux联盟 "--disable-module=include" \zPsLinux联盟 "--disable-module=auth" \zPsLinux联盟 "--disable-module=asis"zPsLinux联盟 但结果会发现,这样编译对服务性能只能有微小的提高(5%左右),但却失去了以后系统升级和模块升级的灵活性,无论是模块还是Apache本身升级都必须把Apache和PHP的SOURCE加在一起重新编译。zPsLinux联盟 apache的缺省配置文件一般比较大:可以使用去掉注释的方法精简一下:然后再进入具体的培植过程能让你更快的定制出你所需要的。zPsLinux联盟 grep -v "#" httpd.conf.default >httpd.confzPsLinux联盟 需要修改的通用项目有以下几个:zPsLinux联盟 #服务端口,缺省是8080,建议将整个Apache配置调整好后再将服务端口改到正式服务的端口zPsLinux联盟 Port 8080 => 80zPsLinux联盟 #服务器名:缺省没有zPsLinux联盟 ServerName name.example.comzPsLinux联盟 #最大服务进程数:根据服务容量预测设置zPsLinux联盟 MaxClients 256 => 800zPsLinux联盟 #缺省启动服务后的服务进程数:等服务比较平稳后,按平均负载下的httpd个数设置就可以zPsLinux联盟 StartServers 5 => 200zPsLinux联盟 不要修改:zPsLinux联盟 以前有建议说修改:zPsLinux联盟 MinSpareServers 5 => 100zPsLinux联盟 MaxSpareServers 10 => 200zPsLinux联盟 但从我的经验看来:缺省值已经是非常优化的了,而且让Apache自己调整子共享进程个数还是比较好的。zPsLinux联盟 特别修改:zPsLinux联盟 在solaris或一些比较容易出现内存泄露的应用上:zPsLinux联盟 MaxRequestsPerChild 0 =>3000zPsLinux联盟 应用模块和工具的安装配置:zPsLinux联盟 由于使用模块动态加载的模式,所以可以方便的通过简单的配置调整来把Apache定制成你需要的:最好把不常用模块全部清除(无论处于安全还是效率)。zPsLinux联盟 比如:对于静态页面服务器:就什么其他子模块都不加载,对于PHP应用就加上PHP模块,对于JAVA应用就把Resin模块加载上。而且各种模块的插拔非常简单,这样调试过程中就可以简单的通过注释掉不需要的模块,而不用重新编译。zPsLinux联盟 一般说来,可以不需要的模块包括:zPsLinux联盟 #LoadModule env_module libexec/mod_env.sozPsLinux联盟 #LoadModule negotiation_module libexec/mod_negotiation.sozPsLinux联盟 #LoadModule status_module libexec/mod_status.sozPsLinux联盟 #server side include已经过时了zPsLinux联盟 #LoadModule includes_module libexec/mod_include.sozPsLinux联盟 #不需要将没有缺省index文件的目录下所有文件列出zPsLinux联盟 #LoadModule autoindex_module libexec/mod_autoindex.sozPsLinux联盟 #尽量不使用CGI:一直是Apache安全问题最多的地方zPsLinux联盟 #LoadModule cgi_module libexec/mod_cgi.sozPsLinux联盟 #LoadModule asis_module libexec/mod_asis.sozPsLinux联盟 #LoadModule imap_module libexec/mod_imap.sozPsLinux联盟 #LoadModule action_module libexec/mod_actions.sozPsLinux联盟 #不使用安全认证可以大大提高访问速度zPsLinux联盟 #LoadModule access_module libexec/mod_access.sozPsLinux联盟 #LoadModule auth_module libexec/mod_auth.sozPsLinux联盟 #LoadModule setenvif_module libexec/mod_setenvif.sozPsLinux联盟 最好保留的有:zPsLinux联盟 #用于定制log格式zPsLinux联盟 LoadModule config_log_module libexec/mod_log_config.sozPsLinux联盟 #用于增加文件应用的关联zPsLinux联盟 LoadModule mime_module libexec/mod_mime.sozPsLinux联盟 #用于缺省index文件:index.php等zPsLinux联盟 LoadModule dir_module libexec/mod_dir.sozPsLinux联盟 可用可不用的有:zPsLinux联盟 #比如:需要在/username/下调试php可以将zPsLinux联盟 LoadModule userdir_module libexec/mod_userdir.sozPsLinux联盟 #比如:需要将以前的URL进行转向或者需要使用CGI script-aliaszPsLinux联盟 LoadModule alias_module libexec/mod_alias.sozPsLinux联盟 zPsLinux联盟 常用的模块:zPsLinux联盟 最常用的可能就是php和JAVA应用服务器的前端,此外,从性能上讲利用mod_gzip可以减少40%左右的流量,减少机器用于传输的负载,而 mod_expires可以减少10%左右的重复请求,让重复的用户对指定的页面请求结果都CACHE在本地,根本不向服务器发出请求。zPsLinux联盟 建议将所有MODULE的配置都放到相应模块的配置内部:<IfModule some_module.c>some_module config </IfModule>zPsLinux联盟 PHP的安装:zPsLinux联盟 /path/to/php_src/configure --with-apxs=/path/to/apache/bin/apxs --with-other-modules-you-needzPsLinux联盟 需要修改的配置:zPsLinux联盟 AddType application/x-httpd-php .php .php3 .any_file_in_phpzPsLinux联盟 resin的安装设置:zPsLinux联盟 /path/to/resin/src/configure --with-apxs=/path/to/apache/bin/apxs zPsLinux联盟 具体的resin设置放在另外一个文件中:比如/home/resin/conf/resin.confzPsLinux联盟 <IfModule mod_caucho.c>zPsLinux联盟 CauchoConfigFile /path/to/apache/conf/resin.confzPsLinux联盟 </IfModule>zPsLinux联盟 mod_expires的安装配置:zPsLinux联盟 <IfModule mod_expires.c> zPsLinux联盟 ExpiresActive onzPsLinux联盟 ExpiresByType image/gif "access plus 1 month"zPsLinux联盟 ExpiresByType text/css "now plus 1 month"zPsLinux联盟 ExpiresDefault "now plus 1 day"zPsLinux联盟 </IfModule>zPsLinux联盟 注释:zPsLinux联盟 所有的.gif文件1个月以后过期zPsLinux联盟 所有的文件缺省1天以后过期zPsLinux联盟 zPsLinux联盟 mod_gzip的安装zPsLinux联盟 http://www.chedong.com/tech/compress.htmlzPsLinux联盟 zPsLinux联盟 日志的轮循:cronolog的安装和设置zPsLinux联盟 cronolog可以非常整齐的将日志按天轮循存储zPsLinux联盟 缺省编译安装到/usr/local/bin/下,只需要将配置改成:zPsLinux联盟 CustomLog "|/usr/local/sbin/cronolog /home/apache/logs/%w/access_log" combinedzPsLinux联盟 zPsLinux联盟 日志将按天截断并存放在以星期为目录名的目录下:比如:log/1是周一,log/5是周五, log/0是周日zPsLinux联盟 用gzip压缩每天的日志:zPsLinux联盟 30 4 * * * /usr/bin/gzip -f /home/apache/logs/`date -d yesterday +%w`/access_logzPsLinux联盟 日志的定期删除:zPsLinux联盟 30 5 * * */usr/bin/find /home/apache/logs/ -name access_log.gz -mtime +3 |xargs -r /bin/rm -fzPsLinux联盟 升级维护:zPsLinux联盟 由于使用动态模块加载方式(DSO模式)安装Apache,Apache的HTTPD核心服务和应用模块以及应用模块之间都变的非常灵活,建议将所有独立模块的配置都放在zPsLinux联盟 <IfModule mod_name>zPsLinux联盟 CONFIGURATIONS..zPsLinux联盟 </IfModule>zPsLinux联盟 里,这样配置非常容易通过屏蔽某个模块来进行功能调整:比如:zPsLinux联盟 #AddModule mod_gzip.czPsLinux联盟 就屏蔽了mod_gzip,而其他模块不首任何影响。zPsLinux联盟 安装和维护过程:zPsLinux联盟 系统安装:系统管理员的职责就是安装系统和一个按照DSO模式安装的Apache,然后COLON。 zPsLinux联盟 应用安装:由应用管理员负责具体应用所需要的模块并设置HTTPD。 zPsLinux联盟 系统升级:系统管理员:升级系统/升级Apache zPsLinux联盟 应用升级:应用管理员:升级应用模块:PHP CAUCHO等 zPsLinux联盟 系统备份/恢复:如果Apache不在缺省的系统盘上,只需要将Apache目录备份就可以了,遇到系统分区的硬件问题直接使用预先准备好的系统COLON,再直接将Apache所在物理盘恢复就行了。 zPsLinux联盟 系统管理员:Apache的最简化安装 OS + Apache (httpd core only) zPsLinux联盟 应用管理员:应用模块定制 纯静态页面服务zPsLinux联盟 corezPsLinux联盟 PHP动态页面zPsLinux联盟 core+sozPsLinux联盟 +phpzPsLinux联盟 JAVA应用zPsLinux联盟 core+sozPsLinux联盟 +cauchozPsLinux联盟 +ssl zPsLinux联盟 应用例子: www.example.comzPsLinux联盟 image.example.comzPsLinux联盟 bbs.example.com mall.example.com zPsLinux联盟 zPsLinux联盟 zPsLinux联盟 例子:Apache和PHP模块的独立升级。zPsLinux联盟 如果Apache是按照以下方式安装:zPsLinux联盟 ./configure --prefix=/home/apache --enable-shared=max --enable-module=most zPsLinux联盟 PHP是按照以下方式安装:zPsLinux联盟 ./configure --with-apxs=/home/apache/bin/apxs --enable-track-vars --with-mysqlzPsLinux联盟 以后单独升级Apache的时候,仍然是:zPsLinux联盟 ./configure --prefix=/home/apache --enable-shared=max --enable-module=most zPsLinux联盟 makezPsLinux联盟 suzPsLinux联盟 #/home/apache/bin/apachectl stopzPsLinux联盟 #make installzPsLinux联盟 单独升级php时,仍然是:zPsLinux联盟 ./configure --with-apxs=/home/apache/bin/apxs --enable-track-vars --with-mysqlzPsLinux联盟 makezPsLinux联盟 suzPsLinux联盟 #/home/apache/bin/apachectl stopzPsLinux联盟 #make installzPsLinux联盟 #/home/apache/bin/apachectl startzPsLinux联盟 zPsLinux联盟 基于反相代理的WEB加速:zPsLinux联盟 squid和mod_proxy都可以实现反相代理加速。而基于缓存的代理加速比起原有WEB服务,速度会有数量级的提升。zPsLinux联盟 zPsLinux联盟 小提示:zPsLinux联盟 Apache安装后,缺省根目录下没有但很有用的2个文件:zPsLinux联盟 favicon.ico: favicon.ico是一个16x16的站点图标文件,如果浏览器发现有这个文件,在地址栏中会用这个图标替换调浏览器的网页图标。IE6和 MOZILLA等主流浏览器都支持这个功能。zPsLinux联盟 例如: http://www.chedong.com/favicon.icozPsLinux联盟 robots.txt: 用于告诉搜索引擎的爬虫程序(spider)网站那些页面可以被索引,那些不可以。zPsLinux联盟 具体说明请参考:http://www.robotstxt.org/wc/robots.html zPsLinux联盟 参考文档:zPsLinux联盟 Apache项目zPsLinux联盟 http://httpd.apache.orgzPsLinux联盟 PHPzPsLinux联盟 http://www.php.netzPsLinux联盟 ResinzPsLinux联盟 http://www.caucho.comzPsLinux联盟 mod_gzipzPsLinux联盟 http://sourceforge.net/projects/mod-gzip/zPsLinux联盟 CronologzPsLinux联盟 http://www.cronolog.orgzPsLinux联盟 mod_expireszPsLinux联盟 http://httpd.apache.org/docs/mod/mod_expires.htmlzPsLinux联盟 zPsLinux联盟 面向搜索引擎的CMS设计:zPsLinux联盟 http://www.chedong.com/tech/cms.htmlzPsLinux联盟 zPsLinux联盟 zPsLinux联盟 - 作者: BluEmOoNz 2004年12月1日, 星期三 20:52 回复(0) | 引用(0) 加入博采 zPsLinux联盟 转载:ANT安装、配置 zPsLinux联盟 版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明zPsLinux联盟 http://www.chedong.com/tech/ant.htmlzPsLinux联盟 关键词:ant build.xml javaczPsLinux联盟 zPsLinux联盟 内容摘要:zPsLinux联盟 ant是一个基于JAVA的自动化脚本引擎,脚本格式为XML。除了做JAVA编译相关任务外,ANT还可以通过插件实现很多应用的调用。zPsLinux联盟 zPsLinux联盟 ANT的基本概念: zPsLinux联盟 ANT的安装:解包,设置路径 zPsLinux联盟 ANT的使用:最好的学习只不过是一个简单实用的例子起步...... zPsLinux联盟 ANT的基本概念:Java的Makefile当一个代码项目大了以后,每次重新编译,打包,测试等都会变得非常复杂而且重复,因此c语言中有make脚本来帮助这些工作的批量完成。在Java 中应用是平台无关性的,当然不会用平台相关的make脚本来完成这些批处理任务了,ANT本身就是这样一个流程脚本引擎,用于自动化调用程序完成项目的编译,打包,测试等。除了基于JAVA是平台无关的外,脚本的格式是基于XML的,比make脚本来说还要好维护一些。zPsLinux联盟 zPsLinux联盟 每个ant脚本(缺省叫build.xml)中设置了一系列任务(target):比如对于一个一般的项可能需要有以下任务。zPsLinux联盟 任务1:usage 打印本脚本的帮助信息(缺省) zPsLinux联盟 任务2:clean <-- init 清空初始化环境 zPsLinux联盟 任务3:javadoc <-- build <-- init 生成JAVADOC zPsLinux联盟 任务4:jar <-- build <-- init 生成JAR zPsLinux联盟 任务5:all <-- jar + javadoc <-- build <-- init 完成以上所有任务:jar javadoc zPsLinux联盟 而多个任务之间往往又包含了一定了依赖关系:比如把整个应用打包任务(jar)的这个依赖于编译任务(build),而编译任务又依赖于整个环境初始化任务(init)等。zPsLinux联盟 注:我看到很多项目的ant脚本中的命名基本上都是一致的,比如:编译一般叫build或者compile;打包一般叫jar或war;生成文档一般命名为javadoc或javadocs;执行全部任务all。在每个任务的中,ANT会根据配置调用一些外部应用并配以相应参数执行。虽然ANT可调用的外部应用种类非常丰富,但其实最常用的就2,3个:比如javac javadoc jar等。 ANT的安装解包后在系统可执行路径中加入指向ant的bin的路径就可以了,比如可以在GNU/Linux上把以下配置加入/etc/profile中:zPsLinux联盟 export ANT_HOME=/home/antzPsLinux联盟 export JAVA_HOME=/usr/java/j2sdk1.4.1zPsLinux联盟 export PATH=$PATH:$JAVA_HOME/bin:$ANT_HOME/binzPsLinux联盟 这样执行ant 后,如果不指定配置文件ant会缺省找build.xml这个配置文件,并根据配置文件执行任务,缺省的任务设置可以指向最常用的任务,比如: build,或指向打印帮助信息:usage,告诉用户有那些脚本选项可以使用。zPsLinux联盟 ANT的使用zPsLinux联盟 最好的学习过程就是看懂那些open source项目中的build.xml脚本,然后根据自己的需要简化成一个更简单的,ANT和APACHE上很多非常工程派的项目:简单易用,而且适应性非常强,因为这些项目的建立往往来源于开发人员日常最直接的需求。zPsLinux联盟 以下是的一个WebLucene应用的例子:修改自JDOM的build.xml:zPsLinux联盟 <project default="usage" basedir=".">zPsLinux联盟 <!-- ============================================= -->zPsLinux联盟 <!-- Initialization target -->zPsLinux联盟 <!-- =================================================== -->zPsLinux联盟 <target name="init">zPsLinux联盟 <tstamp/>zPsLinux联盟 <property file="${basedir}/build.properties" />zPsLinux联盟 <property name="Name" value="ProjectFullName"/>zPsLinux联盟 <property name="name" value="project_name"/>zPsLinux联盟 <property name="version" value="0.2"/>zPsLinux联盟 <property name="year" value="2003"/>zPsLinux联盟 <echo message="----------- ${Name} ${version} [${year}] ------------"/>zPsLinux联盟 <property name="debug" value="off"/>zPsLinux联盟 <property name="optimize" value="on"/>zPsLinux联盟 <property name="deprecation" value="on"/>zPsLinux联盟 <property name="src.dir" value="./src/WEB-INF/src"/>zPsLinux联盟 <property name="lib.dir" value="./src/WEB-INF/lib"/>zPsLinux联盟 <property name="packages" value="com.chedong.*,org.apache.lucene.*"/>zPsLinux联盟 <property name="build.src" value="./src/WEB-INF/build"/>zPsLinux联盟 <property name="build.dest" value="./src/WEB-INF/classes"/>zPsLinux联盟 <property name="build.javadocs" value="./src/doc"/>zPsLinux联盟 zPsLinux联盟 <path id="classpath">zPsLinux联盟 <pathelement path="${jsdk_jar}"/>zPsLinux联盟 <fileset dir="${lib.dir}">zPsLinux联盟 <include name="**/*.jar"/>zPsLinux联盟 </fileset>zPsLinux联盟 </path>zPsLinux联盟 zPsLinux联盟 <filter token="year" value="${year}"/>zPsLinux联盟 <filter token="version" value="${version}"/>zPsLinux联盟 <filter token="date" value="${TODAY}"/>zPsLinux联盟 <filter token="log" value="true"/>zPsLinux联盟 <filter token="verbose" value="true"/>zPsLinux联盟 </target>zPsLinux联盟 <!-- =========================================== -->zPsLinux联盟 <!-- Help on usage -->zPsLinux联盟 <!-- ================================================ -->zPsLinux联盟 <target name="usage" depends="init">zPsLinux联盟 <echo message="${Name} Build file"/>zPsLinux联盟 <echo message="-------------------------------------------------------------"/>zPsLinux联盟 <echo message=""/>zPsLinux联盟 <echo message=" available targets are:"/>zPsLinux联盟 <echo message=""/>zPsLinux联盟 <echo message=" jar --> generates the ${name}.jar file"/>zPsLinux联盟 <echo message=" build --> compiles the source code"/>zPsLinux联盟 <echo message=" javadoc --> generates the API documentation"/>zPsLinux联盟 <echo message=" clean --> cleans up the directory"/>zPsLinux联盟 <echo message=""/>zPsLinux联盟 <echo message=" Please rename build.properties.default to build.properties"/>zPsLinux联盟 <echo message=" and edit build.properties to specify JSDK 2.3 classpath."/>zPsLinux联盟 <echo message=""/>zPsLinux联盟 <echo message=" See the comments inside the build.xml file for more details."/>zPsLinux联盟 <echo message="-------------------------------------------------------------"/>zPsLinux联盟 <echo message=""/>zPsLinux联盟 <echo message=""/>zPsLinux联盟 </target>zPsLinux联盟 <!-- ============================================ -->zPsLinux联盟 <!-- Prepares the source code -->zPsLinux联盟 <!-- ================================================ -->zPsLinux联盟 <target name="prepare-src" depends="init">zPsLinux联盟 <!-- create directories -->zPsLinux联盟 <mkdir dir="${build.src}"/>zPsLinux联盟 <mkdir dir="${build.dest}"/>zPsLinux联盟 zPsLinux联盟 <!-- copy src files -->zPsLinux联盟 <copy todir="${build.src}">zPsLinux联盟 <fileset dir="${src.dir}"/> </copy>zPsLinux联盟 </target>zPsLinux联盟 <!-- ========================================== -->zPsLinux联盟 <!-- Compiles the source directory -->zPsLinux联盟 <!-- ============================================== -->zPsLinux联盟 <target name="build" depends="prepare-src">zPsLinux联盟 <javac srcdir="${build.src}"zPsLinux联盟 destdir="${build.dest}"zPsLinux联盟 debug="${debug}"zPsLinux联盟 optimize="${optimize}">zPsLinux联盟 <classpath refid="classpath"/>zPsLinux联盟 </javac>zPsLinux联盟 </target>zPsLinux联盟 <!-- =================================================== -->zPsLinux联盟 <!-- Creates the class package -->zPsLinux联盟 <!-- ========================================== -->zPsLinux联盟 <target name="jar" depends="build">zPsLinux联盟 <jar jarfile="${lib.dir}/${name}.jar"zPsLinux联盟 basedir="${build.dest}"zPsLinux联盟 includes="**"/>zPsLinux联盟 </target>zPsLinux联盟 <!-- ==================================================== -->zPsLinux联盟 <!-- Creates the API documentation -->zPsLinux联盟 <!-- ==================================================== -->zPsLinux联盟 <target name="javadoc" depends="build">zPsLinux联盟 <mkdir dir="${build.javadocs}"/>zPsLinux联盟 <javadoc packagenames="${packages}"zPsLinux联盟 sourcepath="${build.src}"zPsLinux联盟 destdir="${build.javadocs}"zPsLinux联盟 author="true"zPsLinux联盟 version="true"zPsLinux联盟 use="true"zPsLinux联盟 splitindex="true"zPsLinux联盟 windowtitle="${Name} API"zPsLinux联盟 doctitle="${Name}">zPsLinux联盟 <classpath refid="classpath"/>zPsLinux联盟 </javadoc>zPsLinux联盟 </target>zPsLinux联盟 <!-- ============================================== -->zPsLinux联盟 <!-- Clean targets -->zPsLinux联盟 <!-- =================================================== -->zPsLinux联盟 <target name="clean" depends="init">zPsLinux联盟 <delete dir="${build.src}"/>zPsLinux联盟 <delete dir="${build.dest}/org"/>zPsLinux联盟 <delete dir="${build.dest}/com"/>zPsLinux联盟 <delete>zPsLinux联盟 <fileset dir="${build.dest}" includes="**/*.class"/>zPsLinux联盟 </delete>zPsLinux联盟 </target>zPsLinux联盟 </project>zPsLinux联盟 <!-- End of file -->zPsLinux联盟 缺省任务:usage 打印帮助文档,告诉有那些任务选项:可用的有build, jar, javadoc和clean.zPsLinux联盟 初始化环境变量:initzPsLinux联盟 所有任务都基于一些基本环境变量的设置初始化完成,是后续其他任务的基础,在环境初始化过程中,有2点比较可以方便设置:zPsLinux联盟 1 除了使用却缺省的property设置了JAVA源路径和输出路径外,引用了一个外部的build.properties文件中的设置,zPsLinux联盟 <property file="${basedir}/build.properties" />zPsLinux联盟 这样大部分简单配置用户只要会看懂build.properties就可以了,毕竟XML比起key value的属性文件还是要可读性差一些。用build.properties也可以方便其他用户从编译的细节中解放出来。zPsLinux联盟 2 CLASSPATH设置:使用了其中的:zPsLinux联盟 <path id="classpath">zPsLinux联盟 <pathelement path="${jsdk_jar}"/>zPsLinux联盟 <fileset dir="${lib.dir}">zPsLinux联盟 <include name="**/*.jar"/>zPsLinux联盟 </fileset>zPsLinux联盟 </path>zPsLinux联盟 则相当于设置了:CLASSPATH=/path/to/resin/lib/jsdk23.jar; /path/to/project/lib/*.jar;zPsLinux联盟 文件复制:prepare-srczPsLinux联盟 创建临时SRC存放目录和输出目录。zPsLinux联盟 <!-- =========================================== -->zPsLinux联盟 <!-- Prepares the source code -->zPsLinux联盟 <!-- ================================================== -->zPsLinux联盟 <target name="prepare-src" depends="init">zPsLinux联盟 <!-- create directories -->zPsLinux联盟 <mkdir dir="${build.src}"/>zPsLinux联盟 <mkdir dir="${build.dest}"/>zPsLinux联盟 zPsLinux联盟 <!-- copy src files -->zPsLinux联盟 <copy todir="${build.src}">zPsLinux联盟 <fileset dir="${src.dir}"/>zPsLinux联盟 </copy>zPsLinux联盟 </target>zPsLinux联盟 编译任务:buildzPsLinux联盟 编译时的CLASSPATH环境通过一下方式找到引用一个path对象zPsLinux联盟 <classpath refid="classpath"/>zPsLinux联盟 打包任务:jarzPsLinux联盟 对应用打包生成项目所写名的.jar文件zPsLinux联盟 <!-- ============================================================ -->zPsLinux联盟 <!-- Creates the class package -->zPsLinux联盟 <!-- =========================================================-->zPsLinux联盟 <target name="jar" depends="build">zPsLinux联盟 <jar jarfile="${lib.dir}/${name}.jar"zPsLinux联盟 basedir="${build.dest}"zPsLinux联盟 includes="**">zPsLinux联盟 </target>zPsLinux联盟 生成JAVADOC文档任务: javadoczPsLinux联盟 <!-- =======================================================-->zPsLinux联盟 <!-- Creates the API documentation -->zPsLinux联盟 <!-- =======================================================-->zPsLinux联盟 <target name="javadoc" depends="build">zPsLinux联盟 <mkdir dir="${build.javadocs}"/>zPsLinux联盟 <javadoc packagenames="${packages}"zPsLinux联盟 sourcepath="${build.src}"zPsLinux联盟 destdir="${build.javadocs}"zPsLinux联盟 author="true"zPsLinux联盟 version="true"zPsLinux联盟 use="true"zPsLinux联盟 splitindex="true"zPsLinux联盟 windowtitle="${Name} API"zPsLinux联盟 doctitle="${Name}">zPsLinux联盟 <classpath refid="classpath"/>zPsLinux联盟 </javadoc>zPsLinux联盟 </target>zPsLinux联盟 清空临时编译文件:cleanzPsLinux联盟 <!-- ===================================================== -->zPsLinux联盟 <!-- Clean targets -->zPsLinux联盟 <!-- ================================================== -->zPsLinux联盟 <target name="clean" depends="init">zPsLinux联盟 <delete dir="${build.src}"/>zPsLinux联盟 <delete dir="${build.dest}/org"/>zPsLinux联盟 <delete dir="${build.dest}/com"/>zPsLinux联盟 <delete>zPsLinux联盟 <fileset dir="${build.dest}" includes="**/*.class"/>zPsLinux联盟 </delete>zPsLinux联盟 </target>zPsLinux联盟 TODO:zPsLinux联盟 更多任务/扩展:(样例)zPsLinux联盟 测试任务:JUnit测试 zPsLinux联盟 代码风格检查任务:CheckStyle,Jalopy等 zPsLinux联盟 邮件警报任务:可以把以上这些任务的输出警告发送到制定的用户列表中,这个任务可以设置每天自动运行。 zPsLinux联盟 参考资料:zPsLinux联盟 Jakarta ANT:zPsLinux联盟 http://ant.apache.orgzPsLinux联盟 zPsLinux联盟 zPsLinux联盟 - 作者: BluEmOoNz 2004年12月1日, 星期三 20:51 回复(0) | 引用(0) 加入博采 zPsLinux联盟 转载:CVS使用手册 zPsLinux联盟 版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明zPsLinux联盟 http://www.chedong.com/tech/cvs_card.htmlzPsLinux联盟 关键词:CVS CVSWeb CVSTrac WinCVS CVSROOT zPsLinux联盟 内容摘要: zPsLinux联盟 CVS是一个C/S系统,多个开发人员通过一个中心版本控制系统来记录文件版本,从而达到保证文件同步的目的。工作模式如下: zPsLinux联盟 CVS服务器(文件版本库) / | \ (版 本 同 步) / | \开发者1 开发者2 开发者3作为一般开发人员挑选2,6看就可以了,CVS的管理员则更需要懂的更多一些,最后还简单介绍了一些Windows下的cvs客户端使用,CVS远程用户认证的选择及与BUG跟踪系统等开发环境的集成问题。zPsLinux联盟 CVS环境初始化:CVS环境的搭建 管理员 zPsLinux联盟 CVS的日常使用:日常开发中最常用的CVS命令, 开发人员 管理员 zPsLinux联盟 CVS的分支开发:项目按照不同进度和目标并发进行 管理员 zPsLinux联盟 CVS的用户认证:通过SSH的远程用户认证,安全,简单 管理员 zPsLinux联盟 CVSWEB:CVS的WEB访问界面大大提高代码版本比较的效率 管理员 zPsLinux联盟 CVS TAG:将$Id$ 加入代码注释中,方便开发过程的跟踪开发人员 zPsLinux联盟 CVS vs VSS: CVS和Virsual SourceSafe的比较 开发人员 管理员 zPsLinux联盟 WinCVS: 通过SSH认证的WinCVS认证设置 zPsLinux联盟 基于CVSTrac的小组开发环境搭建:通过CVSTrac实现web界面的CVS用户管理,集成的BUG跟踪和WIKI交流 zPsLinux联盟 CVS中的用户权限管理:基于系统用户的CVS权限管理和基于CVSROOT/passwd的虚拟用户管理zPsLinux联盟 一个系统20%的功能往往能够满足80%的需求,CVS也不例外,以下是CVS最常用的功能,可能还不到它全部命令选项的20%,作为一般开发人员平时会用cvs update和cvs commit就够了,更多的需求在实际应用过程中自然会出现,不时回头看看相关文档经常有意外的收获。zPsLinux联盟 zPsLinux联盟 zPsLinux联盟 CVS环境初始化环境设置:指定CVS库的路径CVSROOT zPsLinux联盟 tcshzPsLinux联盟 setenv CVSROOT /path/to/cvsrootzPsLinux联盟 bashzPsLinux联盟 CVSROOT=/path/to/cvsroot ; export CVSROOTzPsLinux联盟 后面还提到远程CVS服务器的设置:zPsLinux联盟 CVSROOT=:ext:$USER@test.server.address#port:/path/to/cvsroot CVS_RSH=ssh; export CVSROOT CVS_RSHzPsLinux联盟 初始化:CVS版本库的初始化。zPsLinux联盟 cvs initzPsLinux联盟 一个项目的首次导入zPsLinux联盟 cvs import -m "write some comments here" project_name vendor_tag release_tagzPsLinux联盟 执行后:会将所有源文件及目录导入到/path/to/cvsroot/project_name目录下zPsLinux联盟 vender_tag: 开发商标记zPsLinux联盟 release_tag: 版本发布标记zPsLinux联盟 项目导出:将代码从CVS库里导出zPsLinux联盟 cvs checkout project_namezPsLinux联盟 cvs 将创建project_name目录,并将最新版本的源代码导出到相应目录中。这个checkout和Virvual SourceSafe中的check out不是一个概念,相对于Virvual SourceSafe的check out是cvs update, check in是cvs commit。zPsLinux联盟 zPsLinux联盟 CVS的日常使用 zPsLinux联盟 注意:第一次导出以后,就不是通过cvs checkout来同步文件了,而是要进入刚才cvs checkout project_name导出的project_name目录下进行具体文件的版本同步(添加,修改,删除)操作。zPsLinux联盟 将文件同步到最新的版本zPsLinux联盟 cvs updatezPsLinux联盟 不制定文件名,cvs将同步所有子目录下的文件,也可以制定某个文件名/目录进行同步zPsLinux联盟 cvs update file_namezPsLinux联盟 最好每天开始工作前或将自己的工作导入到CVS库里前都要做一次,并养成"先同步 后修改"的习惯,和Virvual SourceSafe不同,CVS里没有文件锁定的概念,所有的冲突是在commit之前解决,如果你修改过程中,有其他人修改并commit到了CVS 库中,CVS会通知你文件冲突,并自动将冲突部分用zPsLinux联盟 >>>>>>zPsLinux联盟 content on cvs serverzPsLinux联盟 <<<<<<zPsLinux联盟 content in your filezPsLinux联盟 >>>>>>zPsLinux联盟 标记出来,由你确认冲突内容的取舍。zPsLinux联盟 版本冲突一般是在多个人修改一个文件造成的,但这种项目管理上的问题不应该指望由CVS来解决。zPsLinux联盟 确认修改写入到CVS库里zPsLinux联盟 cvs commit -m "write some comments here" file_namezPsLinux联盟 注意:CVS的很多动作都是通过cvs commit进行最后确认并修改的,最好每次只修改一个文件。在确认的前,还需要用户填写修改注释,以帮助其他开发人员了解修改的原因。如果不用写-m "comments"而直接确认`cvs commit file_name` 的话,cvs会自动调用系统缺省的文字编辑器(一般是vi)要求你写入注释。zPsLinux联盟 注释的质量很重要:所以不仅必须要写,而且必须写一些比较有意义的内容:以方便其他开发人员能够很好的理解zPsLinux联盟 不好的注释,很难让其他的开发人员快速的理解:比如: -m "bug fixed" 甚至 -m ""zPsLinux联盟 好的注释,甚至可以用中文: -m "在用户注册过程中加入了Email地址校验" zPsLinux联盟 修改某个版本注释:每次只确认一个文件到CVS库里是一个很好的习惯,但难免有时候忘了指定文件名,把多个文件以同样注释commit到CVS库里了,以下命令可以允许你修改某个文件某个版本的注释:zPsLinux联盟 cvs admin -m 1.3:"write some comments here" file_namezPsLinux联盟 添加文件zPsLinux联盟 创建好新文件后,比如:touch new_filezPsLinux联盟 cvs add new_filezPsLinux联盟 注意:对于图片,Word文档等非纯文本的项目,需要使用cvs add -kb选项按2进制文件方式导入(k表示扩展选项,b表示binary),否则有可能出现文件被破坏的情况zPsLinux联盟 比如:zPsLinux联盟 cvs add -kb new_file.gifzPsLinux联盟 cvs add -kb readme.doczPsLinux联盟 如果关键词替换属性在首次导入时设置错了怎么办?zPsLinux联盟 cvs admin -kkv new_file.css zPsLinux联盟 然后确认修改并注释zPsLinux联盟 cvs ci -m "write some comments here"zPsLinux联盟 删除文件zPsLinux联盟 将某个源文件物理删除后,比如:rm file_namezPsLinux联盟 cvs rm file_namezPsLinux联盟 然后确认修改并注释zPsLinux联盟 cvs ci -m "write some comments here"zPsLinux联盟 以上面前2步合并的方法为:zPsLinux联盟 cvs rm -f file_namezPsLinux联盟 cvs ci -m "why delete file"zPsLinux联盟 注意:很多cvs命令都有缩写形式:commit=>ci; update=>up; checkout=>co/get; remove=>rm; zPsLinux联盟 添加目录zPsLinux联盟 cvs add dir_namezPsLinux联盟 查看修改历史zPsLinux联盟 cvs log file_namezPsLinux联盟 cvs history file_namezPsLinux联盟 查看当前文件不同版本的区别zPsLinux联盟 cvs diff -r1.3 -r1.5 file_namezPsLinux联盟 查看当前文件(可能已经修改了)和库中相应文件的区别zPsLinux联盟 cvs diff file_namezPsLinux联盟 cvs的web界面提供了更方便的定位文件修改和比较版本区别的方法,具体安装设置请看后面的cvsweb使用zPsLinux联盟 正确的通过CVS恢复旧版本的方法:zPsLinux联盟 如果用cvs update -r1.2 file.namezPsLinux联盟 这个命令是给file.name加一个STICK TAG: "1.2" ,虽然你的本意只是想将它恢复到1.2版本zPsLinux联盟 正确的恢复版本的方法是:cvs update -p -r1.2 file_name >file_namezPsLinux联盟 如果不小心已经加成STICK TAG的话:用cvs update -A 解决zPsLinux联盟 移动文件/文件重命名zPsLinux联盟 cvs里没有cvs move或cvs rename,因为这两个操作是可以由先cvs remove old_file_name,然后cvs add new_file_name实现的。zPsLinux联盟 删除/移动目录zPsLinux联盟 最方便的方法是让管理员直接移动,删除CVSROOT里相应目录(因为CVS一个项目下的子目录都是独立的,移动到$CVSROOT目录下都可以作为新的独立项目:好比一颗树,其实砍下任意一枝都能独立存活),对目录进行了修改后,要求其开发人员重新导出项目cvs checkout project_name 或者用cvs update -dP同步。zPsLinux联盟 项目发布导出不带CVS目录的源文件zPsLinux联盟 做开发的时候你可能注意到了,每个开发目录下,CVS都创建了一个CVS/目录。里面有文件用于记录当前目录和CVS库之间的对应信息。但项目发布的时候你一般不希望把文件目录还带着含有CVS信息的CVS目录吧,这个一次性的导出过程使用cvs export命令,不过export只能针对一个TAG或者日期导出,比如:zPsLinux联盟 cvs export -r release1 project_name zPsLinux联盟 cvs export -D 20021023 project_namezPsLinux联盟 cvs export -D now project_namezPsLinux联盟 CVS Branch:项目多分支同步开发确认版本里程碑:多个文件各自版本号不一样,项目到一定阶段,可以给所有文件统一指定一个阶段里程碑版本号,方便以后按照这个阶段里程碑版本号导出项目,同时也是项目的多个分支开发的基础。zPsLinux联盟 cvs tag release_1_0zPsLinux联盟 开始一个新的里程碑:zPsLinux联盟 cvs commit -r 2 标记所有文件开始进入2.x的开发zPsLinux联盟 注意:CVS里的revsion和软件包的发布版本可以没有直接的关系。但所有文件使用和发布版本一致的版本号比较有助于维护。zPsLinux联盟 版本分支的建立zPsLinux联盟 在开发项目的2.x版本的时候发现1.x有问题,但2.x又不敢用,则从先前标记的里程碑:release_1_0导出一个分支 release_1_0_patchzPsLinux联盟 cvs rtag -b -r release_1_0 release_1_0_patch proj_dirzPsLinux联盟 一些人先在另外一个目录下导出release_1_0_patch这个分支:解决1.0中的紧急问题,zPsLinux联盟 cvs checkout -r release_1_0_patchzPsLinux联盟 而其他人员仍旧在项目的主干分支2.x上开发zPsLinux联盟 在release_1_0_patch上修正错误后,标记一个1.0的错误修正版本号zPsLinux联盟 cvs tag release_1_0_patch_1zPsLinux联盟 如果2.0认为这些错误修改在2.0里也需要,也可以在2.0的开发目录下合并release_1_0_patch_1中的修改到当前代码中:zPsLinux联盟 cvs update -j release_1_0_patch_1zPsLinux联盟 CVS的远程认证通过SSH远程访问CVS使用cvs本身基于pserver的远程认证很麻烦,需要定义服务器和用户组,用户名,设置密码等,zPsLinux联盟 常见的登陆格式如下:zPsLinux联盟 cvs -d :pserver:cvs_user_name@cvs.server.address:/path/to/cvsroot loginzPsLinux联盟 例子:zPsLinux联盟 cvs -d :pserver:cvs@samba.org:/cvsroot loginzPsLinux联盟 不是很安全,因此一般是作为匿名只读CVS访问的方式。从安全考虑,通过系统本地帐号认证并通过SSH传输是比较好的办法,通过在客户机的 /etc/profile里设置一下内容:zPsLinux联盟 CVSROOT=:ext:$USER@cvs.server.address#port:/path/to/cvsroot CVS_RSH=ssh; export CVSROOT CVS_RSHzPsLinux联盟 所有客户机所有本地用户都可以映射到CVS服务器相应同名帐号了。zPsLinux联盟 比如:zPsLinux联盟 CVS服务器是192.168.0.3,上面CVSROOT路径是/home/cvsroot,另外一台开发客户机是192.168.0.4,如果 tom在2台机器上都有同名的帐号,那么从192.168.0.4上设置了:zPsLinux联盟 export CVSROOT=:ext:tom@192.168.0.3:/home/cvsrootzPsLinux联盟 export CVS_RSH=sshzPsLinux联盟 tom就可以直接在192.168.0.4上对192.168.0.3的cvsroot进行访问了(如果有权限的话)zPsLinux联盟 cvs checkout project_namezPsLinux联盟 cd project_namezPsLinux联盟 cvs updatezPsLinux联盟 ...zPsLinux联盟 cvs commit zPsLinux联盟 zPsLinux联盟 如果CVS所在服务器的SSH端口不在缺省的22,或者和客户端与CVS服务器端SSH缺省端口不一致,有时候设置了:zPsLinux联盟 :ext:$USER@test.server.address#port:/path/to/cvsroot zPsLinux联盟 仍然不行,比如有以下错误信息:zPsLinux联盟 ssh: test.server.address#port: Name or service not knownzPsLinux联盟 cvs [checkout aborted]: end of file from server (consult above messages if any)zPsLinux联盟 解决的方法是做一个脚本指定端口转向(不能使用alias,会出找不到文件错误):zPsLinux联盟 创建一个/usr/bin/ssh_cvs文件,假设远程服务器的SSH端口是非缺省端口:34567zPsLinux联盟 #!/bin/shzPsLinux联盟 /usr/bin/ssh -p 34567 "$@"zPsLinux联盟 然后:chmod +x /usr/bin/ssh_cvszPsLinux联盟 并CVS_RSH=ssh_cvs; export CVS_RSHzPsLinux联盟 注意:port是指相应服务器SSH的端口,不是指cvs专用的pserver的端口zPsLinux联盟 zPsLinux联盟 CVSWEB:提高文件浏览效率CVSWEB就是CVS的WEB界面,可以大大提高程序员定位修改的效率:zPsLinux联盟 使用的样例可以看:http://www.freebsd.org/cgi/cvsweb.cgizPsLinux联盟 CVSWEB的下载:CVSWEB从最初的版本已经演化出很多功能界面更丰富的版本,这个是我个人感觉安装设置比较方便的:zPsLinux联盟 原先在:http://www.spaghetti-code.de/software/linux/cvsweb/,但目前已经删除,目前仍可以在本站下载CVSWEB,其实最近2年FreeBSD的CVSWeb项目已经有了更好的发展吧,而当初没有用FreeBSD那个版本主要就是因为没有彩色的文件Diff功能。 zPsLinux联盟 下载解包: |