Я переношу nginx с виртуальной машины Linux на хост 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 ;
вообще убрать директиву 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
Я думаю, что mklink на Windows может стать решением.
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;
...