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