Как на уровне NGINX не допустить параллельного обращения к URL?
но Redis-сервер это удалённое хранилище и параллельный запуск скрипта может произойти быстрее проверки/сохранения состояния в Redis
Нет, если это сделано через получение блокировки. Т.е. не запустились и сразу бросились что-то фигачить, а сделали запрос в Redis, получили от него разрешение на запуск (получили блокировку ресурса) и только лишь после этого начали работу. После окончания работы скрипт должен послать запрос на разлочку, причем в идеале стоит это запилить в register_shutdown_function() что бы даже незапланированное завершение скрипта приводило в разлочке ресурса. Эту схему должно быть достаточно просто запилить в проект, кода изменить придеться минимум. В общем нужно заходить от известной схемы с блокировками через семафоры. А Redis рулит блокировками корректно ввиду своей природной однопоточности.
Так же по теме: Distributed locks with Redis
HTTP - stateless протокол, без внешнего хранилища - никак. Это могут быть файл на диске, редис, что угодно.