WindowsからLinuxサーバに静的ウェブページを同期する方法

ウェブサイト構築時にrsyncでファイルを同期する方法と、権限管理についてのメモです。

静的ウェブサイトを運営しているなら、多くの場合はサーバ側にツールチェーンを入れず、まずWindows上でビルドしてからアップロードするのが便利です。そうなると、ファイルの同期方法を考える必要があります。

最初に試したのは 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
...

他のユーザーにも読み権限が付いてしまうから、動かないことはないですが、推奨される状態ではありません。一般的には、専用のユーザーでウェブサイトファイルを管理し、そのユーザーには読み書き権限を付与、ウェブサーバ側ユーザー(nginxなら www-data)には読み取りのみ、他のユーザーはアクセスなし、という権限管理が望ましいです。

このような設定を実現するにはLinuxの rsync が便利です。Windowsから使う場合は cwRsync か WSL (Windows Subsystem for Linux) を使うのが一般的です。

サーバ側の権限設定

ウェブ管理ユーザーが web、ウェブサーバユーザーが www-data の場合、まず webwww-data グループに追加しておきます。そうしないとグループ権限で問題が出ます。

1
sudo usermod -aG www-data web

次にサイトディレクトリの所有者とモードを設定します:

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+s(setgid)は、新しく作られるファイルやディレクトリが親ディレクトリのグループを継承するようにするものです。必須ではありませんが、推奨です。

設定が完了したら、Windows側に戻ります。

cwRsync

cwRsync は Windows 上で使える rsync の実装で、アルゴリズムは通常の 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 はディレクトリやファイルの権限を明示的に指定します。ディレクトリの 2setgid です。

WSL

WSL を使うとさらに簡単です。必要であればインストールも簡単です。

同期コマンドの例:

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

ネイティブではないので、AI翻訳を使いました。

comments powered by Disqus