Windows 上の複数のドライブにわたる NGINX try_files

Windows 上の複数のドライブにわたる NGINX try_files

パフォーマンス上の理由から、nginx を Linux VM から Windows ホストに移動しているのですが、この部分で問題が発生しています。

Linux の場合の構成は次のとおりです。

root /;

try_files /mnt/m$uri /mnt/d$uri /mnt/l$uri =404;

ここで、/mnt/m、/mnt/d、/mnt/l はそれぞれ M:、D:、L: ドライブのマウント ポイントです。

Windowsで試してみた

root /;

try_files M:$uri D:$uri L:$uri =404;

しかし、このエラーが発生します

*1 GetFileAttributesEx() "C:L:/[...]" failed (123: The filename, directory name, or volume label syntax is incorrect)

これは/C: ドライブとして解釈されるようです。これは nginx が実行されるドライブです。root ;ルート ディレクティブを完全に省略することも試しましたが、何も機能しませんでした。

答え1

名前付きの場所をネスト(?)することで、なんとか実現できました。ただし、少なくとも私の経験では、メインの場所ブロックで設定したヘッダー/オプションは、名前付きの場所には適用されないので注意してください。@IvanShatsky の NTFS マウント ポイントを使用したソリューションの方がはるかに優れているようです。

location /  {
    root "M:\\";
    try_files $uri $uri/ @ddrive;

}

location @ddrive {
    root "D:\\";
    try_files $uri $uri/ @ldrive;
}

location @ldrive {
    root "L:\\";
    try_files $uri $uri/ =404;
}

答え2

Windows 上の mklink が解決策になると思います。

https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/mklink

次のようなコマンドを使用して、マウントされたディスクを C:\mnt\M、C:\mnt\D、C:\mnt\L などにリンクできます。

mklink /D C:\mnt\M M:
mklink /D C:\mnt\D D:
mklink /D C:\mnt\L L:

そしてnginx.confで

...
root C:/mnt/;

try_files /M/$uri /D/$uri /L/$uri =404;
...

関連情報