Я использую openresty/1.15.8.2
в качестве прокси-сервера перед приложением, которое иногда должно принимать файлы большого размера.
Я хотел установить client_max_body_size 200M
условно, поэтому только тот URL-адрес, который ожидает файлы, принимает большой размер тела. Первым делом я попытался установить проверку URL в операторе if, например:
if ($url ~ /path/to/file/upload) {
content_max_body_size 200M;
}
Это не работает, так как nginx говорит, что директива content_max_body_size здесь не разрешена.
Следующая вещьЯ пробовал использовать вложенный блок местоположения, например, так:
location ~ ^(mypatterns)$ {
# do stuff
location ~ ^/path/for/file/upload$ {
client_max_body_size 200M;
}
# do stuff
proxy_pass whatever;
}
Хотя это не работает. Я получаю сообщение об ошибке, подобное:
*14941 open() "/.../path/for/file/upload" failed (2: No such file or directory), ...
Это означает, что вложенное расположение пытается найти файл для обслуживания, а не проходит через остальную часть внешнего блока местоположения.
Однако, еслиЯ установил пустую директиву content_by_lua_block {}
во вложенном месте, она отлично работает:
location ~ ^(mypatterns)$ {
# do stuff
location ~ ^/path/for/file/upload$ {
client_max_body_size 200M;
content_by_lua_block {}
}
# do stuff
proxy_pass whatever;
}
Теперь
- только для
/path/for/file/uploads
допускается большой размер тела - запросы, соответствующие этому пути, также «проходят» до остального материала и
proxy_pass
Он делает то, что я хочу, но почему ? Что особенного в вызове директивы content_by_lua_block
, через которую она проходит? Как я могу заставить его пройти через vanilla nginx, без content_by_lua_block
?
Обратите внимание, что если я разделю это на две отдельные не вложенные директивы местоположения, он все равно будет работать нормально.