セットアップスクリプトとパーミッションでハマった

サーバーの設定・確認・テストにはやっぱりコマンドラインツールだな。

  1. パケットが届くかは ping
  2. シェルアクセスは ssh
  3. 名前が引けるかは nslookup
  4. WebページがGETできるかは curl
  5. アプリケーションレベルでアクセス確認は ftp

ブラウザはDNSキャッシュが邪魔になる。

さて、curlhttp://www.daphnia.org/ にアクセスすると 403 Forbidden が返ってくる。これはnginxが動いて出していることになる。次の記事で事情がわかった。感謝。

結論はパーミッションのせいだった。nginxのセットアップスクリプトに次の行がある。

chmod +x $NGINX_ROOT

$NGINX_ROOT はWeb公開ディレクトリのパス。これで大丈夫だと思ったのが大間違い!

WSL2-CentOS8 で再現実験してみると:

[root@X1-YOGA-HIYAMA provision]# namei -om /home/hiyama/web_pub/
f: /home/hiyama/web_pub/
 drwxr-xr-x root   root   /
 drwxr-xr-x root   root   home
 drwx------ hiyama hiyama hiyama
 drwxr-xr-x root   root   web_pub
[root@X1-YOGA-HIYAMA provision]#

~hiyama/web_pub/ にはディレクトリx権限が許可されるが、ひとつ上の ~hiyama/ がアクセス不可

drwx------ hiyama hiyama hiyama

nginxが ~hiyama/web_pub/index.html を読みにいっても、~hiyama=/home/hiyama/ を検索できなので 403 Forbidden となる。find $NGINX_ROOT -type d -exec chmod +x \{\} \; とかでもダメ、問題はベースディレクトリの上のディレクトリにあったのだから。

フルパスをディレクトリ成分〈セグメント〉に分解して、各ディレクトリごとに chmod + x dir をしていかなくてはならない。パスを分解するコマンドってなかったような。dirname, basename ではうまくない。sedでスラッシュを改行に置き換えてゴニョゴニョとかだろう。なんかバカみたいで気力がわかない。

ところで、nameiコマンドは便利。