Итак, Squid в общих чертах настроен, пора бы его и запустить. Скрипт управления Squid мне не нравится. Избыточен и отвлекает от понимания схемы в целом, потому - пишу свой:
# aptitude install psmisc
# rm /etc/init.d/squid3
# touch /etc/init.d/squid3-ordinary
# chmod ugo+x /etc/init.d/squid3-ordinary
# 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
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
# 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
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)
....
tcp 0 0 192.168.1.1:3128 0.0.0.0:* LISTEN 5323/(squid)
....