nginxでAssetBundleを配信する時にハマった
nginxでAssetBundleを配信
AssetBundle(.unity3dファイル)はバイナリで、ブラウザで読めないので表示やダウンロードは出来ないようだ
正しく配信されてるかどうかはcurlコマンド使ってターミナル等から確認するのが良い
unity3dフォーマットファイルのContent-typeがnginxのmime.typesファイルに記述されてなかったので、octed-streamになってしまってる。
正しいunity3dフォーマット用のContent-Typeを以下の様にmime.typesファイルに追加する
types { application/vnd.unity unity3d; }
ちなみにnginxはContent-Typeをjpg配信ならimage/jpegにして、htmlならtext/htmlによしなに設定してくれる(/etc/nginx/mime.typesファイルとかに登録されているから)
参考:(http://answers.unity3d.com/questions/28968/mime-settings-for-unity3d-file-type.html)
一応Content-Dispositionも設定しよう
ファイルをブラウザに表示するのでは無く、downoadするようにする設定をヘッダに付ける
add_headerモジュールを使えば設定できる
server { server_name hoge.com; listen 80; location ~ ^/download/(.*\.unity3d)$ { alias /home/app/AssetBundle/$1; add_header Content-Disposition 'attachment; filename="$1"'; } }
以上で設定完了
nginx.confのContent-Typeの設定してる所
ちなみにnginx.confは以下の様にContent-Typeを振り分けている(デフォルトかな?)
以下の場合はmime.typesに書かれていないファイルフォーマットは自動的にoctet-streamになってる
http { include /etc/nginx/mime.types; default_type application/octet-stream; }
まとめ
もしかしたら以上の様な設定しなくても、UnityからurlにアクセスすればAssetBundle取って来れるかもしれないけど、.unity3d様のContent-Typeも用意されてるので、ちゃんと設定した方が行儀がいいと思った。
- バイナリデータなのでブラウザでは分からないのでcurlを使う(-Iオプションでヘッダーのみを見れる)
- Content-Typeがocted-streamになってる(バイナリや良く分からない型,ブラウザだと読めないデータ)
- nginxやapacheはContent-Typeをjpg配信ならimage/jpegにして、htmlならtext/htmlによしなに設定してくれる(/etc/nginx/mime.typesファイルに登録されているから)
- Content-Typeをapplication:/vnd.unity3dにする必要が有る(http://answers.unity3d.com/questions/28968/mime-settings-for-unity3d-file-type.html)
- なので、mime/typesファイルにunity3dのContent-Typeはapplication:/vnd.unity3dだと登録する(ここに登録されてなければocted-streamになるのでもう大丈夫)