最近知ったけど、http通信でファイルをストレージにアップロードしたり、取得する機能はWebDAV(ウェブダブ、Web-based Distributed Authoring and Versioning)っていうらしいのね
今回はNginxでそれを作ってみた
WebDAVとは
俺はファイルのアップロード、ダウンロードってFTPでやるんとちゃうん?・・
て思ってたら、よく考えたらGoogleドライブのようにhttp通信でファイルをアップロードしたりダウンロードってよくされているなと。
このように、http通信でファイル管理ができる機能をWebDAVである。と
サンプルプロジェクト
今回作った検証環境はこちらのリポジトリからダウンロードできます。https://github.com/smithshiro/docker_webdav_sample
設定
docker-compose.yaml
1 2 3 4 5 6 7 8 9 10 |
version: '3' services: webdav: build: ./docker/webdav_nginx volumes: - ./files:/var/www/data - ./docker/webdav_nginx/default.conf:/etc/nginx/conf.d/default.conf ports: - 10088:8080 |
アップロードされたファイルはfilesディレクトリに入るようになっているのがミソ
default.conf
1 2 3 4 5 6 7 8 9 10 11 12 |
server { listen 8080; client_max_body_size 1g; location / { root /var/www/data; client_body_temp_path /var/www/temp_data; dav_methods PUT DELETE MKCOL COPY MOVE; create_full_put_path on; dav_access group:rw all:r; } } |
WebDAVを利用するために出てきた新しいディレクティブの紹介をします。
client_max_body_size
コンテキスト | http, server, location |
説明 | アップロードできるファイルの最大容量 |
デフォルト値 | 1m |
デフォルトで1mだと、でかいファイルをアップロードしたいっていう要望は満たせなかったりするので、このディレクティブで調整必須
client_body_temp_path
コンテキスト | http, server, location |
説明 | リクエストのボディを一時的に保存するパス |
デフォルト値 | /var/cache/nginx/client |
dav_methods
コンテキスト | http, server, location |
説明 | WebDAVで使用できるメソッドを指定する |
デフォルト値 | off |
アクセスを許可するHTTPメソッドを指定するため必須(例えば、削除を許可しないならDELETEを加えないとか
create_full_put_path
コンテキスト | http, server, location |
説明 | アップロード先ディレクトリの自動生成を有効無効 |
デフォルト値 | off |
アップロード先にディレクトリが存在しなかったときに自動作成したい場合はonにする必須
dav_access
コンテキスト | http, server, location |
説明 | 作成するファイルやディレクトリのパーミッションを指定する |
デフォルト値 | user:rw |
作成時に他のユーザからの読み込みや書き込みの権限を制御するため必須
検証
curlコマンドを使ってファイルのアップロード、ダウンロードができるのを検証してみる
ファイルをアップロード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
$ curl -v -X PUT -F upfile=sample.jpg http://localhost:10088/sample.jpg * Trying 127.0.0.1... * TCP_NODELAY set * Connected to localhost (127.0.0.1) port 10088 (#0) > PUT /sample.jpg HTTP/1.1 > Host: localhost:10088 > User-Agent: curl/7.58.0 > Accept: */* > Content-Length: 151 > Content-Type: multipart/form-data; boundary=------------------------4907bd0e75848bce > < HTTP/1.1 201 Created < Server: nginx/1.19.2 < Date: Sat, 14 Nov 2020 14:33:13 GMT < Content-Length: 0 < Location: http://localhost:8080/sample.jpg < Connection: keep-alive < * Connection #0 to host localhost left intact |
201ってステータスになった!
1 2 |
$ ls files/ sample.jpg |
ちゃんとファイルあるね
ファイルをダウンロード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
$ curl -v -X GET -o sample2.jpg http://localhost:10088/sample.jpg Note: Unnecessary use of -X or --request, GET is already inferred. % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Trying 127.0.0.1... * TCP_NODELAY set * Connected to localhost (127.0.0.1) port 10088 (#0) > GET /sample.jpg HTTP/1.1 > Host: localhost:10088 > User-Agent: curl/7.58.0 > Accept: */* > < HTTP/1.1 200 OK < Server: nginx/1.19.2 < Date: Sat, 14 Nov 2020 14:38:51 GMT < Content-Type: image/jpeg < Content-Length: 151 < Last-Modified: Sat, 14 Nov 2020 14:33:13 GMT < Connection: keep-alive < ETag: "5fafeaa9-97" < Accept-Ranges: bytes < { [151 bytes data] 100 151 100 151 0 0 147k 0 --:--:-- --:--:-- --:--:-- 147k * Connection #0 to host localhost left intact |
ダウンロードもできた
いい感じ!
まとめ
- WebDAVの機能でhttp通信ベースでサーバのファイルアクセスができる
- NginxだけでもWebDAVは許可するファイルサイズや、通信方式、ファイルの読み書き権限など色々設定して提供することができる
所感
上の例だと外部ネットワークから簡単にあくせすできてしまってやばいので、
実践では内部ネットワークからしかアクセスできないようにするとか、ベーシック認証とか取り入れるとか必要やね
nginxを現場で活用するための知識を、実践的なノウハウを交えて解説した書籍です。
nginxのインストール方法や基本的な設定方法からはじめ、nginxを利用した「静的コンテンツ配信サーバ」「HTTPSサーバ」「Webアプリケーションサーバ」「大規模コンテンツ配信システム」の構築方法をそれぞれ詳しく紹介しています。後半ではnginxサーバのモニタリングやログの収集、そして軽量スクリプト言語Luaでnginxを拡張する方法について解説しているので、nginxをこれから使う方はもちろん、さらに活用したい方にもお勧めです。