用rsync实现网站镜像和备份

[不指定 2004/12/30 00:00 | by ipaddr ]
作者:ideal <ideal@linuxaid.com.cn>

简介
对于选择Linux 作为应用平台的的中小型企业或网站来说,往往面临如何实现数据远程备份或者网站镜象的问题,虽然有商业化的备份和镜象产品可供选择,但这些产品的价格往往过于昂贵。因此如何利用自由软件高效实现远程备份和网站镜象就成为一个值得讨论的话题。

通过网络进行远程数据备份或者网站镜象的最简单的方法就是使用wget,但是这种方式每次都需要将所有数据都重新在网络上传输一遍,而不考虑哪些文件是经过更新的,因此效率非常低下。尤其在需要备份的数据量很大的时候,往往需要花费数个小时来在网络上进行数据传输。

因此这里就介绍一种高效的网络远程备份和镜象工具-rsync,它可以满足绝大多数要求不是特别严格的备份需求。

rsync是类unix系统下的数据镜像备份工具,从软件的命名上就可以看出来了——remote sync。它的特性如下:

可以镜像保存整个目录树和文件系统。  
可以很容易做到保持原来文件的权限、时间、软硬链接等等。  
无须特殊权限即可安装。  
优化的流程,文件传输效率高。  
可以使用rcp、ssh等方式来传输文件,当然也可以通过直接的socket连接。  
支持匿名传输,以方便进行网站镜象。


软件下载
rysnc的主页地址为:

   http://rsync.samba.org/

目前最新版本为2.4.6。可以选择从原始网站下载:http://rsync.samba.org/ftp/rsync/。也可以选择从本站下载:rsync 2.4.6。

编译安装
rsync的编译安装非常简单,只需要以下简单的几步:

[root@www rsync-2.4.6]# ./configure
[root@www rsync-2.4.6]# make
[root@www rsync-2.4.6]# make install

但是需要注意的是必须在服务器A和B上都安装rsync,其中A服务器上是以服务器模式运行rsync,而B上则以客户端方式运行rsync。这样在web服务器A上运行rsync守护进程,在B上定时运行客户程序来备份web服务器A上需要备份的内容。

rsync服务器
1、rsync服务器的启动

在web服务器A上需要以守护进程方式来启动rsync服务器,只需要运行:

[root@www rsync-2.4.6]# /usr/local/bin/rsync --daemon

即可启动。rsync默认服务端口为873,服务器在该端口接收客户的匿名或者认证方式的备份请求。

如果要在启动时把服务起来,有几种不同的方法,比如:

a、加入inetd.conf

编辑/etc/services,加入rsync 873/tcp,指定rsync的服务端口是873。编加/etc/inetd.conf,加入rsync stream tcp nowait root /bin/rsync rsync --daemon

注:对于xinetd,设置方法类似。

b、加入rc.local

编辑/etc/rc.d/rc.local,在最后添加:

/usr/local/bin/rsync --daemon

2、rsync的配置

对于rsync服务器来说,最重要和复杂的就是它的配置了。rsync服务器的配置文件为/etc/rsyncd.conf,其控制认证、访问、日志记录等等。

该文件是由一个或多个模块结构组成。一个模块定义以方括弧中的模块名开始,直到下一个模块定义开始或者文件结束,模块中包含格式为name = value的参数定义。每个模块其实就对应需要备份的一个目录树,比方说在我们的实例环境中,有三个目录树需要备份:/www/、/home/web_user1/和/home/web_user2/,那么就需要在配置文件中定义三个模块,分别对应三个目录树。

配置文件是行为单位的,也就是每个新行都表示一个新的注释、模块定义或者参数赋值。以#开始的行表示注释,以"\"结束的行表示下面一行是该行的继续。参数赋值中等号后可能是一个大小写不敏感的字符串、一个以trure/false表示的布尔值。

全局参数

在文件中[modlue]之前的所有参数都是全局参数,当然也可以在全局参数部分定义模块参数,这时候该参数的值就是所有模块的默认值。

motd file

 "motd file"参数用来指定一个消息文件,当客户连接服务器时该文件的内容显示给客户,默认是没有motd文件的。

log file

  "log file"指定rsync的日志文件,而不将日志发送给syslog。

pid file

  指定rsync的pid文件。

syslog facility

   指定rsync发送日志消息给syslog时的消息级别,常见的消息级别是:uth, authpriv, cron, daemon, ftp, kern, lpr, mail, news, security, sys-log, user, uucp, local0, local1, local2, local3,local4, local5, local6和local7。默认值是daemon。

模块参数

在全局参数之后就需要定义一个或多个模块了,模块中可以定义以下参数:

comment

  给模块指定一个描述,该描述连同模块名在客户连接得到模块列表时显示给客户。默认没有描述定义。

path

  指定该模块的供备份的目录树路径,该参数是必须指定的。

use chroot

  如果"use chroot"指定为true,那么rsync在传输文件以前首先chroot到path参数所指定的目录下。这样做的原因是实现额外的安全防护,但是缺点是需要以roots权限,并且不能备份指向外部的符号连接所指向的目录文件。默认情况下chroot值为true。

max connections

   指定该模块的最大并发连接数量以保护服务器,超过限制的连接请求将被告知随后再试。默认值是0,也就是没有限制。

lock file

   指定支持max connections参数的锁文件,默认值是/var/run/rsyncd.lock。

read only

   该选项设定是否允许客户上载文件。如果为true那么任何上载请求都会失败,如果为false并且服务器目录读写权限允许那么上载是允许的。默认值为true。

list

 该选项设定当客户请求可以使用的模块列表时,该模块是否应该被列出。如果设置该选项为false,可以创建隐藏的模块。默认值是true。

uid

  该选项指定当该模块传输文件时守护进程应该具有的uid,配合gid选项使用可以确定哪些可以访问怎么样的文件权限,默认值是"nobody"。

gid

 该选项指定当该模块传输文件时守护进程应该具有的gid。默认值为"nobody"。

exlude

 用来指定多个由空格隔开的多个模式列表,并将其添加到exclude列表中。这等同于在客户端命令中使用--exclude来指定模式,不过配置文件中指定的exlude模式不会传递给客户端,而仅仅应用于服务器。一个模块只能指定一个exlude选项,但是可以在模式前面使用"-"和"+"来指定是exclude还是include。

 但是需要注意的一点是该选项有一定的安全性问题,客户很有可能绕过exlude列表,如果希望确保特定的文件不能被访问,那就最好结合uid/gid选项一起使用。

exlude from

 指定一个包含exclude模式的定义的文件名,服务器从该文件中读取exlude列表定义。

include  

用来指定多个由空格隔开的多个rsync并应该exlude的模式列表。这等同于在客户端命令中使用--include来指定模式,结合include和exlude可以定义复杂的exlude/include规则 。一个模块只能指定一个include选项,但是可以在模式前面使用"-"和"+"来指定是exclude还是include。

include from

 指定一个包含include模式的定义的文件名,服务器从该文件中读取include列表定义。

auth users

 该选项指定由空格或逗号分隔的用户名列表,只有这些用户才允许连接该模块。这里的用户和系统用户没有任何关系。如果"auth users"被设置,那么客户端发出对该模块的连接请求以后会被rsync请求challenged进行验证身份这里使用的challenge/response认证协议。用户的名和密码以明文方式存放在"secrets file"选项指定的文件中。默认情况下无需密码就可以连接模块(也就是匿名方式)。

secrets file

 该选项指定一个包含定义用户名:密码对的文件。只有在"auth users"被定义时,该文件才有作用。文件每行包含一个username:passwd对。一般来说密码最好不要超过8个字符。没有默认的secures file名,需要限式指定一个。(例如:/etc/rsyncd.secrets)

strict modes

  该选项指定是否监测密码文件的权限,如果该选项值为true那么密码文件只能被rsync服务器运行身份的用户访问,其他任何用户不可以访问该文件。默认值为true。

hosts allow

 该选项指定哪些IP的客户允许连接该模块。客户模式定义可以是以下形式:

o xxx.xxx.xxx.xxx,客户主机只有完全匹配该IP才允许访问。例如:192.167.0.1

o a.b.c.d/n,属于该网络的客户都允许连接该模块。例如:192.168.0.0/24

o a.b.c.d/e.f.g.h,属于该网络的客户都允许连接该模块。例如:192.168.0.0/255.255.255.0

o 一个主机名,客户主机只有拥有该主机名才允许访问,例如:backup.linuxaid.com.cn。


o *.linuxaid.com.cn,所有属于该域的主机都允许。

默认是允许所有主机连接。

hosts deny

指定不允许连接rsync服务器的机器,可以使用hosts allow的定义方式来进行定义。默认是没有hosts deny定义。

ignore errors

 指定rsyncd在判断是否运行传输时的删除操作时忽略server上的IP错误,一般来说rsync在出现IO错误时将将跳过--delete操作,以防止因为暂时的资源不足或其它IO错误导致的严重问题。

ignore nonreadable

 指定rysnc服务器完全忽略那些用户没有访问权限的文件。这对于在需要备份的目录中有些文件是不应该被备份者得到的情况是有意义的。

transfer logging

  使rsync服务器使用ftp格式的文件来记录下载和上载操作在自己单独的日志中。

log format

 通过该选项用户在使用transfer logging可以自己定制日志文件的字段。其格式是一个包含格式定义符的字符串,可以使用的格式定义符如下所示:

o %h 远程主机名

o %a 远程IP地址

o %l 文件长度字符数

o %p 该次rsync会话的进程id

o %o 操作类型:"send"或"recv"

o %f 文件名

o %P 模块路径

o %m 模块名

o %t 当前时间

o %u 认证的用户名(匿名时是null)

o %b 实际传输的字节数

o %c 当发送文件时,该字段记录该文件的校验码

默认log格式为:"%o %h [%a] %m (%u) %f %l",一般来说,在每行的头上会添加"%t [%p] "。在源代码中同时发布有一个叫rsyncstats的perl脚本程序来统计这种格式的日志文件。

timeout

 通过该选项可以覆盖客户指定的IP超时时间。通过该选项可以确保rsync服务器不会永远等待一个崩溃的客户。超时单位为秒钟,0表示没有超时定义,这也是默认值。对于匿名rsync服务器来说,一个理想的数字是600。

refuse options

 通过该选项可以定义一些不允许客户对该模块使用的命令参数列表。这里必须使用命令全名,而不能是简称。但发生拒绝某个命令的情况时服务器将报告错误信息然后退出。如果要防止使用压缩,应该是:"dont compress = *"。

dont compress

 用来指定那些不进行压缩处理再传输的文件,默认值是

*.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz

rsync客户命令
在对rsync服务器配置结束以后,下一步就需要在客户端发出rsync命令来实现将服务器端的文件备份到客户端来。rsync是一个功能非常强大的工具,其命令也有很多功能特色选项,我们下面就对它的选项一一进行分析说明。

首先,rsync的命令格式可以为:

rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST

rsync [OPTION]... [USER@]HOST:SRC DEST

rsync [OPTION]... SRC [SRC]... DEST

rsync [OPTION]... [USER@]HOST::SRC [DEST]

rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST

rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
rsync有六种不同的工作模式:

拷贝本地文件;当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式。

使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST路径地址包含单个冒号":"分隔符时启动该模式。

使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC地址路径包含单个冒号":"分隔符时启动该模式。

从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含"::"分隔符时启动该模式。

从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含"::"分隔符时启动该模式。

列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。
1、用法

在使用rsync传输文件时,需要指定一个源和一个目的,其中一个可能是远程机器的资源信息。例如:

rsync *.c foo:src/

表示将传输当前目录下所有以.c结尾的文件到机器foo的src目录下。如果任何文件已经存在于远程系统,则会调用远程更新协议来实现仅仅传输那些更新过的文件。

rsync -avz foo:src/bar /data/tmp

该命令则递归地传输机器foo上的src/bar目录下的所有内容到本地/data/tmp/bar目录中。文件以归档模式进行传输,以确保符号链结、属性、权限、属主等信息在传输中都被保存。此外,可以使用压缩技术来加快数据传输:

rsync -avz foo:src/bar/ /data/tmp

路径信息以"/"结尾时表示拷贝该目录,而不以"/"结尾表示拷贝该目录。当配合使用--delete选项时这两种情况的区别将会表现出来。

也可以以本地模式来使用rsync,如果SRC和DST路径中都没有任何":"符号则表示该命令运行在本地模式,等同于cp命令。

rsync somehost.mydomain.com::

这种模式则将会列出somehost.mydomain.com.可以访问的所有模块信息。

选项说明

-v, --verbose   详细模式输出
-q, --quiet     精简输出模式
-c, --checksum  打开校验开关,强制对文件传输进行校验
-a, --archive   归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD
-r, --recursive 对子目录以递归模式处理
-R, --relative  使用相对路径信息
               
rsync foo/bar/foo.c remote:/tmp/

则在/tmp目录下创建foo.c文件,而如果使用-R参数:

rsync -R foo/bar/foo.c remote:/tmp/

则会创建文件/tmp/foo/bar/foo.c,也就是会保持完全路径信息。

-b, --backup   创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用--suffix选项来指定不同的备份文件前缀。
--backup-dir   将备份文件(如~filename)存放在在目录下。
-suffix=SUFFIX 定义备份文件前缀
-u, --update   仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件。(不覆盖更新的文件)
-l, --links    保留软链结
-L, --copy-links 想对待常规文件一样处理软链结
--copy-unsafe-links 仅仅拷贝指向SRC路径目录树以外的链结
--safe-links 忽略指向SRC路径目录树以外的链结
-H, --hard-links 保留硬链结
-p, --perms 保持文件权限
-o, --owner 保持文件属主信息
-g, --group 保持文件属组信息
-D, --devices 保持设备文件信息
-t, --times 保持文件时间信息
-S, --sparse 对稀疏文件进行特殊处理以节省DST的空间
-n, --dry-run现实哪些文件将被传输
-W, --whole-file 拷贝文件,不进行增量检测
-x, --one-file-system 不要跨越文件系统边界
-B, --block-size=SIZE 检验算法使用的块尺寸,默认是700字节
-e, --rsh=COMMAND 指定替代rsh的shell程序
--rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息
-C, --cvs-exclude 使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件
--existing 仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件
--delete 删除那些DST中SRC没有的文件
--delete-excluded 同样删除接收端那些被该选项指定排除的文件
--delete-after 传输结束以后再删除
--ignore-errors 及时出现IO错误也进行删除
--max-delete=NUM 最多删除NUM个文件
--partial 保留那些因故没有完全传输的文件,以是加快随后的再次传输
--force 强制删除目录,即使不为空
--numeric-ids 不将数字的用户和组ID匹配为用户名和组名
--timeout=TIME IP超时时间,单位为秒
-I, --ignore-times 不跳过那些有同样的时间和长度的文件
--size-only 当决定是否要备份文件时,仅仅察看文件大小而不考虑文件时间
--modify-window=NUM 决定文件是否时间相同时使用的时间戳窗口,默认为0
-T --temp-dir=DIR 在DIR中创建临时文件
--compare-dest=DIR 同样比较DIR中的文件来决定是否需要备份
-P 等同于 --partial
--progress 显示备份过程
-z, --compress 对备份的文件在传输时进行压缩处理
--exclude=PATTERN 指定排除不需要传输的文件模式
--include=PATTERN 指定不排除而需要传输的文件模式
--exclude-from=FILE 排除FILE中指定模式的文件
--include-from=FILE 不排除FILE指定模式匹配的文件
--version 打印版本信息
--address 绑定到特定的地址
--config=FILE 指定其他的配置文件,不使用默认的rsyncd.conf文件
--port=PORT 指定其他的rsync服务端口
--blocking-io 对远程shell使用阻塞IO
-stats 给出某些文件的传输状态
--progress 在传输时现实传输过程
--log-format=FORMAT 指定日志文件格式
--password-file=FILE 从FILE中得到密码
--bwlimit=KBPS 限制I/O带宽,KBytes per second
-h, --help 显示帮助信息
实例分析
这里假设有两台服务器:A和B。其中A是主web服务器,具有域名www.linuxaid.com.cn(202.99.11.120),B服务器是备份机,其域名为backup.linuxaid.com.cn(202.99.11.121)。其中A的web内容存放在以下几个地方:/www/和/home/web_user1/和/home/web_user2/。我们需要在备份机B上建立对这几个目录内容的备份。

服务器配置实例

那么在www.linuxaid.com.cn上创建rsyncd的配置文件/etc/rsyncd.conf,内容如下:

uid = nobody
gid = nobody
use chroot = no
max connections = 4
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log

[www]
path = /www/
ignore errors
read only = true
list = false
hosts allow = 202.99.11.121
hosts deny = 0.0.0.0/32
auth users = backup
secrets file = /etc/backserver.pas

[web_user1]
path = /home/web_user1/
ignore errors
read only = true
list = false
hosts allow = 202.99.11.121
hosts deny = 0.0.0.0/32
uid = web_user1
gid = web_user1
auth users = backup
secrets file = /etc/backserver.pas

[web_user2]
path = /home/web_user2/
ignore errors
read only = true
list = false
hosts allow = 202.99.11.121
hosts deny = 0.0.0.0/32
uid = web_user2
gid = web_user2
auth users = backup
secrets file = /etc/backserver.pas

这里定义有四个三个模块,分别对应于三个需要备份的目录树。这里只允许202.99.11.121备份本机的数据,并且需要认证。三个模块授权的备份用户都为backup,并且用户信息保存在文件/etc/backserver.pas中,其内容如下:

backup:bk_passwd

并且该文件只能是root用户可读写的,否则rsyncd启动时会出错。这些文件配置完毕以后,就需要在A服务器上启动rsyncd服务器:

rsync --daemon

客户命令示例

/usr/local/bin/rsync -vzrtopg  --delete --exclude "logs/" --exclude "conf/ssl.*/" --progress backup@202.99.11.120::www /backup/www/ --password-file=/etc/rsync.pass

上面这个命令行中-vzrtopg里的v是verbose,z是压缩,r是recursive,topg都是保持文件原有属性如属主、时间的参数。--progress是指显示出详细的进度情况,--delete是指如果服务器端删除了这一文件,那么客户端也相应把文件删除,保持真正的一致。--exclude "logs/" 表示不对/www/logs目录下的文件进行备份。--exclude "conf/ssl.*/"表示不对/www/conf/ssl.*/目录下的文件进行备份。

backup@202.99.11.120::www 表示对该命令是对服务器202.99.11.120中的www模块进行备份,backup表示使用backup来对该模块进行备份。

--password-file=/etc/rsync.pass来指定密码文件,这样就可以在脚本中使用而无需交互式地输入验证密码了,这里需要注意的是这份密码文件权限属性要设得只有root可读。 (漂 注:/etc/rsync.pass只需写密码,不要写用户名)

这里将备份的内容存放在备份机的/backup/www/目录下。

[root@linuxaid /]# /usr/local/bin/rsync -vzrtopg  --delete --exclude "logs/" --exclude "conf/ssl.*/" --progress backup@202.99.11.120::www /backup/www/ --password-file=/etc/rsync.pass
receiving file list ... done
./
1
785 (100%)
1.py
4086 (100%)
2.py
10680 (100%)
a
0 (100%)
ip
3956 (100%)
./
wrote 2900 bytes read 145499 bytes 576.34 bytes/sec
total size is 2374927 speedup is 45.34

对其它两个模块操作的命令分别为:

/usr/local/bin/rsync -vzrtopg  --delete --progress backup@202.99.11.120::web_user1 /backup/web_user1/ --password-file=/etc/rsync.pass

/usr/local/bin/rsync -vzrtopg  --delete --progress backup@202.99.11.120::web_user2 /backup/web_user2/ --password-file=/etc/rsync.pass

可以将客户命令通过crontab -e命令来实现自动备份,如crontab -e:

 

一些示例脚本
这里这些脚本都是rsync网站上的例子:

1、每隔七天将数据往中心服务器做增量备份

#!/bin/sh

# This script does personal backups to a rsync backup server. You will end up
# with a 7 day rotating incremental backup. The incrementals will go
# into subdirectories named after the day of the week, and the current
# full backup goes into a directory called "current"
# tridge@linuxcare.com

# directory to backup
BDIR=/home/$USER

# excludes file - this contains a wildcard pattern per line of files to exclude
EXCLUDES=$HOME/cron/excludes

# the name of the backup machine
BSERVER=owl

# your password on the backup server
export RSYNC_PASSWORD=XXXXXX


########################################################################

BACKUPDIR=`date +%A`
OPTS="--force --ignore-errors --delete-excluded --exclude-from=$EXCLUDES
--delete --backup --backup-dir=/$BACKUPDIR -a"

export PATH=$PATH:/bin:/usr/bin:/usr/local/bin

# the following line clears the last weeks incremental directory
[ -d $HOME/emptydir ] || mkdir $HOME/emptydir
rsync --delete -a $HOME/emptydir/ $BSERVER::$USER/$BACKUPDIR/
rmdir $HOME/emptydir

# now the actual transfer
rsync $OPTS $BDIR $BSERVER::$USER/current

2、备份至一个空闲的硬盘

#!/bin/sh

export PATH=/usr/local/bin:/usr/bin:/bin

LIST="rootfs usr data data2"

for d in $LIST; do
mount /backup/$d
rsync -ax --exclude fstab --delete /$d/ /backup/$d/
umount /backup/$d
done

DAY=`date "+%A"`

rsync -a --delete /usr/local/apache /data2/backups/$DAY
rsync -a --delete /data/solid /data2/backups/$DAY

3、对vger.rutgers.edu的cvs树进行镜像

#!/bin/bash

cd /var/www/cvs/vger/
PATH=/usr/local/bin:/usr/freeware/bin:/usr/bin:/bin

RUN=`lps x | grep rsync | grep -v grep | wc -l`
if [ "$RUN" -gt 0 ]; then
echo already running
exit 1
fi

rsync -az vger.rutgers.edu::cvs/CVSROOT/ChangeLog $HOME/ChangeLog

sum1=`sum $HOME/ChangeLog`
sum2=`sum /var/www/cvs/vger/CVSROOT/ChangeLog`

if [ "$sum1" = "$sum2" ]; then
echo nothing to do
exit 0
fi

rsync -az --delete --force vger.rutgers.edu::cvs/ /var/www/cvs/vger/
exit 0

FAQ
Q:如何通过ssh进行rsync,而且无须输入密码?
A:可以通过以下几个步骤

1. 通过ssh-keygen在server A上建立SSH keys,不要指定密码,你会在~/.ssh下看到identity和identity.pub文件
2. 在server B上的home目录建立子目录.ssh
3. 将A的identity.pub拷贝到server B上
4. 将identity.pub加到~[user b]/.ssh/authorized_keys
5. 于是server A上的A用户,可通过下面命令以用户B ssh到server B上了
e.g. ssh -l userB serverB
这样就使server A上的用户A就可以ssh以用户B的身份无需密码登陆到server B上了。

Q:如何通过在不危害安全的情况下通过防火墙使用rsync?
A:解答如下:

这通常有两种情况,一种是服务器在防火墙内,一种是服务器在防火墙外。无论哪种情况,通常还是使用ssh,这时最好新建一个备份用户,并且配置sshd仅允许这个用户通过RSA认证方式进入。 如果服务器在防火墙内,则最好限定客户端的IP地址,拒绝其它所有连接。如果客户机在防火墙内,则可以简单允许防火墙打开TCP端口22的ssh外发连接就ok了。

Q:我能将更改过或者删除的文件也备份上来吗?
A:当然可以:

你可以使用如:rsync -other -options -backupdir = ./backup-2000-2-13 ...这样的命令来实现。
这样如果源文件:/path/to/some/file.c改变了,那么旧的文件就会被移到./backup-2000-2-13/path/to/some/file.c,
这里这个目录需要自己手工建立起来

Q:我需要在防火墙上开放哪些端口以适应rsync?
A:视情况而定

rsync可以直接通过873端口的tcp连接传文件,也可以通过22端口的ssh来进行文件传递,但你也可以通过下列命令改变它的端口:

rsync --port 8730 otherhost::
或者
rsync -e 'ssh -p 2002' otherhost:

Q:我如何通过rsync只复制目录结构,忽略掉文件呢?
A:rsync -av --include '*/' --exclude '*' source-dir dest-dir

Q:为什么我总会出现"Read-only file system"的错误呢?
A:看看是否忘了设"read only = no"了

Q:为什么我会出现'@ERROR: invalid gid'的错误呢?
A:rsync使用时默认是用uid=nobody;gid=nobody来运行的,如果你的系统不存在nobody组的话,就会出现这样的错误,可以试试gid = nogroup或者其它

Q:绑定端口873失败是怎么回事?
A:如果你不是以root权限运行这一守护进程的话,因为1024端口以下是特权端口,会出现这样的错误。你可以用--port参数来改变。

Q:为什么我认证失败?
A:从你的命令行看来:

你用的是:
> bash$ rsync -a 144.16.251.213::test test
> Password:
> @ERROR: auth failed on module test
>
> I dont understand this. Can somebody explain as to how to acomplish this.
> All suggestions are welcome.

应该是没有以你的用户名登陆导致的问题,试试rsync -a max@144.16.251.213::test test

Debian下RPM包安装

[不指定 2004/12/28 23:59 | by ipaddr ]


1.

apt-get install alien

alien -i xxx.rpm 直接安装

alien -d xxx.rpm 生成Debian包

2.

apt-get install rpm

mkdir /var/lib/rpm

rpm --initdb

rpm -ivh xxx.rpm

3.

自运行:在RedHat里有chkconfig,ntsysv 工具,在Debian下,可以用rcconf

apt-get install rcconf

rcconf

配置启动选项。

APT and Dpkg 快速参考表

[不指定 2004/12/28 00:00 | by ipaddr ]
  来源:互联网

  普通 APT 用法

  apt-get install
  下载 以及所有倚赖的包裹,同时进行包裹的安装或升级.如果某个包裹被设置了 hold (停止标志,就会被搁在一边(即不会被升级).更多 hold 细节请看下面.

  apt-get remove [--purge]
  移除 以及任何倚赖这个包裹的其它包裹.
  --purge 指明这个包裹应该被完全清除 (purged) ,更多信息请看 dpkg -P .

  apt-get update
  升级来自 Debian 镜像的包裹列表,如果你想安装当天的任何软件,至少每天运行一次,而且每次修改了
  /etc/apt/sources.list 后,必须执行.

  apt-get upgrade [-u]
  升级所以已经安装的包裹为最新可用版本.不会安装新的或移除老的包裹.如果一个包改变了倚赖关系而需要安装一个新的包裹,那么它将不会被升级,而是标志为hold .apt-get update 不会升级被标志为 hold 的包裹 (这个也就是 hold 的意思).请看下文如何手动设置包裹为 hold .我建议同时使用 '-u' 选项,因为这样你就能看到哪些包裹将会被升级.

  apt-get dist-upgrade [-u]
  和 apt-get upgrade 类似,除了 dist-upgrade 会安装和移除包裹来满足倚赖关系.因此具有一定的危险性.

  apt-cache search
  搜索满足 的包裹和描述.

  apt-cache show
  显示 的完整的描述.

  apt-cache showpkg
  显示 许多细节,以及和其它包裹的关系.

  dselect
  console-apt
  aptitude
  gnome-apt
  APT 的几个图形前端(其中一些在使用前得先安装).这里 dselect 无疑是最强大的,也是最古老,最难驾驭.

  普通 Dpkg 用法
  dpkg -i
  安装一个 Debian 包裹文件;如你手动下载的文件.

  dpkg -c
  列出 的内容.

  dpkg -I
  从 中提取包裹信息.

  dpkg -r
  移除一个已安装的包裹.

  dpkg -P
  完全清除一个已安装的包裹.和 remove 不同的是, remove 只是删掉数据和可执行文件, purge 另外还删除所有的配制文件.

  dpkg -L
  列出 安装的所有文件清单.同时请看 dpkg -c 来检查一个 .deb 文件的内容.

  dpkg -s
  显示已安装包裹的信息.同时请看 apt-cache 显示 Debian 存档中的包裹信息,以及 dpkg -I 来显示从一个
  .deb 文件中提取的包裹信息.

  dpkg-reconfigure
  重新配制一个已经安装的包裹,如果它使用的是 debconf (debconf 为包裹安装提供了一个统一的配制界面).你能够重新配制 debconf 它本身,如你想改变它的前端或提问的优先权.例如,重新配制 debconf ,使用一个 dialog 前端,简单运行:

  dpkg-reconfigure --frontend=dialog debconf (如果你安装时选错了,这里可以改回来哟

  echo " hold" | dpkg --set-selections
  设置 的状态为 hlod (命令行方式)

  dpkg --get-selections ""
  取的 的当前状态 (命令行方式)

  支持通配符,如:
  Debian:~# dpkg --get-selections *wine*
  libwine hold
  libwine-alsa hold
  libwine-arts hold
  libwine-dev hold
  libwine-nas hold
  libwine-print hold
  libwine-twain hold
  wine hold
  wine+ hold
  wine-doc hold
  wine-utils hold

  例如:
  大家现在用的都是 gaim-0.58 + QQ-plugin,为了防止 gaim 被升级,我们可以采用如下方法:

  方法一:
  Debian:~# echo "gaim hold" | dpkg --set-selections
  然后用下面命令检查一下:
  Debian:~# dpkg --get-selections "gaim"
  gaim hold
  现在的状态标志是 hold,就不能被升级了.

  如果想恢复怎么办呢?
  Debian:~# echo "gaim install" | dpkg --set-selections
  Debian:~# dpkg --get-selections "gaim"
  gaim install
  这时状态标志又被重置为 install,可以继续升级了.

  同志们会问,哪个这些状态标志都写在哪个文件中呢?
  在 /var/lib/dpkg/status 里,你也可以通过修改这个文件实现 hold.

  有时你会发现有的软件状态标志是 purge,不要奇怪.
  如:事先已经安装了 amsn, 然后把它卸了.
  apt-get remove --purge amsn
  那么状态标志就从 install 变成 purge.

  方法二:
  在/etc/apt 下手动建一个 preferences 文件
  内容:
  Package: gaim
  Pin: version 0.58*
  保存
  更详细内容请看:
  http://linuxsir.com/bbs/showthread....;threadid=22601

  dpkg -S
  在包裹数据库中查找 ,并告诉你哪个包裹包含了这个文件.(注:查找的是事先已经安装的包裹)

  从源码建立deb packages

  apt-get source [-b]
  下载一个源码的包并解开。
  你必须在你的/etc/apt/sources.list文件里写入一条 deb-src 的记录才能完成这项工作。
  如果你输入了一个-b参数,并且是以root的身份,deb包会被自动的创建。

  apt-get build-dep
  自动下载并安装通过源码创建 时需要的包。
  只有apt 0.5以上版本才支持这个功能。
  现在woody和以上版本包含了这个功能。
  如果你使有一个旧版本的apt,查找依赖性最简单的方法是查看源码包中 debian/control 这个文件,
  注意这个路径是相对的,是包内的路径。

  普通的用法,结合 apt-get source -b,例子 (as root):

  apt-get build-dep
  apt-get source -b

  会下载源码包,建立依赖性,然后尝试编译源码。

  dpkg-source -x
  如果你手工下载了一个程序的源码包,其中包含了几个类似 .orig.tar.gz , .dsc ,
  以及 .diff.gz 之类的文件,
  那么你就可以对 .dsc 文件使用这个命令来 unpack 源码包。

  dpkg-buildpackage
  从 Debian 源码树建立一个deb包。你必须在source tree的主目录才能生效。例如:

  dpkg-buildpackage -rfakeroot -uc -b

  这里 '-rfakeroot' 指定命令使用 fakeroot 程序来模仿 root 权限 (来实现所有者(ownership)目的),
  '-uc' 表示 "Don't cryptographically sign the changelog", '-b' 代表只建立二进制包.

  debuild
  一个快速打包脚本类似 dpkg-buildpackage ,能自动的识别是否使用 fakeroot,
  同时为你运行 lintian 和 gpg

  修正倚赖关系

  dpkg --configure --pending
  如果dpkg在apt-get install upgrade dist-uptradeing 的时候出错退出,
  尝试使用此命令来配置已经unpack的包。
  然后再用 apt-get install ,upgrade, or dist-upgrade -f ,
  然后再用 apt-get install, upgrade, or dist-upgrade.

  可能会重复多次,这样通常可以解决大多数的依赖性问题。
  (同时,如果提示由于某种原因需要某个特定的包裹,你可以常识安装或卸载这个包)

  apt-get install -f
  apt-get upgrade -f
  apt-get dist-upgrade -f
  尝试修正上述过程中出现依赖性关系
  注意 apt-get install -f 不需要 作为参数。

Mysql双机数据同步

[不指定 2004/12/27 23:59 | by ipaddr ]
  mysql从3.23.15版本以后提供数据库复制功能。利用该功能可以实现两个数据库同步,主从模式,互相备份模式的功能。

  数据库同步复制功能的设置都在mysql的设置文件中体现。mysql的配置文件(一般是my.cnf)

  在unix环境下在/etc/mysql/my.cnf 或者在mysql用户的home目录下面的my.cnf。

  window环境中,如果c:根目录下有my.cnf文件则取该配置文件。当运行mysql的winmysqladmin.exe工具时候,该工具会把c:根目录下的my.cnf 命名为mycnf.bak。并在winnt目录下创建my.ini。mysql服务器启动时候会读该配置文件。所以可以把my.cnf中的内容拷贝到my.ini文件中,用my.ini文件作为mysql服务器的配置文件。

设置方法:
设置范例环境:
  操作系统:window2000 professional
  mysql:4.0.4-beta-max-nt-log
  A ip:10.10.10.22
  B ip:10.10.10.53
A:设置
  1.增加一个用户最为同步的用户帐号:
GRANT FILE ON *.* TO backup@'10.10.10.53' IDENTIFIED BY ‘1234'
  2.增加一个数据库作为同步数据库:
create database backup
B:设置
  1.增加一个用户最为同步的用户帐号:
GRANT FILE ON *.* TO backup@'10.10.10.22' IDENTIFIED BY ‘1234'
  2.增加一个数据库作为同步数据库:
create database backup


  主从模式:A->B
  A为master
  修改A mysql的my.ini文件。在mysqld配置项中加入下面配置:
server-id=1
log-bin
#设置需要记录log 可以设置log-bin=c:mysqlbakmysqllog 设置日志文件的目录,
#其中mysqllog是日志文件的名称,mysql将建立不同扩展名,文件名为mysqllog的几个日志文件。
binlog-do-db=backup #指定需要日志的数据库

  重起数据库服务。
  用show master status 命令看日志情况。

  B为slave
  修改B mysql的my.ini文件。在mysqld配置项中加入下面配置:
server-id=2
master-host=10.10.10.22
master-user=backup #同步用户帐号
master-password=1234
master-port=3306
master-connect-retry=60 预设重试间隔60秒
replicate-do-db=backup 告诉slave只做backup数据库的更新

  重起数据库
  用show slave status看同步配置情况。

  注意:由于设置了slave的配置信息,mysql在数据库目录下生成master.info
  所以如有要修改相关slave的配置要先删除该文件。否则修改的配置不能生效。

  双机互备模式。

  如果在A加入slave设置,在B加入master设置,则可以做B->A的同步。
  在A的配置文件中 mysqld 配置项加入以下设置:
master-host=10.10.10.53
master-user=backup
master-password=1234
replicate-do-db=backup
master-connect-retry=10

  在B的配置文件中 mysqld 配置项加入以下设置:
log-bin=c:mysqllogmysqllog
binlog-do-db=backup

  注意:当有错误产生时*.err日志文件。同步的线程退出,当纠正错误后要让同步机制进行工作,运行slave start

  重起AB机器,则可以实现双向的热备。

  测试:
  向B批量插入大数据量表AA(1872000)条
  A数据库每秒钟可以更新2500条数据。

Oracle/PHP 常见问题解答

[不指定 2004/12/25 23:53 | by ipaddr ]
文章来源:http://www.oracle.com/technology/global/cn/tech/opensource/php_faq.html

最近网站上要弄个论坛,

找了好久,发现,在PHP环境下,免费的,好用的论坛确实不多,最后决定用PHPBB.

上传程序,上传文件,安装,安装界面,一切很顺利,

最后发现,基本安装的PHPBB没有上传功能,:(,真是不如意呀。

后来,不得不安装了一个 Attachment Mod[2.0.10],还真烦琐,更新数据库,上传了一些新的文件,还更新了几十个文件,终于搞定。

后来网站编辑要求加一个精华功能,找了好久也没找到插件,原来国外的论坛,大多数都没有精华功能的,最后不得不手工改PHPBB,新增一个精华功能,以下是过程。



最近网站上要弄个论坛,

找了好久,发现,在PHP环境下,免费的,好用的论坛确实不多,最后决定用PHPBB.

上传程序,上传文件,安装,安装界面,一切很顺利,

最后发现,基本安装的PHPBB没有上传功能,:(,真是不如意呀。

后来,不得不安装了一个 Attachment Mod[2.0.10],还真烦琐,更新数据库,上传了一些新的文件,还更新了几十个文件,终于搞定。

后来网站编辑要求加一个精华功能,找了好久也没找到插件,原来国外的论坛,大多数都没有精华功能的,最后不得不手工改PHPBB,新增一个精华功能,以下是过程。

1.修改数据库

在Topics表格中新增一字段topic_pink  tinyint(1)  UNSIGNED 默认为0,为1时表示为精华帖。

2.改资源文件

includes/contants.php
          在define('POST_GLOBAL_ANNOUNCE', 3);后加入define('POST_PINK', 1);
language/lang_chinese_simplified/lang_main.php
          在$lang['Topic_Sticky'] = "置顶:";后加入$lang['Topic_Pink'] = "精华:";
          在$lang['Topics_Locked'] = "选择的主题已经成功的被锁定";后加入$lang['Topics_Pinked'] = "选择的主题已经成功的被设为精华";
          在$lang['Topics_Unlocked'] = "选择的主题已经成功的被解锁";后加入$lang['Topics_Unpinked'] = "选择的主题已经成功的取消精华";
templates/xxxxxx/viewforum_body.tpl
          在图示后面,加入精华帖的图示。
templates/xxxxxx/xxxx.cfg
          在$images['folder_sticky'] = "$current_template_images/folder_sticky.gif";
          后面加入$images['folder_pink'] = "$current_template_images/folder_pink.gif";
                      $images['folder_pink_new'] = "$current_template_images/folder_pink_new.gif";
templates/xxxxxx/images/
          做两个图标,folder_pink.gif:精华帖的图标,folder_pink_new.gif有新帖时的精华帖图标

3.实现显示

a.viewforum.php
     在$topic_type = $topic_rowset[$i]['topic_type'];后加入$topic_pink = $topic_rowset[$i]['topic_pink'];
     在
        else if( $topic_type == POST_STICKY )
       {
            $topic_type = $lang['Topic_Sticky'] . ' ';
       }
     后加入
       else if( $topic_pink == POST_PINK )
      {
           $topic_type = $lang['Topic_Pink'] . ' ';
      }
     在
      else if( $topic_rowset[$i]['topic_status'] == TOPIC_LOCKED )
     {
         $folder = $images['folder_locked'];
         $folder_new = $images['folder_locked_new'];
     }
     后加入
    else if( $topic_rowset[$i]['topic_pink'] == POST_PINK )
   {
        $folder = $images['folder_pink'];
        $folder_new = $images['folder_pink_new'];
   }

b.search.php
     在$topic_type = $searchset[$i]['topic_type'];后加入$topic_pink = $searchset[$i]['topic_pink'];
     在
        else if( $topic_type == POST_STICKY )
       {
            $topic_type = $lang['Topic_Sticky'] . ' ';
       }
     后加入
       else if( $topic_pink == POST_PINK )
      {
           $topic_type = $lang['Topic_Pink'] . ' ';
      }
     在
      else if( $searchset[$i]['topic_status'] == TOPIC_LOCKED )
     {
         $folder = $images['folder_locked'];
         $folder_new = $images['folder_locked_new'];
     }
     后加入
    else if( $searchset[$i]['topic_pink'] == POST_PINK )
   {
        $folder = $images['folder_pink'];
        $folder_new = $images['folder_pink_new'];
   }
  //注意,与viewforum.php有一点点不同,就是$searchset不同。

c.modcp.php
     在$topic_type = $row['topic_type'];后加入$topic_pink = $row['topic_pink'];
     在
        else if( $topic_type == POST_STICKY )
       {
            $topic_type = $lang['Topic_Sticky'] . ' ';
       }
     后加入
       else if( $topic_pink == POST_PINK )
      {
           $topic_type = $lang['Topic_Pink'] . ' ';
      }
     在
      else if( $row['topic_status'] == TOPIC_LOCKED )
     {
         $folder = $images['folder_locked'];
         $folder_new = $images['folder_locked_new'];
     }
     后加入
    else if( $row['topic_pink'] == POST_PINK )
   {
        $folder = $images['folder_pink'];
        $folder_new = $images['folder_pink_new'];
   }
  //注意,与search.php也有不同,就是$searchset[$i]变成了$row。

基本也就这三个地方要显示精华帖。改法都相似,就是在相应的地方加入一些语句

4.实现操作

实现设置精华和取消精华的操作,只需修改两个地方,

a.viewtopic.php增加一个操作界面(链接)
在148行的"$sql = "SELECT t.topic_id, t.topic_title, t.topic_status, "后面加入"t.topic_pink, ",从数据库里读取topic_pink字段,便于判断
在if ( $is_auth['auth_mod'] ) {}段里的$topic_mod .= ( $forum_topic_data['topic_status'] == TOPIC_UNLOCKED ) 行后面加入:
$topic_mod .= ( $forum_topic_data['topic_pink'] == POST_PINK ) ? "

b.修改modcp.php实现这个功能
1.在$unlock = ( isset($HTTP_POST_VARS['unlock']) ) ? TRUE : FALSE;加入
$pink = ( isset($HTTP_POST_VARS['pink']) ) ? TRUE : FALSE;$unpink = ( isset($HTTP_POST_VARS['unpink']) ) ? TRUE : FALSE;
2.在
else if ( $unlock )
{
 $mode = 'unlock';
}
后加入
else if ( $pink )
{
 $mode = 'pink';
}
else if ( $unpink )
{
 $mode = 'unpink';
}
3.在case 'unlock':.........break;那后面加上:
case 'pink':
 if ( empty($HTTP_POST_VARS['topic_id_list']) && empty($topic_id) )
 {
  message_die(GENERAL_MESSAGE, $lang['None_selected']);
 }

 $topics = ( isset($HTTP_POST_VARS['topic_id_list']) ) ?  $HTTP_POST_VARS['topic_id_list'] : array($topic_id);

 $topic_id_sql = '';
 for($i = 0; $i < count($topics); $i++)
 {
  $topic_id_sql .= ( ( $topic_id_sql != '' ) ? ', ' : '' ) . intval($topics[$i]);
 }

 $sql = "UPDATE " . TOPICS_TABLE . "
  SET topic_pink = 1
  WHERE topic_id IN ($topic_id_sql)
   AND forum_id = $forum_id
   AND topic_moved_id = 0";
 if ( !($result = $db->sql_query($sql)) )
 {
  message_die(GENERAL_ERROR, 'Could not update topics table', '', __LINE__, __FILE__, $sql);
 }

 if ( !empty($topic_id) )
 {
  $redirect_page = "viewtopic.$phpEx?" . POST_TOPIC_URL . "=$topic_id&sid=" . $userdata['session_id'];
  $message = sprintf($lang['Click_return_topic'], '', '');
 }
 else
 {
  $redirect_page = "modcp.$phpEx?" . POST_FORUM_URL . "=$forum_id&sid=" . $userdata['session_id'];
  $message = sprintf($lang['Click_return_modcp'], '', '');
 }

 $message = $message . '

' . sprintf($lang['Click_return_forum'], '

 $template->assign_vars(array(
  'META' => '')
 );

 message_die(GENERAL_MESSAGE, $lang['Topics_Pinked'] . '

' . $message);

 break;

case 'unpink':
 if ( empty($HTTP_POST_VARS['topic_id_list']) && empty($topic_id) )
 {
  message_die(GENERAL_MESSAGE, $lang['None_selected']);
 }

 $topics = ( isset($HTTP_POST_VARS['topic_id_list']) ) ?  $HTTP_POST_VARS['topic_id_list'] : array($topic_id);

 $topic_id_sql = '';
 for($i = 0; $i < count($topics); $i++)
 {
  $topic_id_sql .= ( ( $topic_id_sql != "") ? ', ' : '' ) . intval($topics[$i]);
 }

 $sql = "UPDATE " . TOPICS_TABLE . "
  SET topic_pink = 0
  WHERE topic_id IN ($topic_id_sql)
   AND forum_id = $forum_id
   AND topic_moved_id = 0";
 if ( !($result = $db->sql_query($sql)) )
 {
  message_die(GENERAL_ERROR, 'Could not update topics table', '', __LINE__, __FILE__, $sql);
 }

 if ( !empty($topic_id) )
 {
  $redirect_page = "viewtopic.$phpEx?" . POST_TOPIC_URL . "=$topic_id&sid=" . $userdata['session_id'];
  $message = sprintf($lang['Click_return_topic'], '', '');
 }
 else
 {
  $redirect_page = "modcp.$phpEx?" . POST_FORUM_URL . "=$forum_id&sid=" . $userdata['session_id'];
  $message = sprintf($lang['Click_return_modcp'], '', '');
 }

 $message = $message . '

' . sprintf($lang['Click_return_forum'], '

 $template->assign_vars(array(
  'META' => '')
 );

 message_die(GENERAL_MESSAGE, $lang['Topics_Unpinked'] . '

' . $message);

 break;
//可以拷贝lock那段的内容,将SQL语句和最后面的message_die()那句改改就可以了。

到此,基本完工了!

Mail图片生成

[不指定 2004/12/16 23:58 | by ipaddr ]


http://www.nhacks.com/email/index.php

输入Email地址,生成一个图片。

防止网上的邮件被机器人给收集。

一些实用的 Javascript 代码

[不指定 2004/12/16 23:58 | by ipaddr ]
oncontextmenu="window.event.returnvalue=false" 将彻底屏蔽鼠标右键
no 可用于Table


取消选取、防止复制

onpaste="return false" 不准粘贴

oncopy="return false;" oncut="return false;" 防止复制

IE地址栏前换成自己的图标

可以在收藏夹中显示出你的图标

关闭输入法

永远都会带着框架


防止被人frame
javascript>

网页将不能被另存为

value=查看网页源代码
onclick="window.location = 'view-source:'+ 'http://www.aspbiz.com">

取得控件的绝对位置

//javascript

function getIE(e){
var t=e.offsetTop;
var l=e.offsetLeft;
while(e=e.offsetParent){
t+=e.offsetTop;
l+=e.offsetLeft;
}
alert("top="+t+"\nleft="+l);
}


//VBScript


光标是停在文本框文字的最后

function cc()
{
var e = event.srcElement;
var r =e.createTextRange();
r.moveStart('character',e.value.length);
r.collapse(true);
r.select();
}

value="123" onfocus="cc()">

最小化、最大化、关闭窗口

value="Minimize">

value="Maximize">

value="Close">

value=最小化 onclick=hh1.Click()>
value=最大化 onclick=hh2.Click()>
value=关闭 onclick=hh3.Click()>

本例适用于IE

网站开发规范

[不指定 2004/12/16 23:57 | by ipaddr ]
(来源:互联网)

总 论

本规范既是一个开发规范,也是一个脚本语言参考,本规范并不是一个一成不变的必须严格遵守的条文,特殊情况下要灵活运用,做一定的变通。但是,请大家千万不要随意更改规范。如果有任何问题,请及时与我联系,我会及时更改本规范的相关代码样例和文档。



基 本 要 求

1. 在网站根目录中开设images common temp 三个子目录,根据需要再开设media 子目录,images目录中放不同栏目的页面都要用到的公共图片,例如公司的标志、banner 条、菜单、按钮等等;common 子目录中放css、js,、php、include 等公共文件;temp 子目录放客户提供的各种文字图片等等原始资料;media 子目录中放flash, avi, quick time 等多媒体文件 。  

2. 在根目录中原则上应该按照首页的栏目结构,给每一个栏目开设一个目录,根据需要在每一个栏目的目录中开设一个images 和media 的子目录用以放置此栏目专有的图片和多媒体文件,如果这个栏目的内容特别多,又分出很多下级栏目,可以相应的再开设其他目录。  

3. temp 目录中的文件往往会比较多,建议以时间为名称开设目录,将客户陆续提供的资料归类整理。  

4. 除非有特殊情况,目录、文件的名称全部用小写英文字母、数字、下划线的组合,其中不得包含汉字、空格和特殊字符;目录的命名请尽量以英文为指导,不到万不得已不要以拼音作为目录名称,经验证明,用拼音命名的目录往往连一个月后的自己都看不懂,  

脚 本 编 写  

我们应该有一个脚本整体风格一致的概念,意思是一个月后和一个月前的你写的脚本风格保持一致,以及同一个工作组中不同的开发人员编写的脚本风格保持一致,因为我们不可能永远孤立的开发,你随时都有可能和三个月前的自己合作(你的客户要求改版),也经常要和工作室中不同的同事共同开发一个项目,还有可能被要求修改已经离职人员开发的脚本,当然你自己也有可能会扔下一个项目给后来的同事。

1. Html 文件的通用模板:








其他meta 标 记


样式表定义

客户端javascript 函数定义及初始化操作


... ...


补充:
为了保证网站能够与下一代的web 语言xml 标准兼容,所有的HTML 标签的属性都要用单引号或者双引号括起,即我们应该写 而不 是 .

2. 允许全文检索的页面,为了使Internet 上的搜索引擎能够有效检索,在频道的首页的html的之间应该加入Keywords 和Description 元标记,例如 :





3. CSS 文件的格式样例代码 :



这里尤其要注意的是a:link a:visited a:hover a:actived 的排列顺序一定要严格照上面的样例代码,否则或多或少会出问题。另外我们规定重定义的最先,伪类其次,自定义最后,便于自己和他人阅读!

为了保证不同浏览器上字号保持一致,字号建议用点数pt和像素px来定义,pt一般使用中文宋体的9pt和11pt,px一般使用中文宋体12px 和14.7px 这是经过优化的字号,黑体字或者宋体字加粗时,一般选用11pt和14.7px 的字号比较合适。

在写 互相嵌套时,严格按照的规范,对于单独的一个 来说, 对齐, 缩进两个半角空格, 中如果还有嵌套的表格,也缩进两个半角空格,如果 中没有任何嵌套的表格, 结束标记应该与  处于同一行,不要换行,

如我们注意在源代码中不应有这样的代码:

 


而应该是这样的:
 

这是因为浏览器认为换行相当于一个半角空格,以上不规范的写法相当于无意中增加一个半角空格,如果确实有必要增加一个半角空格,也应该这样写:

 

属于同一个级别 的  
一定是左首对齐的,另外不允许没有任何内容的空的单元格存在,高度大于等于12px 的单元格应该 在  和  之间写一 个   如果高度小于12px, 则应该 在  和  之间插入一个1*1 大小的透明的gif 图片,这是因为某些浏览器认为空单元格非法而不会予以解释。如果代码顺序较乱,在DW3中可以通过command->apply souce formatting进行重新整理!

5. Width 和height 的写法也有统一的规范,一般情况下只有一列的表格,width 写在
的标签内,只有一行的表格,height 写在  的标签内,多行多列的表格,width 和height 写在第一行或者第一列的  标签内。总之遵循一条原则:不出现多于一个的控制同一个单元格大小的height 和width, 保证任何一个width 和height 都是有效的,也就是你改动代码中任何一个width 和height 的数值,都应该在浏览器中看到变化。做到这一条不容易,需要较长时间的练习和思考。


一 般 原 则

1. 在排布表格之前,请大家一定要好好思考一个最佳的方案,表格的嵌套尽量控制在三层以内,并且应该尽量避免 两个标记,经验表明,这两个标记会带来许多麻烦。

2. 一个网页要尽量避免用整个一张大表格,所有的内容都嵌套在这个大表格之内,因为浏览器在解释页面的元素时,是以表格为单位逐一显示,如果一张网页是嵌套在一个大表格之内,那么很可能造成的后果就是,当浏览者敲入网址,他要先面对一片空白很长时间,然后所有的网页内容同时出现。如果必须这样做,请使用  
标记,以便能够使这个大表格分块显示。

3. 排版中我们经常会遇到需要进行首行缩进的处理,不要使用   或者全角空格来达到效果,规范的做法是在样式表中定义 p { text-indent: 2em; } 然后给每一段加上
标记,注意,一般情况下,请不要省略

结束标记 。

4. 原则上,我们禁止用  来人为干预图片显示的尺寸,而且建议  标签中不要带上width 和height 两个属性,这是因为制作过程中,图片往往需要反复的修改,这样可以避免人为干预图片显示的尺寸,尽可能的发挥浏览器自身的功能;但是这样的一个副作用是当网页还未加载图片时,不会留出图片的站位大小,可能会造成网页在加载过程中抖动(如果图片是插在一个固定大小的表格里的,不会有这个现象),尤其是当图片的尺寸较大时,这种现象会很明显,所以当预料到这种会明显导致网页抖动的情况会发生时,请大家务必在最后给 附上 width 和 height 属性。

5. 为了最大程度的发挥浏览器自动排版的功能,在一段完整的文字中请尽量不要使用
来人工干预分段。

6. 不同语种的文字之间应该有一个半角空格,但避头的符号之前和避尾的符号之后除外汉字之间的标点要用全角标点,英文字母和数字周围的括号应该使用半角括号。

7. 所有的字号都应该用样式表来实现,禁止在页面中出现 标记。

8. 请不要在网页中连续出现多于一个 的   也尽量少使用全角空格(英文字符集下,全角空格会变成乱码),空白应该尽量使用 text-indent, padding, margin, hspace, vspace 以及透明的gif 图片来实现。

9. 中英文混排时,我们尽可能的将英文和数字定义为verdana 和arial 两种字体。

10. 行距建议用百分比来定义,常用的两个行距的值是line-height:120%/150%.

11. 网站中的路径全部采用相对路径,一般链接到某一目录下的缺省文件的链接路径不必写全名,如我们不必这样: 而应该这样:

12、嵌入图形文本的使用较大的字体,建议不要在图形中包括文本。

13、"网页大小"定义为网页的所有文件大小的总和,包括HTML文件和所有的嵌入的对象。用户喜欢快的而不是新奇的站点。对于解调器用户,网页大小保持在34K以下为合适。  

文 件 命 名 原 则

1. 每一个目录中应该包含一个缺省的html 文件,文件名统一用index.htm

2. 件名称统一用小写的英文字母、数字和下划线的组合。

3. 命名原则的指导思想一是使得你自己和工作组的每一个成员能够方便的理解每一个文件的意义,二是当我们在文件夹中使用"按名称排例"的命令时,同一种大类的文件能够排列在一起,以便我们查找、修改、替换、计算负载量等等操作 。

4. 下面以"新闻"(包含"国内新闻"和"国际新闻")这个栏目来说明html 文件的命名原则 :

☆ 在根目录下开设news目 录

☆ 第一条缺省新闻取名index.htm

☆ 所有属于"国内新闻"的新闻依次取名为:china_1.htm, china_2.htm, ...

☆ 所有属于"国际新闻"的新闻依次取名为:internation_1.htm, internation _2.htm, ...

☆ 如果文件的数量是两位数,请将前九个文件命名为:china_01.htm, china_02.htm 以保证所有的文件能够在文件夹中正确排序。

5. 图片的命名原则遵循以下几条规范 :

☆ 名称分为头尾两两部分,用下划线隔开。

☆ 头部分表示此图片的大类性质,例如广告、标志、菜单、按钮等等 。

☆ 一般来说:

放置在页面顶部的广告、装饰图案等长方形的图片我们取名:banner
标志性的图片我们取名为:logo
在页面上位置不固定并且带有链接的小图片我们取名为button
在页面上某一个位置连续出现,性质相同的链接栏目的图片我们取名:menu
装饰用的照片我们取名:pic
不带链接表示标题的图片我们取名:title
依照此原则类推。

☆ 尾部分用来表示图片的具体含义。

☆ 下面是几个样例,大家应该能够一眼看明白图片的意义:
banner_sohu.gif banner_sina.gif menu_aboutus.gif menu_job.gif title_news.gif logo_police.gif logo_national.gif pic_people.jpg pic_hill.jpg.
目录建立的原则:以最少的层次提供最清晰简便的访问结构。

根目录。
根目录指DNS域名服务器指向的索引文件的存放目录。
服务器的ftp上传目录默认为html
 
根目录文件
根目录只允许存放index.html和main.html文件,以及其他必须的系统文件。
 
每个语言版本存放于独立的目录。已有版本语言设置为:
简体中文 \gb
繁体中文 \big5
英 语 \en
日 语 \jp

每个主要功能(主菜单)建立一个相应的独立目录。

根目录下的images为存放公用图片目录,每个目录下私有图片存放于各自独立images目录.
例如:\menu1\images
     \menu2\images

所有的js文件存放在根目录下统一目录\script
所有的CSS文件存放在根目录下的style目录
所有的CGI程序存放在根目录并列目录\cgi_bin目录
head区是指首页HTML代码的和之间的内容。
必须加入的标签

1.公司版权注释

2.网页显示字符集
简体中文:
繁体中文:
英 语:

3.网页制作者信息
webmaster@maketown.com">

4.网站简介


5.搜索关键字


6.网页的css规范

(参见目录及命名规范)

7.网页标题


.可以选择加入的标签

1.设定网页的到期时间。一旦网页过期,必须到服务器上重新调阅。


2.禁止浏览器从本地机的缓存中调阅页面内容。


3.用来防止别人在框架里调用你的页面。


4.自动跳转。

5指时间停留5秒。

5.网页搜索机器人向导.用来告诉搜索机器人哪些页面需要索引,哪些页面不需要索引。

CONTENT的参数有all,none,index,noindex,follow,nofollow。默认是all。

6.收藏夹图标


所有的javascript的调用尽量采取外部调用.


附标签:
标签不属于head区,这里强调一下,为了保证浏览器的兼容性,必须设置页面背景
网站文件命名规范


文件命名的原则:以最少的字母达到最容易理解的意义。

索引文件统一使用index.html文件名(小写)
index.html文件统一作为"桥页",不制作具体内容,仅仅作为跳转页和meta标签页。主内容页为main.html

按菜单名的英语翻译取单一单词为名称。例如:
关于我们 \aboutus
信息反馈 \feedback
产    品 \product
所有单英文单词文件名都必须为小写,所有组合英文单词文件名第二个起第一个字母大写;
所有文件名字母间连线都为下划线

图片命名原则以图片英语字母为名。大小原则写同上。
例如:网站标志的图片为logo.gif
鼠标感应效果图片命名规范为"图片名+_+on/off"。
例如:menu1_on.gif/menu1_off.gif

五. 其它文件命名规范
1.js的命名原则以功能的英语单词为名。
例如:广告条的js文件名为:ad.js
2.所有的CGI文件后缀为cgi
所有CGI程序的配置文件为config.cgi
网站项目管理规范手册


一.概念

网站项目管理就是根据特定的规范、在预算范围内、按时完成的网站开发任务。

二.需求分析

项目立项

我们接到客户的业务咨询,经过双方不断的接洽和了解,并通过基本的可行性讨论够,初步达成制作协议,这时就需要将项目立项。较好的做法是成立一个专门的项目小组,小组成员包括:项目经理,网页设计,程序员,测试员,编辑/文档等必须人员。项目实行项目经理制。

客户的需求说明书

第一步是需要客户提供一个完整的需求说明。很多客户对自己的需求并不是很清楚,需要您不断引导和帮助分析。曾经有一次,我问客户:"您做网站的目的是什么?"他回答:"没有目的,只是因为别人都有,我没有!"。这样的客户就需要耐心说明,仔细分析,挖掘出他潜在的,真正的需求。 配合客户写一份详细的,完整的需求说明会花很多时间,但这样做是值得的,而且一定要让客户满意,签字认可。把好这一关,可以杜绝很多因为需求不明或理解偏差造成的失误和项目失败。糟糕的需求说明不可能有高质量的网站。那么需求说明书要达到怎样的标准呢?简单说,包含下面几点:
1.正确性:每个功能必须清楚描写交付的功能;
2.可行性:确保在当前的开发能力和系统环境下可以实现每个需求;
3.必要性:功能是否必须交付,是否可以推迟实现,是否可以在削减开支情况发生时"砍"掉;
4.简明性:不要使用专业的网络术语;
5.检测性:如果开发完毕,客户可以根据需求检测。

三.系统分析

网站总体设计

在拿到客户的需求说明后,并不是直接开始制作,而是需要对项目进行总体设计,详细设计,出一份网站建设方案给客户。总体设计是非常关键的一步。它主要确定:
1.网站需要实现哪些功能;
2.网站开发使用什么软件,在什么样的硬件环境;
3.需要多少人,多少时间;
4.需要遵循的规则和标准有哪些。

同时需要写一份总体规划说明书,包括:
1.网站的栏目和版块;
2.网站的功能和相应的程序;
3.网站的链接结构;
4.如果有数据库,进行数据库的概念设计;
5.网站的交互性和用户友好设计。

网站建设方案

在总体设计出来后,一般需要给客户一个网站建设方案。很多网页制作公司在接洽业务时就被客户要求提供方案。那时的方案一般比较笼统,而且在客户需求不是十分明确的情况下提交方案,往往和实际制作后的结果会有很大差异。所以应该尽量取得客户的理解,在明确需求并总体设计后提交方案,这样对双方都有益处。网站建设方案的包括以下几个部分:
1.客户情况分析;
2.网站需要实现的目的和目标;
3.网站形象说明;
4.网站的栏目版块和结构;
5.网站内容的安排,相互链接关系;
6.使用软件,硬件和技术分析说明;
7.开发时间进度表;
8.宣传推广方案;
9.维护方案;
10.制作费用;
11.本公司简介:成功作品,技术,人才说明等。

当您的方案通过客户的认可,那么恭喜你!您可以开始动手制作网站了。但还不是真正意义上的制作,你需要进行详细设计:

网站详细设计

总体设计阶段以比较抽象概括的方式提出了解决问题的办法。详细设计阶段的任务就是把解法具体化。详细设计主要是针对程序开发部分来说的。但这个阶段的不是真正编写程序,而是设计出程序的详细规格说明。这种规格说明的作用很类似于其他工程领域中工程师经常使用的工程蓝图,它们应该 包含必要的细节,例如:程序界面,表单,需要的数据等。程序员可以根据它们写出实际的程序代码。

四. 项目实施

整体形象设计

在程序员进行详细设计的同时,网页设计师开始设计网站的整体形象和首页。
整体形象设计包括标准字,Logo,标准色彩,广告语等。 首页设计包括版面,色彩,图像,动态效果,图标等风格设计,也包括banner,菜单,标题,版权等模块设计。首页一般设计1-3个不同风格,完成后,供客户选择。
     记住:在客户确定首页风格之后,请客户签字认可。以后不得再对版面风格有大的变动,否则视为第二次设计。

开发制作
到这里,程序员和网页设计师同时进入全力开发阶段,需要提醒的是,测试人员需要随时测试网页与程序,发现Bug立刻记录并反馈修改。不要等到完全制作完毕再测试,这样会浪费大量的时间和精力。项目经理需要经常了解项目进度,协调和沟通程序员与网页设计师的工作。

调试完善

在网站初步完成后,上传到服务器,对网站进行全范围的测试。包括速度,兼容性,交互性,链接正确性,程序健壮性,超流量测试等,发现问题及时解决并记录下来。
为什么要记录文档呢?其实本软件工程本身就是一个文档,是一个不断充实和完善的标准。通过不断的发现问题,解决问题,修改,补充文档,使这个标准越来越规范,越来越工业化。进而使得网站开发趋向规范,趋向合理。

宣传推广

宣传推广的基本方法有:
1.网页里设置适当的META标签;
2.各搜索引擎登录;
3.准备新闻稿件在各新闻公告板发表;
4.合理使用Email邮件列表;
5.广告条交换;
6.付费广告。
至此,网站项目建设完毕,将有关网址,使用操作说明文档等提交客户验收。如果需要维护,另行签定维护项目。

维护

网站成功推出后,长期的维护工作才刚刚开始,我们需要做到的是
1.及时响应客户反馈;例如可以采取Email自动回复功能,然后在1-3个工作日里解决问题,再次回复;
2.网站流量统计分析和相应对策;
3.尽量推广和使用您的网址;
4.网站内容的及时更新和维护。

五.遵循的规范

1.网站建设目录规范
2.网站文件命名规范
3.网站建设尺寸规范
4.网站首页head区代码规范
5.网站连接结构规范
网站建设尺寸规范

页面标准按800*600分辨率制作,实际尺寸为778*434px
1024*768分辨率实际尺寸为:1002*603PX

页面长度原则上不超过3屏,宽度不超过1屏

每个标准页面为A4幅面大小,即8.5X11英寸

全尺寸banner为468*60px,半尺寸banner为234*60px,小banner为88*31px

另外120*90,120*60也是小图标的标准尺寸

每个非首页静态页面含图片字节不超过60K,全尺寸banner不超过14K
 

AWStats分析Apache日志

[不指定 2004/12/16 23:56 | by ipaddr ]


Awstats是一个很好的日志分析工具,开源,速度快,跨平台....

AWstats的官方网站是:http://awstats.sourceforge.net/

安装步骤:

1.下载:

去官方网站下载awstats-6.2.tgz

2.解压安装

#tar zxvf awstats-6.2.tgz
#mv awstats-6.2 /usr/local/apache2/site/stat

3.配置一虚拟主机(将stat.xxx.com指向服务器)

#vi /usr/local/apache2/conf/httpd.conf

加入:


ServerName stat.xxxx.com
DocumentRoot /usr/local/apache2/site/stat

 Options FollowSymLinks
 AllowOverride None
 Order allow,deny
 Allow from all


 Options +ExecCGI



4.配置awstats
#cd  /usr/local/apache2/site/stat/cgi-bin/
#mv awstats-model.conf awstats.conf
#vi awstats.conf
LogFile="/var/log/httpd/access%YY-24%MM-24%DD-24.log"
SiteDomain="xxxx"
DirData="/usr/local/apache2/site/stat/data"
//Apache日志由cronolog轮巡放在/var/log/httpd下面
//mkdir /usr/local/apache2/site/stat/data
//chown apache.apache /usr/local/apache2/site/stat/date

5.测试
运行/usr/local/apache2/site/stat/cgi-bin/awstats.pl -update -config=xxxx
访问:http://stat.xxxx.com/cgi-bin/awstats.pl


6.每天更新统计
vi /etc/crontab
30 2 * * * root /usr/local/apache2/site/stat/cgi-bin/awstats.pl -update -config=xxxx


7.如果访问统计比较重要,不可以公开,可以用Apache认证。

8.哪果访问里,显示的是PERL源文件,则需要设置Apache:

AddHandle cgi-script .pl



分页: 1/3 第一页 1 2 3 下页 最后页 [ 显示模式: 摘要 | 列表 ]