シンボリックリンク

中身ではなく、道しるべを動かす

前のレッスンで版を並べました。次は、nginx にどの版を見せるかです。

版のディレクトリ名を root に直接書くと、更新のたびに設定を書き換えて reload することになります。それでは切り替えが重く、書き間違いも混じります。

代わりに使うのがシンボリックリンクです。中身を持たず、別の場所を指すだけの小さな道しるべです。

ln -s /var/www/mysite-deploy/releases/20260401-101500 /var/www/mysite-deploy/current

ln -s は、指す先を先に、道しるべの名前を後に書きます。この順番はよく逆に覚えますcpmv と同じで「元、先」の順だと考えると間違えません。

作ったものは ls -l で確かめられます。

ls -l /var/www/mysite-deploy/current # lrwxrwxrwx 1 deploy deploy 47 Aug 8 10:15 current -> /var/www/mysite-deploy/releases/20260401-101500

先頭の l がリンクである印で、-> の右が指している先です。

nginx にはリンクを見せる

設定側は、版ではなくリンクを指します。

root /var/www/mysite-deploy/current;

こう書いておけば、リンクの向き先を変えるだけで公開される中身が変わります。設定ファイルは二度と触りません

3章で sites-enabled の中身がリンクだったのを思い出してください。あれも同じ考え方です。設定の実体は1か所に置き、有効かどうかはリンクの有無で表す。Linux はこの形をあちこちで使います。

張り替えは -f を付ける

既にある current を別の版に向け直すとき、そのまま ln -s を打つと失敗します。

ln -s .../releases/20260402-090000 /var/www/mysite-deploy/current # ln: failed to create symbolic link 'current': File exists

上書きするには -f を足します。まとめて -sfn と書くのが定番です。

ln -sfn /var/www/mysite-deploy/releases/20260402-090000 /var/www/mysite-deploy/current

-n が効きます。これが無いと、current が既にディレクトリを指すリンクである場合、その中に新しいリンクが作られます。current/20260402-090000 という意図しないものができて、公開中の版は変わりません。動いてはいるので気づきにくい失敗です。

切り替えたら reload する

リンクを張り替えたあと、nginx には reload をかけます。

systemctl reload nginx

nginx は性能のために、開いたファイルの情報をしばらく覚えています。張り替えた直後は古い版を返し続けることがあるので、reload で確実に読み直させます。3章で見たとおり、reload は接続を切らずに設定を読み直す指示です。

手を動かす

current というリンクを作り、nginx にそれを見せます。新しい版を作って張り替え、公開される中身が変わることを確かめます。

ヒント

  • 1. ln -s で current を作り、releases/20260401-101500 を指させる
  • 2. mysite.conf の root を /var/www/mysite-deploy/current に変える
  • 3. nginx -t のあと systemctl reload nginx で反映する
  • 4. rsync -a --delete で releases/20260402-090000 を作る
  • 5. 新しい版の index.html の見出しを 三宅 あかり 制作実績 に書き換える
  • 6. ln -sfn で current を新しい版に張り替え、reload して確かめる

10 項目で採点します