Zabbix web интерфейс на nginx+php-fastcgi

Зачем

Как оказалось, zabbix прожорлив не только касательно ресурсов дисковой подсистемы, но и генерация страничек с графиками потребляет не малые ресурсы процессора. Когда система работает на пределе (уже наблюдается проседание iowait), то пара-тройка пользователей сможет добить систему до конца своими запросами на выборку и генерацией изображений. В этом случае генерацию изображений и всю другую работу, связанную с пользователями, целесообразно перенести на другую машину, или хотя бы запустить систему на более быстрой связке php-cgi и кеширующего легкого web сервера nginx.

Как

Все достаточно легко. Во первых, выбираем сервак и устанавливаем на нем необходимые компоненты.

Устанавливаем php-fastcgi

с необходимыми модулями, остальные модули должны поставиться после установки веб морды

apt-get install php5-cgi php5-mysql php5-curl

Делаем необходимые настройки

#cat /etc/default/php-fastcgi
#
# Settings for php-cgi in external FASTCGI Mode
#
# Should php-fastcgi run automatically on startup? (default: no)
START=yes
# Which user runs PHP? (default: www-data)
EXEC_AS_USER=www-data
# Host and TCP port for FASTCGI-Listener (default: localhost:9000)
FCGI_HOST=10.197.131.113
FCGI_PORT=9000
# Environment variables, which are processed by PHP
PHP_FCGI_CHILDREN=4
PHP_FCGI_MAX_REQUESTS=1000

Создаем скрипт запуска процесса как демона. Этот скрипт написал сам разработчик, у меня он не сработал сразу из не правильной настройки в предыдущем файле FCGI_HOST=10.197.131.113, где нужно указать ip сервера, но котором будет висеть обработчик

 

#! /bin/sh
### BEGIN INIT INFO
# Provides:          php-fastcgi
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start and stop php-cgi in external FASTCGI mode
# Description:       Start and stop php-cgi in external FASTCGI mode
### END INIT INFO
 
# Author: Kurt Zankl 
 
# Do NOT "set -e"
 
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="php-cgi in external FASTCGI mode"
NAME=php-fastcgi
DAEMON=/usr/bin/php-cgi
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
 
# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0
 
# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME
 
# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh
 
# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions
 
# If the daemon is not enabled, give the user a warning and then exit,
# unless we are stopping the daemon
if [ "$START" != "yes" -a "$1" != "stop" ]; then
        log_warning_msg "To enable $NAME, edit /etc/default/$NAME and set START=yes"
        exit 0
fi
 
# Process configuration
export PHP_FCGI_CHILDREN PHP_FCGI_MAX_REQUESTS
DAEMON_ARGS="-q -b $FCGI_HOST:$FCGI_PORT"
 
 
do_start()
{
        # Return
        #   0 if daemon has been started
        #   1 if daemon was already running
        #   2 if daemon could not be started
        start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
                || return 1
        start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON \
                --background --make-pidfile --chuid $EXEC_AS_USER --startas $DAEMON -- \
                $DAEMON_ARGS \
                || return 2
}
 
do_stop()
{
        # Return
        #   0 if daemon has been stopped
        #   1 if daemon was already stopped
        #   2 if daemon could not be stopped
        #   other if a failure occurred
        start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE > /dev/null # --name $DAEMON
        RETVAL="$?"
        [ "$RETVAL" = 2 ] && return 2
        # Wait for children to finish too if this is a daemon that forks
        # and if the daemon is only ever run from this initscript.
        # If the above conditions are not satisfied then add some other code
        # that waits for the process to drop all resources that could be
        # needed by services started subsequently.  A last resort is to
        # sleep for some time.
        start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
        [ "$?" = 2 ] && return 2
        # Many daemons don''t delete their pidfiles when they exit.
        rm -f $PIDFILE
        return "$RETVAL"
}
 
