Короткий ответ

«Zabbix не открывается» — это web-стек, не агент WS-042. Проверьте nginx/Apache на zabbix.example, PHP-FPM (версия из требований 6.0/7.0 LTS), файл /etc/zabbix/web/zabbix.conf.php (или /etc/zabbix/zabbix.conf.php), коннект PHP к той же БД, что zabbix-server. Отдельно: демон на 10.0.20.50:10051 может быть жив при мёртвом UI и наоборот. Мёртвый демон: Zabbix server не запускается. Не переустанавливайте пакет frontend, пока не сняли HTTP-код и PHP-fatal.

Симптомы и как отличить

Типичная картина:

  • браузер: timeout, сертификат, 502, 404, белая страница;
  • curl с админского ПК или с самого 10.0.20.50 даёт не HTML логина;
  • коллеги видят UI, вы нет — DNS/split horizon;
  • логин есть, виджеты «server is not running» — это уже не «frontend не открывается».

Отличия:

HTTP/UIСлойКуда
Нет TCP 443/80firewall, nginx downэтот материал
502/504php-fpm socketэтот материал
200 + Database errorPHP→БДэтот материал
200 + server not runningдемон 10051server
Логин есть, алерты странныелогика триггеровкарта алертов

Возможные причины

  1. nginx/httpd не запущен, vhost без server_name zabbix.example, неверный root.
  2. PHP-FPM pool мёртв, несовместимая версия PHP (7.0 LTS требует более новый PHP, чем старый 6.0 на том же хосте после частичного upgrade).
  3. zabbix.conf.php указывает на другой хост БД, неверный $DB['PASSWORD'].
  4. Расширения PHP: php-pgsql / php-mysqlnd, bcmath, mbstring, ldap, gd — нет в пуле.
  5. TLS: чужой vhost, просроченный сертификат, редирект-петля.
  6. SELinux httpd_can_network_connect_db off, PHP не ходит на 5432.
  7. Редко: disk full на session path, opcache битый после abort upgrade, HTTP/2 bug на старом nginx — проверяется отключением http2 временно для теста, не «навсегда».

Диагностика

1. HTTP с клиента и с сервера

curl -sS -o /dev/null -w '%{http_code} %{time_connect}\n' https://zabbix.example/
curl -vkI https://zabbix.example/ 2>&1 | head -n 40
curl -sS -o /dev/null -w '%{http_code}\n' http://127.0.0.1/ --header 'Host: zabbix.example'

000 — сеть/DNS/TLS handshake. 502 — upstream PHP. 301 на http — норма, если 443 жив.

DNS:

getent hosts zabbix.example

Должен быть 10.0.20.50 (или VIP), не чужой leftover.

2. Web-сервер и PHP-FPM

systemctl status nginx php-fpm --no-pager
# имена unit: php8.2-fpm / php8.3-fpm — смотрите dpkg -l 'php*-fpm'
ss -lntp | grep -E ':80|:443|php'
sudo nginx -t
sudo tail -n 80 /var/log/nginx/error.log

В vhost Zabbix: fastcgi_pass на тот unix socket, который реально создаёт pool. Несовпадение /run/php/php8.2-fpm.sock vs php8.3 после апгрейда — чистый 502.

sudo php-fpm8.2 -t
sudo tail -n 80 /var/log/php8.2-fpm.log

3. Конфиг frontend и модули PHP

sudo php -m | grep -iE 'pgsql|mysql|bcmath|mbstring|ldap|gd|sockets'
sudo grep -E "DB|ZBX_SERVER" /etc/zabbix/web/zabbix.conf.php

$ZBX_SERVER / $ZBX_SERVER_PORT должны смотреть на 10.0.20.50 и 10051, если UI проверяет статус демона. Это не причина 502, но причина баннера после логина.

Проверка БД тем же пользователем, что в PHP:

psql -h 127.0.0.1 -U zabbix -d zabbix -c 'SELECT mandatory FROM dbversion;'

4. Права и SELinux

ls -l /etc/zabbix/web/zabbix.conf.php
# ожидаемо: root:apache или zabbix:apache, не 666
getenforce
sudo ausearch -m avc -ts recent | tail

Не setenforce 0 навсегда. Для коннекта PHP к TCP БД на другом хосте нужен boolean, не disabled SELinux.

Решение

Сценарий A. nginx/php-fpm не запущены

sudo systemctl enable --now nginx php8.2-fpm
sudo nginx -t && sudo systemctl reload nginx

