背景
Windowsの上にVirtual BoxでUbuntu Server 16.04を立てて、Docker-composeでNginxのコンテナを動かしていた。Ubuntuで作成したファイルをvolumvesでコンテナと共有して配信するのは何ら問題なくできます。しかし、windowsと共有フォルダで共有したファイルを配信しようとすると403 Forbiddenで配信できませんでした。
Nginxのログを見てみるとpermission deniedでファイルを読み取れていないようでした。Nginxのコンテナの中に入って権限を確認すると、 -rwxrwx---となっていました。rootとgroupには権限があるけれど、その他には権限がないようでした。
問題
Virtual Boxの共有フォルダで共有したファイルに対してdocker-composeのvolumeでNginxのコンテナと共有しても、permission deniedでNginxがアクセスできません。
/media/sf_sharedをwindowsとUbuntuの共有フォルダとして設定した場合
version: '2'
services:
nginx:
image: nginx
ports:
- "80:80"
volumes:
- /media/sf_shared:/usr/share/nginx/html
- ./nginx/conf.d:/etc/nginx/conf.d
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
対処法
Nginxの公式イメージではnginx.confの中のuserの設定がnginxになっているので、rootに変えることで、Nginxはワーカーがroot権限で動くので、ファイルを配信することができます。
user root; # デフォルトはnginx
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
あとがき
画像ファイル置き場からユーザが選択した内容に応じて、APサーバでbase64に変換して送るのではなく、静的ファイルとして配信しようとしてはまりました。Nginxのuser設定をrootにする以外でうまくいく方法はないか試しましたが、今のところうまくいく方法を見つけられていません。
もし、ご存知の方いらっしゃったら教えてください。