case "$1" in
  start)
        [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
        do_start
        case "$?" in
                0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
  stop)
        [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
        do_stop
        case "$?" in
                0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
  restart|force-reload)
        log_daemon_msg "Restarting $DESC" "$NAME"
        do_stop
        case "$?" in
          0|1)
                do_start
                case "$?" in
                        0) log_end_msg 0 ;;
                        1) log_end_msg 1 ;; # Old process is still running
                        *) log_end_msg 1 ;; # Failed to start
                esac
                ;;
          *)
                # Failed to stop
                log_end_msg 1
                ;;
        esac
        ;;
  *)
        echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
        exit 3
        ;;
esac
 
:

Настраиваем php.

Находим файл /etc/php5/cgi/php.ini и изменяем в нем следующие параметры.

memory_limit = 256M
post_max_size = 32M
max_execution_time = 600
max_input_time = 600
date.timezone = Europe/Moscow

Zabbix web интерфейс

wget http://repo.zabbix.com/zabbix/2.2/ubuntu/pool/main/z/zabbix-release/zabbix-release_2.2-1+precise_all.deb
dpkg -i zabbix-release_2.2-1+precise_all.deb
apt-get update
aptitude install zabbix-frontend-php

Интерфейс потянет за собой apache, который нам не нужен. Отключаем его после установки (можно не отключать, а повесить на другой порт, на всякий случай или для сравнения скоростей работы обоих способов)

service apache2 stop
update-rc.d -f apache2 remove

Далее копируем файл cat /etc/zabbix/web/zabbix.conf.php с существующей машины на новую.

Не забудьте изменить в этом файле значения localhost на реальные адреса.

$ZBX_SERVER = 'address.or.ip';

$DB['SERVER'] = 'address.or.ip';

Иначе zabbix будет ругаться на то, что компонент сервер не запущен, либо база не запущена.

Настраиваем nginx

Ngixn надо настраивать на сервере, где уже работает zabbix.

Схема у нас получается такая: пользователь запрашивает с сервера страничку, и попадает на nginx, проксирующий соединения на удаленный хост, если запрашивается файл php. Если запрашивается статическая информация - картинка или js скрипт, то она отдается из локальной папки, благо nginx делает отдачу статики лучше и быстрее любого существующего сервера. Итог: динамика вместе с графиками генерируется сторонним сервером, а все остальное отдается из локальной папки, да еще и кешируется.

Установим nginx

aptitude install nginx

Настроим

server {
        root /usr/share/zabbix;
        index index.php index.htm;
 
        server_name server.zabbix.or.ip;
 
 
        location ~ \.php$ {
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
                fastcgi_pass 10.197.131.113:9000;
                fastcgi_index index.php;
                include fastcgi_params;
        }
 
        location ~ /\.ht {
               deny all;
        }
 
 
         location ~* \.(jpg|jpeg|gif|png|ico|css|bmp|swf|js|html|txt)$ {
 access_log off;
 expires 30d;
 }
}

Обратите внимание на fastcgi_pass, там нужно указать web сервер, на котором был установлен php_fastcgi сервер.

Беда

Естественно сразу у вас все не заработает. Придется маленько помучатся. Вот несколько советов.

  1. Проверьте, что пользователь $DB['USER'] имеет право коннектиться с удаленных хостов (обычно в целях безопасности пользователь может заходить только с localhost)
  2. Проверьте, что mysql слушает тот ip, по которому вы к нему обращаетесь. Для этого с удаленной машины сделайте mysql -p -h address.or.ip, если сервер не ответил вам, то либо в его настройках установлена директива bind-address = 127.0.0.1 либо mysql закрыт файрволом
  3. Проверьте запустился ли php-fastcgi на машине, где он должен быть запущен ps aux|grep ph Проверьте, слушает ли он 9000 порт. netstat -anp |grep 900
  4. Проверьте, существует ли путь /usr/share/zabbix если web морда расположена в другом месте, то исправьте везде.

Категории: