Munin через CGI – connect() к unix:/var/run/munin/fastcgi-html.sock завершился неудачно

Вопрос или проблема

Я пытался настроить munin для использования html_strategy cgi через nginx, чтобы программа не создавал вывод снова и снова, когда я использую его только время от времени.

Я следовал руководству (https://guide.munin-monitoring.org/en/stable-2.0/example/webserver/nginx.html), но всегда получал

502 Bad Gateway

в браузере и находил эти записи в логе nginx

2025/01/19 17:04:08 [crit] 185121#185121: *10347 connect() to unix:/var/run/munin/fastcgi-html.sock failed (13: Permission denied) while connecting to upstream, client: <snip>:2:4:3:0:a, server: s2survey.net, request: "GET /munin/ HTTP/2.0", upstream: "fastcgi://unix:/var/run/munin/fastcgi-html.sock:", host: "<snip>.net"
2025/01/19 17:04:09 [crit] 185121#185121: *10347 connect() to unix:/var/run/munin/fastcgi-html.sock failed (13: Permission denied) while connecting to upstream, client: <snip>:2:4:3:0:a, server: s2survey.net, request: "GET /munin/ HTTP/2.0", upstream: "fastcgi://unix:/var/run/munin/fastcgi-html.sock:", host: "<snip>.net"

Сокеты fcgi были корректно запущены и, кажется, существуют

# spawn-fcgi -s /var/run/munin/fastcgi-graph.sock -U www-data -u munin -g munin /usr/lib/munin/cgi/munin-cgi-graph
# spawn-fcgi -s /var/run/munin/fastcgi-html.sock  -U www-data -u munin -g munin /usr/lib/munin/cgi/munin-cgi-html

Как отладить проблему?

Permission Denied было довольно легко найти, взглянув на сокет. Он принадлежал www-data (как указано в spawn-fcgi), однако nginx использовал другое имя пользователя, то есть, nginx в моей системе.

spawn-fcgi -s /var/run/munin/fastcgi-graph.sock -U nginx -u munin -g munin /usr/lib/munin/cgi/munin-cgi-graph
spawn-fcgi -s /var/run/munin/fastcgi-html.sock  -U nginx -u munin -g munin /usr/lib/munin/cgi/munin-cgi-html

Это изменило сообщение об ошибке на “Connection Refused”:

2025/01/20 20:47:22 [error] 695040#695040: *25715 connect() to unix:/var/run/munin/fastcgi-html.sock failed (111: Connection refused) while connecting to upstream, client: <snip>:2:4:3:2:1e, server: s2survey.net, request: "GET /munin/ HTTP/2.0", upstream: "fastcgi://unix:/var/run/munin/fastcgi-html.sock:", host: "<snip>.net"

Это было намного сложнее исправить. Решением было запустить программу, с которой соединялся сокет. Она предложила мне использовать пользователя munin

sudo munin /usr/lib/munin/cgi/munin-cgi-html

Результат затем указал на причину проблемы: Похоже, что лог-файл был создан с неверным владельцем.

Status: 500
Content-type: text/html

<h1>Software error:</h1>
<pre>Can't open /var/log/munin/munin-cgi-html.log (Permission denied) at /usr/share/perl5/Log/Log4perl/Appender/File.pm line 151.

Эта строка затем решила проблему:

chown munin:munin /var/log/munin/munin-cgi-html.log

Надеюсь, это избавит других от серьёзных головных болей.

Ответ или решение

Ошибка, связанная с попытками настроить Munin через CGI и получением сообщения "connect() to unix:/var/run/munin/fastcgi-html.sock failed" возникает часто и может быть вызвана несколькими факторами, среди которых конфигурационные ошибки или проблемы с правами доступа. Разберем шаги, которые помогут устранить данную проблему.

Теория

Munin — это система мониторинга, которая используется для сбора и отображения данных о производительности серверов. Для оптимизации работы и минимизации времени генерации отчетов, Munin может быть настроен работать через CGI. Однако, при использовании CGI с FastCGI через сервера, такие как Nginx, часто возникают сложности, связанные с ошибками конфигурации и прав доступа.

Сообщение об ошибке "502 Bad Gateway" указывает на то, что веб-сервер Nginx не может связаться с бекендом CGI. В частности, ошибка "connect() to unix:/var/run/munin/fastcgi-html.sock failed (13: Permission denied)" подразумевает проблемы с правами доступа на сокет, который используется для коммуникации.

Пример

Вы столкнулись с проблемой "Permission Denied" при попытке доступа к сокету FastCGI, который создает Munin. Причина проблемы кроется в несовпадении пользователем, под которым работает Nginx, и владельцем сокета. Изначально сокет принадлежал пользователю www-data, но Nginx был настроен работать под пользователем nginx. Исправив пользователя владельца на nginx, проблема с доступом была решена, но возникла новая ошибка "Connection Refused".

После запуска бинарного файла вручную обнаружилось, что проблема создается из-за неправильных прав на файл журнала, который Munin пытается использовать. Это привело к ошибке доступа "Permission denied", когда Munin пытается записать лог.

Применение

Для решения этой проблемы необходимо было выполнить несколько шагов:

  1. Правильная настройка прав для сокета и пользователя:

    • Убедитесь, что сокет, используемый Munin для CGI, обладает нужными правами доступа. Сокет может быть создан с определенным пользователем и группой, что нужно учитывать при настройке доступа для Nginx.
    • Как только увидели ошибку с правами доступа, скорректируйте пользователя, под которым создается сокет FastCGI, на того, который совпадает с пользователем Nginx:
      spawn-fcgi -s /var/run/munin/fastcgi-html.sock -U nginx -u munin -g munin /usr/lib/munin/cgi/munin-cgi-html
  2. Проверка доступности процесса:

    • Запустите процесс извне, чтобы убедиться в его доступности и работоспособности.
    • Используйте команды вроде sudo munin /usr/lib/munin/cgi/munin-cgi-html, чтобы выявить наличие какой-либо дополнительной информации, которая могла быть скрыта от стандартных логов.
  3. Обеспечьте корректные права на файлы журнала:

    • Если обнаружено, что проблема связана с правами на файлы логов, выполните команду:
      chown munin:munin /var/log/munin/munin-cgi-html.log
    • Это обеспечит Munin необходимые права для записи.
  4. Убедитесь, что все конфигурации верны:

    • Проверьте конфигурационный файл Nginx чтобы убедиться, что настройки FastCGI подтверждены и соответствуют ожидаемой конфигурации Munin. Например, раздел upstream и директивы fastcgi_pass должны быть настроены корректно в соответствии с вашим окружением.

Следуя этим шагам, вы сможете наладить работу Munin через CGI без ошибок. Данные точки конфигурации справедливы не только для Munin, но и для многих CGI-приложений, использующих FastCGI, что делает их полезными в более широком контексте развертывания подобного программного обеспечения. Надеюсь, это объяснение и руководство позволят вам избежать головной боли при решении подобных проблем.

Оцените материал
Добавить комментарий

Капча загружается...