| 论坛注册| 加入收藏 | 设为首页| RSS
Google
您当前的位置:首页 > Linux频道 > Linux开发区 > WEB开发

apache 进程数与PHP的加密

时间:2008-02-05 10:15:14  来源:  作者:
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联盟
下载解包: