使用 rsync 或 unison 备份或同步支持 ssh 的 web 主机

2010/01/07 | 15:11 | 分类:Web与移动平台 | 标签: | 1,450次阅读

  使用 web 主机而非 VPS 的站长,站点的备份或同步常常是一个问题。很多站点只能使用 ftp 做单向备份,基于较弱的元信息来判定文件是否需要重新下载,缺乏校验、压缩、增量传输等高级特性。有的服务商在 web 控制面板中提供备份功能,或允许上传简单的 cron 脚本,但这些途径通常只适合备份整站或指定目录,而不方便以增量方式传输更新过的内容。Linux 下成熟的镜像同步工具是 rsync,如果你的 web 主机允许 ssh 登录,则可以考虑使用 rsync 或其它类似工具。
  网上有很多说法认为 web 主机不允许跑 daemon、不允许开自定义端口,故而无法使用 rsync。其实不然,rsync 可以仅通过 ssh 连接而不需要开放额外的端口,服务端也可以借助 sshd 来启动而不需要作为 daemon 运行。我们需要的只是 ssh 登录以及运行自己上传的程序的权限。我使用的 Godaddy Economy Plan Hosting (Linux) 即属于这种情况。
  Godaddy 的 web 主机不提供 rsync 程序,我们可以从本地上传一个。需要注意上传的 rsync 二进制文件应该与你的 web 主机的平台一致,连接 libc、libpopt 等库的版本一致。对于使用 x86 版 CentOS 5.2 的 Godaddy 主机,我也直接在相同版本的 CentOS 中提取了一个 rsync 上传。这时,在客户端使用“-e”参数指定连接方式为 ssh,用“--rsync-path”参数指定服务端 rsync 所在的位置,即可借助 ssh 连接传输数据了。

  1. rsync -vzrtopgl --progress --delete -e ssh --rsync-path=/[remote_home_dir]/bin/rsync [username]@[hostname]:/[remote_home_dir]/html/ /[local_home_dir]/

  如果客户端为 Windows,则可以使用 Win32 下移植的 cwRsync,这个工具基于 cygwin 库但不需要安装整个 cygwin 环境,它同时包含了 Win32 版的 OpenSSH 客户端。上述命令无须修改即可在 Windows 下运行。
  rsync 解决了文件的单向的备份或镜像功能,但如果需要双向同步,更适合的工具是 unison。unison 使用 OCaml 语言开发,基于 rsync 算法对两端文件进行比较,将它们更新到一致的状态(最新的、不冲突的版本)。unison 可借助 socket、ssh 等连接方式,并支持多种操作系统。与 rsync 类似,我们需要向 web 主机上传一个 unison 二进制文件。官方只提供了最新版的源代码,需要自行下载到本地编译(事先安装 OCaml 编译器及 etags 工具)。服务端部署之后,客户端配置文件([config_name].prf)为:

  1. root = /[local_home_dir]/html/
  2. root = ssh://[username]@[hostname]//[remote_home_dir]/html/
  3. servercmd = /[remote_home_dir]/bin/unison

  在客户端执行 ./unison [config_name] 即可完成双向同步。注意 unison 要求服务端和客户端的主次版本号一致。
  如果客户端为 Windows,同样可以使用来自 cwRsync 的 ssh 命令。如果嫌这个 ssh 外加 cygwin 库的体积太大(~5M),另一种替代的方案是使用 Putty 提供的 Plink 工具。这是一个小巧的 Win32 ssh 客户端(276K),由于运行参数与 OpenSSH 不同,因此需要写一个批处理文件(ssh.bat)来封装:

  1. @Plink.exe [hostname] -l [username] -pw [password] "/[remote_home_dir]/bin/unison -server"

  并在 unicon 配置文件中指定 ssh 命令:

  1. sshcmd = ssh.bat

  此时运行 unicon,即可使用 Plink 进行 ssh 连接。
  无论使用 OpenSSH 的 ssh 还是 Putty 的 Plink,都可以借助公钥认证方式避免密码的输入。这样有利于定时备份和同步的自动化执行。具体方法不再赘述。

中文域名鸡肋体验

