Puma слушает сокет, а веб-сервер получает отказ доступа
Приложение и веб-сервер работают от разных пользователей. Сокет создаётся с правами приложения, и веб-серверу в него не пробиться. Каталог сокета при этом должен пережить перезапуск и не оказаться во временной файловой системе, очищаемой при загрузке.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Права на файл сокета не дают доступа веб-серверу
Сокет наследует права от создателя. Веб-сервер работает от своего пользователя и получает отказ.
-
Каталог сокета исчезает после перезагрузки
Каталог во временной файловой системе очищается при загрузке. Приложение не может создать в нём сокет.
-
Веб-сервер обращается по устаревшему пути
После правки пути сокета в приложении настройки веб-сервера остаются прежними. Он стучится туда, где ничего нет.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Существует ли сокет и с какими правами.
sudo ls -l /run/myapp/Пользователь приложения и каталог сокета.
systemctl show myapp -p User -p Group -p RuntimeDirectoryЧто именно получает веб-сервер при обращении.
sudo journalctl -u nginx -n 20 --no-pager | grep -i "connect() to unix"Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Сокет наследует права от создателя. Веб-сервер работает от своего пользователя и получает отказ.
- Как проверить
-
Посмотрите права на сокет и пользователей обеих служб.
sudo ls -l /run/myapp/puma.sock 2>/dev/null systemctl show myapp -p User -p Group; systemctl show nginx -p User 2>/dev/null
- Как исправить
- Сделайте общую группу для приложения и веб-сервера и задайте права сокета так, чтобы группа могла писать. Права шире этого не нужны.
- Почему происходит
- Каталог во временной файловой системе очищается при загрузке. Приложение не может создать в нём сокет.
- Как проверить
-
Посмотрите каталог и параметры службы.
systemctl show myapp -p RuntimeDirectory -p RuntimeDirectoryMode sudo ls -ld /run/myapp 2>/dev/null
- Как исправить
-
Объявите каталог через
RuntimeDirectory=и задайте режим доступа: systemd создаст его при каждом запуске с нужными правами.[Service] RuntimeDirectory=myapp RuntimeDirectoryMode=0750 Group=www-data
- Почему происходит
- После правки пути сокета в приложении настройки веб-сервера остаются прежними. Он стучится туда, где ничего нет.
- Как проверить
-
Сравните путь в обеих настройках.
grep -rhoE "unix:[^ ;]+" /etc/nginx/ 2>/dev/null | head sudo ls -l /run/myapp/ 2>/dev/null
- Как исправить
- Приведите пути в соответствие и перезагрузите настройки веб-сервера. Ошибка доступа и ошибка отсутствия файла выглядят похоже, различает их точный текст в журнале.
Пример вывода
Веб-сервер не может писать в сокет приложения. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
nginx[1200]: 2026/09/15 17:20:41 [crit] 1200#0: *1 connect() to unix:/run/myapp/puma.sock failed (13: Permission denied) while connecting to upstream
$ sudo ls -l /run/myapp/puma.sock
srwxr-xr-x 1 deploy deploy 0 Sep 15 17:20 /run/myapp/puma.sock
Связанные ошибки
- uWSGI: веб-сервер не может писать в сокет nginx получает отказ доступа к сокету uWSGI: права и владелец сокета задаются в описании приложения.
- nginx 502 Bad Gateway: connect() failed к приложению nginx работает, а приложение недоступно: connect() failed, connection refused, no such file or directory для сокета. Разбор 502.
- status=233/RUNTIME_DIRECTORY в systemd Код 233/RUNTIME_DIRECTORY: не удалось подготовить каталог службы в /run из RuntimeDirectory=. Права, режим, удаление при остановке.
- status=235/CHOWN в systemd Код 235/CHOWN: не удалось изменить владельца сокета. Код относится только к unit-файлам сокетов.
- Служба не видит, кто обратился по сокету Сведения о вызывающем не приходят: передача учётных данных через сокет включается отдельно.
- Сокет с каналом: права не позволяют писать Служба принимает данные через канал, но клиенты не могут в него писать: владелец и права задаются в сокете.
- Фильтр почты недоступен почтовой службе: сокет и группы Почтовая служба не может обратиться к фильтру: сокет создан с правами, недоступными её пользователю.
- AppArmor: apparmor="DENIED" в журнале ядра Профиль AppArmor запретил операцию: как прочитать запись, найти профиль и поправить его правильно.
Где встречается чаще всего
Источники
-
systemd.exec(5)
RuntimeDirectory= и режим доступа к каталогу. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено сокетом с правами только для владельца.