UMGUM.COM 

Squid3 control ( Управление Squid3. )

30 ноября 2011  (обновлено 15 августа 2016)

OS: Debian GNU/Linux Squeeze.

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

# aptitude install psmisc

# rm /etc/init.d/squid3

# touch /etc/init.d/squid3-ordinary
# chmod ugo+x /etc/init.d/squid3-ordinary


#!/bin/bash

export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin/

### BEGIN INIT INFO
# Provides:          squid3-ordinary
# Required-Start:    $network $remote_fs $syslog
# Required-Stop:     $network $remote_fs $syslog
# Should-Start:      $named
# Should-Stop:       $named
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Squid HTTP Proxy - ordinary
### END INIT INFO

# Принимаем в переменные с "говорящими" именами входящие аргументы
INSTANCE=${0}

NAME="Squid Ordinary"
TARGET=ordinary
#
SQUID="squid3-${TARGET}"
EXEC="/usr/sbin/squid3-${TARGET}"
CONF="/etc/squid3/squid-${TARGET}.conf"
LOG="/var/log/squid3/control-${TARGET}.log"
# PID=`cat /var/run/squid3-${TARGET}.pid`
CHECKER="/etc/squid3/squid-control.sh"
CACHE0="/mnt/squid/spool/${TARGET}"
CACHE1="/var/spool/squid3/${TARGET}"
EXEC="/usr/sbin/squid3-${TARGET}"
ARGS="-Y"
DATE=`date +"%Y-%m-%d %H:%M:%S"`

function start() {
  # Проверяем, существуют-ли директории "кеша"
  if [ ! -d "${CACHE0}" ] || [ ! -d "${CACHE1}" ]
  then
    # Если директории "кеша" отсутствуют, то создаём их
    echo "${DATE}: Creating ${NAME} Cache Directory..." >> ${LOG}
    ${EXEC} -z -f ${CONF}
  fi

  echo "${DATE}: Starting ${NAME}..." >> ${LOG}
  ${EXEC} ${ARGS} -f ${CONF}
return ${?}
}

function stop() {
  # Завершаем работу целевого экземпляра Squid
  echo "${DATE}: Stoping ${NAME}..." >> ${LOG}
  kill -s KILL `cat /var/run/squid3-${TARGET}.pid`
return ${?}
}

case "$1" in
  start)
    start

    # Запускаем проверяльщик уровня использования Squid3 оперативной памяти
    ${CHECKER} ${TARGET}
  ;;
  stop)
    stop

    # Ищем "проверяльщик" для запущенного целевого экземпляра Squid
    ID=`ps wax | grep -v grep | grep -i ${CHECKER} | grep -i ${TARGET} | awk '{print $1}'`
    # Завершаем работу "проверяльщика"
    if [ "${ID}" != "" ]
    then
      echo "${DATE}: Stopping checker for ${NAME}..." >> ${LOG}
      kill -s SIGKILL ${ID}
    fi
  ;;
  restart)
    echo "${DATE}: Restarting ${NAME}..." >> ${LOG}
    stop
    echo "Wait..."
    sleep 5
    start
  ;;
  reload)
    echo "${DATE}: Reloading ${NAME}..." >> ${LOG}
    kill -HUP `cat /var/run/squid3-${TARGET}.pid`
  ;;
  *)
    echo "Usage: $0 {start|stop|restart|reload}" >&2
    exit 1
  ;;
esac

exit 0

Прописываем наш скрипт для всех уровней исполнения в системе:

# update-rc.d squid3-ordinary defaults

У Squid v.3 имеется детская особенность неконтролируемо выбирать всю доступную оперативную память, таким образом, что операционная система перемещает часть операций с памятью в "своп", вызывая дикое замедление работы. Чтобы иметь возможность оперативно выявить перерасход памяти, я не придумал ничего лучше закручивания бесконечной циклической проверки его состояния в специальном сценарии скрипта, который мы сейчас и напишем:

# touch /etc/squid3/squid-control.sh
# chmod ugo+x /etc/squid3/squid-control.sh

#!/bin/bash

export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin/

# Принимаем в переменные с "говорящими" именами входящие аргументы
INSTANCE=${0}
TARGET=${1}

MANAGING="/etc/init.d/squid3-${TARGET}"
LOG="/var/log/squid3/control-${TARGET}.log"
HOSTNAME=`cat /etc/hostname`
DATE=`date +"%Y-%m-%d %H:%M:%S"`
EMAIL="email0@example.net email1@example.net"

function send-report() {
  local LOCAL_REPORT=$1
  echo -e "Content-Type: text/plain; charset="utf-8"\nSubject: Warning Proxy: Squid3-${TARGET}\n${DATE}.\nProxy: Squid3-${TARGET}.\n${LOCAL_REPORT}" | sendmail -F${HOSTNAME} ${EMAIL}
return ${?}
}

# Определяем значение переменной лимита освоенной приложением памяти, попутно проверяя корректность вводных данных
case "${TARGET}" in
  ordinary)
    # Лимит памяти цифрой, без кавычек
    MEMORY_LIMIT=80
  ;;
  transparent)
    MEMORY_LIMIT=10
  ;;
  *)
    echo "Usage: $0 {ordinary|transparent}" >&2
    exit 1
  ;;
esac

# Закручиваем бесконечный цикл проверки состояния
while :
do

  # Узнаём идентификатор процесса
  PID=`cat /var/run/squid3-${TARGET}.pid`

  # Получаем в переменную среднее арифметическое значение использования памяти Squid в виде процента от общего объёма в заданный промежуток времени (за три секунды, например)
  MEMORY_USED=`top -b -n 3 -d 1 -p ${PID} | grep --extended-regexp "^[ ]*${PID}[ ]+" | awk '{print $10}' | awk '{sum+=$1} END {print sum/NR}'`

  # Округляем значение до целого числа
  MEMORY_NORM=`echo "scale=0; ${MEMORY_USED}/1" | bc`

  if [ "${MEMORY_NORM}" -gt "${MEMORY_LIMIT}" ]
  then
    # Если Squid перерасходовал оперативную память - перезапускаем его
    DATE=`date +"%Y-%m-%d %H:%M:%S"`
    echo "${DATE}: Restart Squid-${TARGET} as fixed memory overrun..." >> ${LOG}
    send-report "Warning! Restart Squid-${TARGET} as fixed memory overrun..."

   ${MANAGING} restart
  fi

  # Выжидаем время до следующей проверки
  sleep 30
done &
# Бесконечный цикл, описанный выше, выносим в режим фонового исполнения (command &)

exit 0

Теперь можно и запустить наш прокси-сервер:

# /etc/init.d/squid3-ordinary start

Если повезло не совершить ни одной ошибки в процессе составления конфигурационных файлов и скриптов управления, то можно будет убедится в том, что Squid прослушивает определённый ему порт в ожидании запросов от клиентов:

# netstat -apn | grep -i squid

....
tcp  0  0 192.168.1.1:3128  0.0.0.0:*  LISTEN  5323/(squid)    
....


Заметки и комментарии к публикации:


Оставьте свой комментарий ( выразите мнение относительно публикации, поделитесь дополнительными сведениями или укажите на ошибку )