2009/05/14 | 20:34 | 分类:Web与移动平台 | 标签: | 1,243次阅读

  本月,“.中国”域名正式写入全球根域名系统。我赞同很多网评的观点,不看好“.中国”域名的发展。不过我仍然进行了一项保护性注册(林健.中国 / 林健.cn),借机研究一下多语种域名(IDN)的特性。
  “.中国”域名目前只有国内的代理商可以注册,不过即使将来国外有了代理商,意义也不大,因为“.cn”、“.中国”的生杀大权还是掌握在国内监管机构手中。之前的一些经历告诉我,那些国内代理商不过是半斤八两。但这次通过新网注册,我感觉被忽悠的程度比以前更严重。在新网注册的“.中国”域名不能修改DNS解析条目,只能设置URL转发。我开始还以为自己没有找到设置的地方,打客服电话(010-58022233)才确认确实没有。可笑的是,客服人员给我的解释是“技术上不可行”。我们知道IDN只是使用Punycode编码了Unicode字符,在DNS服务器端根本不需要什么技术上的变化。难道是有什么政策原因吗?我没有问出来,也没有查到,但从CNNIC的这个介绍来看,不像是要限制用户自己做解析。新网在这个问题上有误导,它没有明文说明它对中文域名和英文域名服务的区别,在中文域名帮助页面又提到:中文域名可以指向其它站点、可以用于电子邮件,很容易使人认为新网自己提供了可配置的DNS解析服务。但要追究起来我也没辙,因为它在网站上确实说的是中文域名固有的性质,而不是新网提供的服务;至于DNS解析,一般用户默认代理商会提供,而如果它没有提供,似乎也没违反什么法规条款。找不到什么十足的理由,我也只能忍了。好在域名的DNS服务器还是允许修改的(如果连这个都不允许,我真的要去讨个说法了),我换一个还不成?试验了一下,发现Godaddy的Off-site DNS不允许添加IDN,而zoneedit允许后缀为“.cn”的IDN,但不接受“.中国(.xn--fiqs8s)”后缀。我猜它们不会是因为政策不允许,也许就是在域名合法性验证的时候没有考虑IDN或IDN后缀吧。不过作为本土服务商的中国E动网倒是支持的,我选择使用它的免费域名解析服务(测试:http://文件.林健.中国)。
  CNNIC的称“超过80%的网民已经可以使用‘.中国’域名访问互联网”但我测试了一些DNS,并让帮忙同学实验,发现还是有很多DNS服务器没有“.中国”的记录。也许是因为我的调查范围局限于教育网和科技网?换了一个北京联通的DNS(202.106.196.115)是好使的。
  在服务商支持方面,Godaddy的空间可以绑定IDN(测试:http://test.林健.中国),而Google Apps暂不支持。Windows Live Admin Center也可以绑定IDN开通电子邮件服务,但可能由于它那里的DNS中还没有“.中国”记录,MX验证无法通过,只有“.cn”的地址可用(可以给我发邮件试试:文件@林健.cn)。因此如果想拿中文域名开服务,还是查查自己的服务商有没有限制。
  客户端方面,IE、Firefox、Chrome、Safari、Opera等主流浏览器都支持Unicode自动转换为Punycode。而邮件客户端方面,邪恶的Foxmail会干这件事,Outlook、Windows Live Mail、Koomail等不支持。主流免费邮箱中,我还没有发现哪一家的web界面可以自动转换Punycode。有趣的是中国移动139邮箱在发送的时候虽然不能自动转换Punycode,但收到来自“xn--5nqy36c@xn--nyq587c.cn”的邮件,却可以自动转换为“文件@林健.cn”显示。
  体验的结果:我对中文域名的看法没有改变,对IDN的机制和现状有了进一步的了解。中文域名在现阶段估计也只适合保护性注册,难以被用户接受,因此也难以投入商用。其主要原因:URL已经不是当今互联网的主要入口了,搜索引擎等模式日趋成为主导。尽管我认为这个趋势是反REST原理的,但是用户的习惯、市场的走势总会使得技术不得不低下头。在web技术因为不断的渐进性扩充而变得臃肿,偏离了最初的原则时,也许下一代互联网交互模型就快诞生了。
  (本文中出现的测试用子域名和邮箱不保证长期有效)

Godaddy Economy Plan Hosting SSH 体验

2009/04/18 | 12:11 | 分类:Web与移动平台 | 标签: | 2,998次阅读

  我使用的是 Godaddy 的 Economy Plan Hosting (Linux) + Dedicated IP。它以前是不支持 SSH 登录管理的,不久前听说 SSH 服务已经可用,我随即开通。简单说一下试用情况。
  开通 SSH 的方法很简单。首先备份数据库,因为开通 SSH 需要将文件和数据库迁移到另一台服务器上。可以使用 Godaddy 提供的数据库备份服务(Hosting - My Hosting Account - Manage Account - Databases - MySQL,点击数据库名右边的小铅笔图标,在之后的界面就有 Backup 和 Restore 的选项),这样可以突破 phpMyAdmin 的导入/导出文件大小限制。至于主机上的文件,Godaddy 会自动迁移,不过为了保险起见建议使用 FTP 自行备份到本地,因为数据库的备份也保存在 html 目录中。备份完成之后即可在 Hosting - My Hosting Account - Manage Account - Settings - SSH 中开通 SSH 服务。开通的过程需要电话验证:填写电话号码,很快会收到一个美国长途,播出一串数字,将它们填写在网页上即可验证通过。之后需要等待若干时间,待文件迁移到新的服务器上,然后手工重建数据库并恢复原备份数据。Godaddy 会自动修改 DNS 记录以指向新的服务器 IP(但二级域名的 A 记录它没有自动帮我修改)。这时便可以使用 SSH 客户端登录了,IP、用户名、密码同 Hosting 设置。
  Economy Plan Hosting 的 SSH 自由度当然没有 Virtual Dedicated Server 的大了。首先,没有 root 权限,想开个 IPv6 隧道都不行。其次,实用程序缺一些,我的这个服务器上什么 locate、man、gcc、dig、telnet、ftp、w3m 都没有,ping 和 ssh 也没有执行权限;然而一些不怎么常用(或许在 web 开发中有用)的程序倒有一些,比如 tiff2rgba、icctrans;自己上传程序是可以的,不过要搞定动态链接库等系统依赖可能会费些周折。再次,防火墙屏蔽了 HTTP、FTP 等常规服务之外的端口,不能跑一些非 web 接口的程序或服务;我试验运行一些自己上传的二进制或 python 网络工具,却被告知 socket error: Operation not permitted。最后,sshd 的设置也比较保守,不允许 TCP 端口转发等。
  那么用户可以拿 SSH 做什么呢?我想至少可以做以下工作:1.文件管理:把私有文件转移到 html 之外的目录,通过 sftp/scp 将 10G 空间用做网盘;可以方便地压缩、解压文件,弥补 web 文件管理器和 FTP 的不足。2.数据库管理:mysql 命令行比 phpMyAdmin 灵活很多,至少没有导入/导出文件大小限制。3.使用 bash、php、python、ruby、perl 脚本做一些事:由于上述诸多限制,我们只能使用 web 接口。好在有 wget 和 curl 可用,让 bash 脚本也能有 web 输入;输出就是 html 目录,可以对用户直接呈现 web 或提供 REST API。可以使用 nohup 方式在后台跑自己的脚本,同时能够在 Hosting - My Hosting Account - Manage Account - Content - Processes 界面管理进程。当然,用脚本实时监控火车票转让信息之类的私事也可以干,不过推送信息恐怕只能用 twitter 之类提供 REST API 了。4.cron 计划任务:可以直接编辑自己的 crontab,也可以在 Hosting - My Hosting Account - Manage Account - Content - Cron Manager 界面增删 cron 作业,跑一些周期性任务,比如数据备份。这里支持 E-mail 发送作业输出文本,但执行周期最短是一个小时,恐怕用它是抢不到火车票的 :) 。上述两种后台服务方式可以结合使用,各取所长。
  总之可以看出,这个 SSH 只是用来辅助管理和维护 web 的,Godaddy 不允许用户把 web 服务器当作其它服务器使用,不希望它的主机成为用户学习 Linux 和网络配置的平台,也不能容忍它的服务器作为用户进行其它活动的代理或跳板。但只要有脚本语言的存在,我们就可以尽可能发挥想象,榨取 Godaddy Economy Plan Hosting 的每一滴油水。