如何在Windows上同步静态网页文件到Linux服务器

记录搭建网页时用rsync同步文件的方法,以及权限控制的管理

假如你正在运作一个静态网页,大部分情况下,为了保持服务器的环境轻便,会选择本地(以Windows为例)上先build出来再上传到服务器上。这样一来就不得不考虑如何同步文件了。

一开始我用的是 scp ,它的命令很简单而且很常用:

1
scp -r public/* user@yourdomain:/var/www/yoursite/

但是我并不推荐使用 scp ,首先它每次都只是全量复制,把本地的文件全部重新上传一次,并不能删除已经弃用或过时的文件。所以实际上它不能实现真正的同步。

其次它对于文件的权限处理也有点问题,可能是跨平台传输的问题,如下所示:

1
2
3
4
5
6
7
8
9
web@light-ecs:~/site$ ll
total 116
drwx---r-x 16 web web  4096 Mar 29 02:11 .
drwxrwxr-x  3 web web  4096 Mar 29 02:11 ..
-rw-rw-r--  1 web web 13550 Mar 29 02:11 404.html
drwx---rwx  2 web web  4096 Mar 29 02:11 archives
drwx---rwx  4 web web  4096 Mar 29 02:11 categories
drwx---rwx 10 web web  4096 Mar 29 02:11 en
...

虽然这样上传上去是能用的,因为默认情况下其他用户有可读权限。但这不是一个好习惯。推荐的做法一般是有明确的权限管理,例如一个专门的用户来管理网页文件,拥有读写权限,然后让web服务器的用户(nginx的话就是www-data)拥有只读权限,其他用户则没有任何权限。

如果要实现上面这些需求,一般会使用Linux自带的 rsync ,但如果要在Windows上用的话好像只能装 cwRsync 或者 WSL (Windows Subsystem for Linux)。

配置远程权限

假设管理网页的用户是 web ,web server用户是 www-data 。需要先把 web 加进 www-data 的组,否则组权限会有问题。

1
sudo usermod -aG www-data web

然后修改目录的owner和mode:

1
2
3
4
web@light-ecs:/var/www$ sudo mkdir yoursite
web@light-ecs:/var/www$ sudo chown web:www-data yoursite
web@light-ecs:/var/www$ sudo chmod 750 yoursite
web@light-ecs:/var/www$ sudo chmod g+s yoursite

g+ssetgid 位,能保证新文件和目录会继承父目录的组而不是创建者的默认组。这一步不是必要的但是推荐这么做。

配置完成后,就可以回到Windows上了。

cwRsync

cwRsync 是 rsync 在 Windows 上的实现版本,算法和 rsync 一样。

在GitHub上下载并解压它,就可以使用了。同步脚本示例:

1
2
3
4
5
6
7
8
9
$RsyncPath = "path\to\cwrsync_6.4.7_x64_free\bin\rsync.exe"
$SSHPath = "path\to\cwrsync_6.4.7_x64_free\bin\ssh.exe"
$LocalDir = "//?/path/to/your/page/"

& $RsyncPath -avz `
-e "$SSHPath" --delete `
--chmod=D2750,F640 `
$LocalDir `
user@yourdomain:/var/www/yoursite/

因为环境变量里一般已经有openssh的ssh.exe了,所以这里不将cwRsync的路径添加到环境变量里,而是用绝对路径来调用。出于某种未知原因,这里要用 -e 来显式指定它应该使用的ssh,并且上传路径需要加上 //?/ 前缀,否则会被判断为一个远程主机。

--delete 用来删除多余文件, --chmod 用来显式指定目录和文件的权限,其中目录的 2 就是 setgid 位。

WSL

WSL 会更简单,如果你有需求的话装一个也不麻烦。

同步命令示例:

1
2
3
4
5
wsl rsync -avz `
--delete `
--chmod=D2750,F640 `
./public/ `
user@yourdomain:/var/www/yoursite/
comments powered by Disqus