Подставьте свою версию PHP из пакета zabbix-frontend-php / документации 6.0 vs 7.0. Смешивать frontend 7.0 и server 6.0 нельзя.

Сценарий B. 502 из-за socket PHP

Выровняйте fastcgi_pass и listen в pool. Пример проверки:

ls -l /run/php/*.sock
sudo grep listen /etc/php/8.2/fpm/pool.d/www.conf

После правки systemctl restart php8.2-fpm и reload nginx.

Сценарий C. Database error в UI

  1. Backup zabbix.conf.php.
  2. Выровняйте $DB с рабочим psql/mysql.
  3. Не запускайте web-installer на боевой базе «перезаписать конфиг».

Если пароль сменили в PostgreSQL — обновите и сервер, и frontend. Иначе получите живой UI и мёртвый poller или наоборот.

Сценарий D. PHP-модуль отсутствует

Ставьте пакеты той же minor PHP, что FPM. Рестарт fpm, не только nginx. Белый экран: включите временно display_errors только на служебном vhost или читайте php-fpm log — не в проде для всех.

Сценарий E. TLS и vhost

Сертификат на zabbix.example, не на дефолтный default_server. Проверка:

echo | openssl s_client -connect 10.0.20.50:443 -servername zabbix.example 2>/dev/null | openssl x509 -noout -dates -subject

Просроченный cert ломает мониторинг самих сертификатов и браузеры. Тема item TLS: мониторинг сертификатов.

Сценарий F. UI открылся, API скриптов нет

/api_jsonrpc.php должен отвечать POST JSON-RPC. 404 — неверный root (попали в пустой vhost). 401 без тела — норма для пустого запроса. Для автоматизаций используйте token пользователя API, не пароль Super Admin в cron plaintext.

Как проверить, что проблема устранена

curl -sS -o /dev/null -w '%{http_code}\n' https://zabbix.example/
curl -sS -o /dev/null -w '%{http_code}\n' https://zabbix.example/api_jsonrpc.php

Ожидание: 200 на UI (или 302 на login), 200 на API endpoint. В браузере: форма логина, после входа Dashboard без PHP warnings. Статус демона — отдельная проверка ss -lntp | grep 10051.

С хоста WS-042 ничего не требуется для «UI жив». Не путайте с агентом.

Если не помогло

  • Только один клиент не открывает: прокси корпоративный, старый DNS cache, TLS inspection.
  • HTTP 200, но пустая страница: JS/CSP, AdBlock режет /assets/ 7.0, смотрите Network в браузере.
  • Медленный UI при живом HTTP: очередь и БД, не PHP. См. очередь.
  • После логина сразу logout: php session на NFS без lock, или разные https/http Secure cookie.
  • setup.php снова доступен: закройте location или удалите installer per package docs.

Профилактика

  • Отдельный vhost только для Zabbix, TLS автоматический (внутренний CA), мониторинг самого web.page.regexp / HTTP agent на /.
  • Согласованные версии server/frontend/schema.
  • Backup zabbix.conf.php вместе с секретами в vault, не в git.
  • PHP-FPM pm не max_children=5 на 200 пользователей UI.
  • Доступ к UI с jump host / VPN, не world на 0.0.0.0. Триггеры без работающего UI всё равно должны уходить в мессенджер — карта алертов.

FAQ

Frontend на другом хосте, чем server — нормально?

Да. Тогда PHP→БД и $ZBX_SERVER=10.0.20.50. Firewall: 5432/3306 только с фронта, 10051 для статуса. Не открывайте БД в LAN всем.

Какой PHP для 6.0 и 7.0?

Смотрите матрицу на сайте Zabbix для вашего minor. Не ставьте PHP 8.3 на 6.0, если в матрице его нет. Это типичный 500 после «обновили Ubuntu».

Нужен ли Apache, если уже nginx?

Нет. Один фронт. Пакет zabbix-nginx-conf vs zabbix-apache-conf — выберите один, второй disable.

Почему curl 200, а Chrome ERR_CERT?

Разные trust store. Корп CA в Windows есть, в curl на Linux нет. Для диагностики --cacert, не -k в проде скриптов.

Можно ли чинить UI, отключив auth?

Нет. Не оставляйте Allow from all без пароля. Для теста — IP allowlist jump host.

UI на HTTP только внутри — ок?

Только если сегмент изолирован и есть план TLS. Cookie сессии без Secure на «внутреннем HTTP» крадут одной XSS. Для 6.0/7.0 ставьте HTTPS на zabbix.example даже во внутренней сети.