Re: Дректива if и проверка существоания файла
Maxim Dounin
mdounin на mdounin.ru
Ср Дек 15 02:01:02 UTC 2021
Hello!
On Tue, Dec 14, 2021 at 03:52:22AM -0500, akarabanov wrote:
> Мне необходимо проверить существует ли сокет. Я использую такую
> конструкцию:
>
> location / {
>
> if ( -f /www/php_sockets/${app}.sock ) {
> set $sock "/www/php_sockets/${app}.sock";
> }
>
> return 220 "${sock}";
> }
>
> И получаю ошибку 'open() "/www/php_sockets/test.sock" failed (6: No such
> device or address)'
>
> Если заменить сокет на простой файл с теми же правами, то всё отрабатывает
> корректно.
>
> Скажите пожалуйста с помощью директивы if нельзя проверить существование
> сокета или я что-то делаю не так?
Нельзя. Условие "-f" позволяет проверять существование (обычных)
файлов. Также можно проверять существование каталогов ("-d") или
файлов, каталогов и символических ссылок ("-e"). Возможности
проверять существование сокетов и прочих специальных файлов не
предусмотрено. Если нужно проверять именно сокеты - можно
использовать встроенный perl или njs.
А ошибка - ENXIO - видимо следствие того, что в конфигурации
включён open_file_cache, и при проверках nginx пытается сразу
открывать файл. В случае специальных файлов это приводит к
ошибкам, т.к. nginx открывает файлы с флагом O_NONBLOCK, дабы
избежать вечных блокировок при случайных попытках открытия
специальных файлов.
--
Maxim Dounin
http://mdounin.ru/
Подробная информация о списке рассылки nginx-ru