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 mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru