Свежие комментарии
- Ehash1 к записи Как настроить демилитаризованную зону DMZ в Mikrotik Router OS
- Рол к записи Запуск административных инструментов из cmd
- Николай к записи Как настроить демилитаризованную зону DMZ в Mikrotik Router OS
Рубрики
Настройка Squid 3 в качестве прозрачного прокси в FreeBSD
Настраиваем Squid в качестве прозрачного прокси-сервера для офисной сети. Предполагается, что маршрутизация на сервере настроена, и доступ к сайтам из внутренней сети уже работает. Используем прокси-сервер для расшифровки веб-трафика, ограничения доступа к сайтам и фильтрации медиа-контента.
Настройка ядра
Для работы в режиме прозрачного прокси необходимо обеспечить перенаправление веб-трафика прокси-серверу. Если в качестве брандмауэра используется IPFW, необходимо включить форвардинг пакетов пересобрав ядро с опцией IPFIREWALL_FORWARD. В ядре GENERIC опция перенаправления по умолчанию отключена.
В ядре GENERIC опция перенаправления по умолчанию отключена.Проверяем включено ли перенаправление пакетов командой:
grep ipfw /var/run/dmesg.boot
Получаем следующий результат:
ipfw2 (+ipv6) initialized, divert loadable, nat loadable, rule-based forwarding disabled, default to deny, logging disabled
Если видим: «rule-based forwarding disabled«, форвардинг отключен, необходимо пересобрать ядро. Если сообщение отсутствует, значит IPFW не настроен.
Получаем идентификатор ядра:
uname -i
Если ранее ядро не изменялось, в результате получаем:
GENERIC
Создаем конфиг ядра IPFORWARD, на основе GENERIC
echo include GENERIC >/usr/src/sys/i386/conf/IPFORWARD echo ident IPFORWARD >>/usr/src/sys/i386/conf/IPFORWARD
Включаем перенаправление пакетов:
echo options IPFIREWALL >>/usr/src/sys/i386/conf/IPFORWARD echo options IPFIREWALL_FORWARD >>/usr/src/sys/i386/conf/IPFORWARD
Проверяем полученный конфиг:
cat /usr/src/sys/i386/conf/IPFORWARD
В результате получаем:
include GENERIC ident IPFORWARD options IPFIREWALL options IPFIREWALL_FORWARD
Переходим в папку с исходниками системы:
cd /usr/src
Если файлы в /usr/src отсутствуют, необходимо установить исходники, соответствующие вашей версии системы.
Собираем и устанавливаем ядро, используя созданный конфиг:
make kernel KERNCONF=IPFORWARD
Перезагружаем систему:
shutdown -r now
Проверяем идентификатор ядра:
uname -i
В случае успешной установки ядра, в ответ получаем:
IPFORWARD
Проверяем статус IPFW:
grep ipfw /var/run/dmesg.boot
В случае успеха получаем:
ipfw2 (+ipv6) initialized, divert loadable, nat loadable, rule-based forwarding enabled, default to deny, logging disabled
Установка Squid
Обновляем коллекцию портов:
portsnap fetch && portsnap update || portsnap extract
Получаем список доступных версий Squid:
cd /usr/ports/www && echo squid*
Настраиваем порт:
cd /usr/ports/www/squid32 make config
В параметрах сборки включаем прозрачное проксирование для используемого брандмауэра и поддержку больших файлов:
[*] LARGEFILE Support large (>2GB) cache and log files ... [ ] TP_IPF Enable transparent proxying with IPFilter [*] TP_IPFW Enable transparent proxying with IPFW [ ] TP_PF Enable transparent proxying with PF
Устанавливаем порт:
make install clean
Для сборки пакета используются параметры по умолчанию, установленный из пакета прозрачный прокси будет работать некорректно.
Настройка Squid
Сохраняем файл конфигурации, установленный по умолчанию:
mv /usr/local/etc/squid/squid.conf /usr/local/etc/squid/squid.conf.default
Создаем новый файл конфигурации:
ee /usr/local/etc/squid/squid.conf
Задаем параметры:
#Адрес и порт для входящих подключений
#Заданный порт используется при прозрачном проксировании для
#передачи изображений на страницах ошибок и протоколом управления кэшем
http_port 3128
#Локальный интерфейс, для трафика, перенаправленного брандмауэром
http_port 127.0.0.1:3129 intercept
#Время ожидания установки TCP соединения с сервером
#По умолчанию 1 минута, если сервер не отвечает, выполняется 3 попытки установить соединение, итого время до появления ошибки 3 минуты
#Сократим таймаут до 20 секунд
connect_timeout 20 second
#При завершении работы ожидать закрытия клиентских подключений, так заявлено в документации
#По факту ждет независимо от наличия клиентских подключений
#По умолчанию - 30 секунд, сократим время ожидания до 1
shutdown_lifetime 1 seconds
#Кэш: формат, размещение, размер в мегабайтах, число папок первой и второй вложенности
#Указанный размер кэша не учитывает издержки файловой системы и должен быть примерно на 20% меньше доступного дискового пространства
#Директиву cache_dir, можно указать несколько раз, выделив под кэш дополнительные разделы
cache_dir ufs /usr/local/squid/cache 3000 16 256
#Не кэшировать файлы больше заданного размера
#По умолчанию 4Мб
maximum_object_size 320 MB
#Продолжить загрузку при отключении клиента, если осталось загрузить менее указанного объема данных
#Позволяет сохранить объект в кэше при отмене загрузки клиентом
#Значение 0 для quick_abort_min и quick_abort_max отменяют докачку
#Значение -1 включает полную закачку объекта, не зависимо от оставшегося объема, повышает нагрузку на канал
#По умолчанию 16 Кб
quick_abort_min 5 MB
#Размер кэша в оперативной памяти
#По умолчанию 256Мб
#cache_mem 256 MB
#Максимальный размер объекта, сохраняемого в оперативной памяти
#Объекты больше заданного размера в памяти не сохраняются
#maximum_object_size_in_memory 512 KB
#Отключить кеширование
#cache deny all
#Путь сохранения дампа аварийного завершения
coredump_dir /usr/local/squid/cache
#Путь и формат лог-файла
access_log daemon:/usr/local/squid/log/access.log squid
#Протоколировать параметры запросов
#По умолчанию в целях обеспечения приватности в логе не сохраняются параметры CGI-скриптов
#strip_query_terms off
#Протоколировать http-заголовки
log_mime_hdrs on
#Не отправлять заголовок X-Forwarded-For содержащий внутренний IP-адрес клиента
#forwarded_for transparent
#Не отправлять заголовок Via с именем и версией прокси-сервера
#via off
#Email администратора, для отправки уведомлений об отказе кэша
#На практике, ни одного уведомления не видел
#Адрес также отображается на страницах ошибок
cache_mgr root@localhost
#Адрес сервера, отображаемый на страницах ошибок
#По умолчанию используется функция gethostname(), которая при http_port 127.0.0.1, вернет localhost
#visible_hostname proxy.localnet.local
#
# Определяем списки контроля безопасности
#
#IP-адрес, с которого разрешен доступ к управлению кэшем
#acl CacheManagerIP src 192.168.0.2
#Обслуживаемая прокси-сервером сеть
#acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
#acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
#acl localnet src fc00::/7 # RFC 4193 local private network range
#acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
#Метод CONNECT, используется для SSL-соединений
acl CONNECT method CONNECT
#Путь к списку IP-адресов пользователей, для которых не действует фильтр сайтов и контента
#acl AdminsIP src "/usr/local/etc/squid/AccessLists/AdminsIP.txt"
#Путь к списку запрещенных сайтов
#acl RestrictedDomains dstdomain "/usr/local/etc/squid/AccessLists/RestrictedDomains.txt"
#Путь к списку доменов с рекламой
#acl AdDomains dstdomain "/usr/local/etc/squid/AccessLists/AdDomains.txt"
#Путь к списку доменов с рекламой для фильтрации по ответу
#Блокируются изображения и анимация, допускается переход по ссылкам
#acl AdDomains_ReplyFilter dstdomain "/usr/local/etc/squid/AccessLists/AdDomains_Content.txt"
#Mime-типы для блокировки рекламы
#acl AdMimeTypes rep_mime_type ^image/gif ^image/jpeg ^application/x-javascript ^application/x-shockwave-flash
#Mime-типы для аудио и видео
acl MimeAudioVideo rep_mime_type audio video
#Сайты с IP-адресами
acl UrlIP url_regex -i ^http://[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/.*
#
# Задаем права доступа
#
#Разрешить локальное управление кэшем
http_access allow manager localhost
#Разрешить удаленное управление кэшем
#http_access allow manager CacheManagerIP
http_access deny manager
#Пароли для различных действий протокола управления кэшем
#Значение disable all отключает управление кэшем
#cachemgr_passwd disable all
#Запретить метод CONNECT
#Проксирование SSL-соединений в прозрачном режиме невозможно
http_access deny CONNECT
#Запретить доступ к локальным ресурсам сервера через прокси
http_access deny to_localhost
#Первичный фильтр рекламы
#Блокируется весь контент с заданных доменов
#http_access deny AdDomains
#Страница ошибки доступа для рекламы
#Создать командой: echo "[AD]" > /usr/local/etc/squid/ERR_ADV_DENIED
#deny_info ../../ERR_ADV_DENIED AdDomains
#Не ограничивать доступ администраторам
#http_access allow AdminsIP
#Блокировать запрещенные сайты
#http_access deny RestrictedDomains
#Запретить доступ к сайтам по IP-адресу
#http_access deny UrlIP
#Разрешить доступ из локальной сети
http_access allow localnet
#Блокировать все, что не разрешено
http_access deny all
#
#Фильтрация контента, на этапе получения ответа от сервера
#
#Фильтр рекламного контента: графика, анимация, JavaScript, клики по ссылкам продолжают работать
#http_reply_access deny AdDomains_ReplyFilter AdMimeTypes
#Не ограничивать доступ администраторам
#http_reply_access allow AdminsIP
#Блокировать загрузку аудио/видео контента
#http_reply_access deny MimeAudioVideo
#Разрешить весь остальной контент
http_reply_access allow all
#Время устаревания кэшируемого контента в минутах, если явно не задано сервером
#Поля: шаблон соответствия URL, минимальное время в минутах, процент для расчета времени устаревания объекта, максимальное время в минутах
#Если повторный запрос приходит до наступления минимального времени, объект считается актуальным, запрос к серверу не выполняется
#Расчет времени жизни производится по формуле: (ВремяПолучения-ВремяСоздания)*Процент
#Чем старее объект, тем дольше он содержится в кэше, но не дольше заданного максимального времени
#Подробности: http://etutorials.org/Server+Administration/Squid.+The+definitive+guide/Chapter+7.+Disk+Cache+Basics/7.7+refresh_pattern/
#
#Время жизни объектов для FTP-протокола
#refresh_pattern ^ftp: 1440 20% 10080
#Нулевое время жизни для динамического контента
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
#Время жизни по умолчанию
refresh_pattern . 0 20% 4320
Создаем папку для списков контроля доступа
mkdir /usr/local/etc/squid/AccessLists
Создаем необходимые списки, значения в списке разделяются новой строкой.
Список IP-адресов с неограниченным доступом:
ee /usr/local/etc/squid/AccessLists/AdminsIP.txt
Список сайтов, доступ к которым запрещен пользователям. Точка в начале адреса блокирует доступ ко всем адресам в заданном домене. Для массовой блокировки развлекательных ресурсов потребуется установка редиректора SquidGuard.
ee /usr/local/etc/squid/AccessLists/RestrictedDomains.txt
Фильтр рекламы:
ee /usr/local/etc/squid/AccessLists/AdDomains.txt
Фильтр рекламы с учетом типа контента:
ee /usr/local/etc/squid/AccessLists/AdDomains_Content.txt
Рассмотренные фильтры рекламы использовались во времена помегабайтной оплаты за интернет. Основной задачей тогда была экономия трафика. В список вручную заносились домены, генерирующие значительный объем трафика. Для борьбы с рекламой, более эффективным решением будет установка редиректора SquidGuard, либо настройка фильтров в браузере клиента. Так же данный список может быть полезен для блокировки вредоносных сайтов и блокировки загрузки обновлений с внешних ресурсов, при наличии внутренних служб распространения обновлений.
Некоторые сайты используют протокол https, фильтровать который при прозрачном проксировании невозможно. Для ограничения доступа к таким сайтам придется использовать брандмауэр либо DNS-сервер, либо проксировать https традиционным, непрозрачным, способом.
Создаем папку для кэша, задаем права доступа:
mkdir -p /usr/local/squid/cache && chown root:squid /usr/local/squid/cache && chmod 770 /usr/local/squid/cache
Создаем структуру кэша:
/usr/local/sbin/squid -z
Создаем папку для логов доступа, задаем права доступа:
mkdir /usr/local/squid/log && chown root:squid /usr/local/squid/log && chmod 770 /usr/local/squid/log
Лог доступа за месяц может занимать достаточно большой объем, по этой причине в рассматриваемой конфигурации лог был размещен в /usr. Если свободного места в /var достаточно, лог доступа можно оставить в /var/log/squid.
Отображение местного времени на страницах ошибок Squid
По умолчанию на страницах ошибок Squid отображает время по Гринвичу, для отображения местного времени необходимо скорректировать шаблоны ошибок. Параметр шаблона %T указывает мировое время, %t — местное.
Копируем шаблоны ошибок в папку erros.local:
mkdir -p /usr/local/etc/squid/errors.local/ru cp /usr/local/etc/squid/errors/ru/* /usr/local/etc/squid/errors.local/ru
Заменяем общемировое время (%T), на местное (%t):
sed -i .bak "s/%T/%t/g" /usr/local/etc/squid/errors.local/ru/* && rm /usr/local/etc/squid/errors.local/ru/*.bak
Задаем путь к измененным шаблонам ошибок в squid.conf:
printf "\n\n#Отображение местного времени на страницах ошибок\nerror_directory /usr/local/etc/squid/errors.local/ru\n" >> /usr/local/etc/squid/squid.conf
Запуск Squid
Включаем Squid в rc.conf:
printf '\nsquid_enable=\"YES\"\n' >>/etc/rc.conf
Запускаем демон:
/usr/local/etc/rc.d/squid start
Проверяем, стартанул ли демон:
ps -ax | grep squid
Проверяем, слушается ли сокет:
netstat -an | grep 3128
Проверяем лог:
cat /var/log/squid/cache.log
В случае успешного старта вывод будет примерно следующим:
2013/03/03 21:29:54 kid1| Starting Squid Cache version 3.2.7 for i386-portbld-freebsd9.1... 2013/03/03 21:29:54 kid1| Process ID 40625 2013/03/03 21:29:54 kid1| Process Roles: worker 2013/03/03 21:29:54 kid1| With 7149 file descriptors available 2013/03/03 21:29:54 kid1| Initializing IP Cache... 2013/03/03 21:29:54 kid1| DNS Socket created at [::], FD 7 2013/03/03 21:29:54 kid1| DNS Socket created at 0.0.0.0, FD 8 2013/03/03 21:29:54 kid1| Adding nameserver 127.0.0.1 from /etc/resolv.conf 2013/03/03 21:29:54 kid1| Logfile: opening log daemon:/usr/local/squid/log/access.log 2013/03/03 21:29:54 kid1| Logfile Daemon: opening log /usr/local/squid/log/access.log 2013/03/03 21:29:54 kid1| WARNING: no_suid: setuid(0): (1) Operation not permitted 2013/03/03 21:29:54 kid1| WARNING: no_suid: setuid(0): (1) Operation not permitted 2013/03/03 21:29:55 kid1| Unlinkd pipe opened on FD 14 2013/03/03 21:29:55 kid1| Store logging disabled 2013/03/03 21:29:55 kid1| Swap maxSize 3072000 + 262144 KB, estimated 256472 objects 2013/03/03 21:29:55 kid1| Target number of buckets: 12823 2013/03/03 21:29:55 kid1| Using 16384 Store buckets 2013/03/03 21:29:55 kid1| Max Mem size: 262144 KB 2013/03/03 21:29:55 kid1| Max Swap size: 3072000 KB 2013/03/03 21:29:55 kid1| Rebuilding storage in /usr/local/squid/cache (clean log) 2013/03/03 21:29:55 kid1| Using Least Load store dir selection 2013/03/03 21:29:55 kid1| Set Current Directory to /usr/local/squid/cache 2013/03/03 21:29:55 kid1| Loaded Icons. 2013/03/03 21:29:55 kid1| HTCP Disabled. 2013/03/03 21:29:55 kid1| Squid plugin modules loaded: 0 2013/03/03 21:29:55 kid1| Accepting HTTP Socket connections at local=[::]:3128 remote=[::] FD 17 flags=9 2013/03/03 21:29:55 kid1| Accepting NAT intercepted HTTP Socket connections at local=127.0.0.1:3128 remote=[::] FD 18 flags=41 2013/03/03 21:29:55 kid1| Done reading /usr/local/squid/cache swaplog (0 entries) 2013/03/03 21:29:55 kid1| Store rebuilding is 0.00% complete 2013/03/03 21:29:55 kid1| Finished rebuilding storage from disk. 2013/03/03 21:29:55 kid1| 0 Entries scanned 2013/03/03 21:29:55 kid1| 0 Invalid entries. 2013/03/03 21:29:55 kid1| 0 With invalid flags. 2013/03/03 21:29:55 kid1| 0 Objects loaded. 2013/03/03 21:29:55 kid1| 0 Objects expired. 2013/03/03 21:29:55 kid1| 0 Objects cancelled. 2013/03/03 21:29:55 kid1| 0 Duplicate URLs purged. 2013/03/03 21:29:55 kid1| 0 Swapfile clashes avoided. 2013/03/03 21:29:55 kid1| Took 0.04 seconds ( 0.00 objects/sec). 2013/03/03 21:29:55 kid1| Beginning Validation Procedure 2013/03/03 21:29:55 kid1| Completed Validation Procedure 2013/03/03 21:29:55 kid1| Validated 0 Entries 2013/03/03 21:29:55 kid1| store_swap_size = 0.00 KB 2013/03/03 21:29:56 kid1| storeLateRelease: released 0 objects
По поводу «WARNING: no_suid: setuid(0): (1) Operation not permitted», отслеживаем баг-репорт: http://bugs.squid-cache.org/show_bug.cgi?id=3785.
В брандмауэре разрешаем исходящие подключения для Squid (порядковый номер правила и внешний интерфейс необходимо задать свой):
ipfw add 110 allow tcp from me to any out via em0 keep-state uid squid
Перенаправляем веб-трафик с тестового компьютера в Squid:
ipfw add 120 fwd 127.0.0.1,3129 tcp from 192.168.0.2 to any 80-83,8080-8088 out via em0
Инициируем веб-трафик с тестового компьютера и проверяем лог доступа:
cat /usr/local/squid/log/access.log
В случае проблем проверяем, работает ли правило брандмауэра:
ipfw show
Счетчик для правила перенаправления не должен быть нулевым.
Если при тестировании проблем не выявлено, заворачиваем в прокси всю подсеть:
ipfw add 120 fwd 127.0.0.1,3129 tcp from 192.168.0.0/16 to any 80-83,8080-8088 out via em0
Протокол управления кэшем
Если управление кэшем не было запрещено в конфиге, используем squidclient для получения статистики и оперативного управления.
Получить общую статистику сервера:
squidclient -h 127.0.0.1 cache_object://localhost/info
Получить список доступных команд:
squidclient -h 127.0.0.1 cache_object://localhost/menu
Управление кэшем возможно также из браузера. Статистика сервера доступна по адресу: http://адрес.прокси.сервера:3128/squid-internal-mgr/info, список команд: http://адрес.прокси.сервера:3128/squid-internal-mgr/menu.
Ротация лога доступа Squid
Настраиваем ежемесячную ротацию и архивацию access.log
Создаем скрипт RotateAccessLog:
ee /usr/local/etc/squid/RotateAccessLog
Со следующим содержимым:
#!/bin/sh
#Задаем число хранимых архивов
ArcCount=12
#Предварительно запускаем парсер LightSquid
#/usr/local/www/lightsquid/lightparser.pl today
#Выполнить ротацию, выход при ошибке.
/usr/local/sbin/squid -k rotate || return 1
#Ротация производится в фоновом режиме, ждем завершения 10 секунд.
sleep 10
#Удаляем старый cache.log.1, новый сохраняется с именем cache.log.0.
rm /var/log/squid/cache.log.1 2>/dev/null
#Удаляем старый store.log.1
rm /var/log/squid/store.log.1 2>/dev/null
i=$(($ArcCount-1))
#Переходим в папку с логами, выход, если папка не существует.
cd /usr/local/squid/log || return 1
#Удаляем самый старый архив.
rm access.log.$i.bz2 2>/dev/null
#Выполняем ротацию
while [ $i -gt 0 ]
do
mv access.log.$(($i-1)).bz2 access.log.$i.bz2 2>/dev/null
i=$(($i-1))
done
#Архивируем лог доступа.
bzip2 access.log.0
Разрешаем запуск скрипта:
chmod 700 /usr/local/etc/squid/RotateAccessLog
Выполняем тестовый запуск:
/usr/local/etc/squid/RotateAccessLog
Проверяем, создан ли архив:
ls -l /usr/local/squid/log/*.bz2
Настраиваем cron на ежемесячный запуск первого числа в полночь:
printf '\n0\t0\t1\t*\t*\troot\t/usr/local/etc/squid/RotateAccessLog\n' >>/etc/crontab && cat /etc/crontab
Автоматический перезапуск Squid при отказе
Squid 2.7 изредка грешил периодическими отказами, оставляя при этом сеть без доступа к вебу. Хотя в третьей версии таких безобразий более не замечено, лишняя проверка не повредит. Проверяем сценарием, загружен ли Squid и запускаем при необходимости. Попутно, чистим кэш, при обнаружении сообщения о нехватке дискового пространства.
Создаем сценарий AutoRestart:
ee /usr/local/etc/squid/AutoRestart
Со следующим содержимым:
#!/bin/sh #Точка монтирования файловой системы FS=/usr #Путь к кэшу CacheDir=/usr/local/squid/cache #Проверяем, загружен ли Squid, выходим в случае успеха /usr/local/sbin/squid -k check >/dev/null 2>&1 && return #При нехватке дискового пространства, удаляем кэш #Если обнаружено сообщение filesystem full в журнале messages if grep $fs:\ filesystem\ full /var/log/messages; then #Уведомляем об ошибке echo Disk full detected, cleanup #Удаляем кэш с предварительной проверкой, что заданный путь указывает именно на кэш test -f $CacheDir/swap.state && rm -R $CacheDir/* #Создаем структуру кэша /usr/local/sbin/squid -z fi #Запускаем демон /usr/local/etc/rc.d/squid start
Разрешаем запуск скрипта:
chmod 700 /usr/local/etc/squid/AutoRestart
Выполняем тестовый запуск:
/usr/local/etc/rc.d/squid stop /usr/local/etc/squid/AutoRestart
Запускаем через cron каждые 15 минут:
printf '\n*/15\t*\t*\t*\t*\troot\t/usr/local/etc/squid/AutoRestart\n' >>/etc/crontab && cat /etc/crontab
В случае проблем на почту root’у будет отправлено уведомление.
Анализ логов Squid
LightSquid — анализатор лога доступа, написанный на Perl. Каждые полчаса сканирует лог доступа и формирует отчеты по трафику для каждого пользователя (IP-адреса) за день, за месяц, за год. Фиксирует загрузку больших файлов, почасовую активность пользователя, строит рейтинг сайтов по объему потребленного трафика. Для просмотра отчетов потребуется веб-сервер. Инструкции по настройке ищем здесь.
Список других анализаторов доступен на сайте проекта: http://www.squid-cache.org/Misc/log-analysis.html
Решение проблем
Если в cache.log постоянно пишутся предупреждения:
WARNING: transparent proxying not supported
При сборке не была включена поддержка прозрачного прокси для вашего брандмауэра. Переустановите Squid из коллекции портов с включением соответствующих параметров.
Если получаем следующие предупреждения:
WARNING: (A) '192.168.0.0/16' is a subnetwork of (B) '::/0' WARNING: because of this '192.168.0.0/16' is ignored to keep splay tree searching predictable WARNING: You should probably remove '192.168.0.0/16' from the ACL named 'all'
Обнаружена декларация acl all. В третьей версии список доступа all создается сквидом автоматически, его декларация не требуется. Удалите или переименуйте acl all.
Дополнительная информация
Список всех параметров конфигурации: /usr/local/etc/squid/squid.conf.documented
Документация на сайте проекта: http://www.squid-cache.org/Doc/
Bog BOS: Squid (кеширующий прокси для http): установка, настройка и использование
По материалам: itadept.ru/freebsd-squid/
Рубрика: *Proxy, *Unix,*Linux
Оставить комментарий
Настройка репликации postgresql
Встроенная потоковая репликация (Streaming Replication), есть в PostgreSQL начиная с версии 9.0, , усовершенствованна и реализована с помощью передачи WAL (write-ahead logs, журналов (логов) опережающей записи) с главного (Master/Primary) сервера на подчиненный (Slave/Secondary/Replica).
Это асинхронная репликация Master/Slave, когда на ведущий/главный сервер идут запросы, приводящие к изменениям в БД, а на подчиненном сервере эти изменения будут выполнены только через некоторое время. В данном случае реализация состоит в том, что создается сетевое подключение между Standby и Master СУБД вместо копирования журналов по 16 мегабайт, как при Warm Standby и Hot Standby. Как известно, механизм используемый в Warm Standby и Hot Standby основан на пересылке от мастера к слейву.
Мы сначала настроим Hot Standby репликацию, а затем добавим возможность потоковой репликации.
Можно совмещать Hot Standby и Streaming Replication. Это позволяет увидеть на слейве почти мгновенно изменения, выполненные на мастере. Хотя и при работе только потоковой репликации записи с WAL-логов востанавливаются сразу же при процессе их получения. При потоковой репликации на серверах создаются специальных два дополнительных процесса walsender и walreceiver на каждую пару серверов управления базами данных, взаимодействующих между собой через сеть. Потоковая репликация позволяет легко реализовать работу нескольких ведомых.
Исходные данные.
Мастер-сервер ip-адрес: 192.168.200.62
Slave-сервер ip-адрес: 192.168.51.52
postgresql версия: 9.0.8. Важно! Для настройки репликации postgresql: Версия postgresql и операционной системы должна быть одинаковой для мастера и slave серверов
OS: OpenSuSE 11.4
1. Внесем некоторые изменения на мастер сервере:
mkdir /opt/scripts
mkdir /usr/local/pgsql/wal_archive
chown postgres /usr/local/pgsql/wal_archive
2. Добавим скрипты необходимые для репликации postgresql:
/opt/scripts/master_save_wal.pl:
/opt/scripts/slave_get_wal.pl:
/opt/scripts/slave_wal_cleanup.pl:
3. На мастер сервере в конфигурационном файле /usr/local/pgsql/postgresql.conf добавим следующий строчки:
wal_level = hot_standby
archive_mode = on
archive_command = ‘/opt/scripts/master_save_wal.pl %p %f /usr/local/pgsql/wal_archive’
archive_timeout = 3600
4. Перезагрузим postgresql и убедимся что wal-logs создаются в директории /usr/local/pgsql/wal_archive:
/etc/init.d/postgres restart
ls -al /usr/local/pgsql/wal_archive/
psql -c «select pg_switch_xlog();»
ls -al /usr/local/pgsql/wal_archive/
Для возможности создания снимка данных postgresql посылается запрос к серверу:
select pg_start_backup(‘label’,true);
,где ‘label’ может быть любым словом.
Этот запрос переводит мастер в режим создание резервной копии, при котором можно копировать директорию data на slave (например rsync). Полученный таким образом «snapshot» будет не противоречивый и будет содержать файл, указывающий ведомому серверу когда он был сделан для дальнейшего приведения данных в БД к актуальному состоянию. До посылки на мастере запроса «select pg_stop_backup();» никакие изменения в базу не записываются, а заносятся в транзакционные логи, что стоит учесть и не забывать выйти с данного режима.
5. Переводим мастер в режим бекапа:
psql -c «SELECT pg_start_backup(‘label’, true)»
6. Останавливаем postgresql на slave:
/etc/init.d/postgres stop
7. Копируем postgresql instance на slave:
rsync —rsh=ssh -avrz —progress —delete —exclude=pg_xlog —exclude=postmaster.pid [email protected]:/usr/local/pgsql/data/ /usr/local/pgsql/data/
После окончания не забудем выключить режим бекапов на мастере:
psql -c «SELECT pg_stop_backup()»
8. Для настройки репликации postgresql на slave-сервере. Создадим файл следующего содержания:
/usr/local/pgsql/data/recovery.conf:
standby_mode = ‘on’
restore_command = ‘/opt/scripts/slave_get_wal.pl %f %p /usr/local/pgsql/wal_archive_in’
trigger_file = ‘/usr/local/pgsql/data/trigger_file’
archive_cleanup_command = ‘/opt/scripts/slave_wal_cleanup.pl %r /usr/local/pgsql/wal_archive_in’
#primary_conninfo = ‘host=192.168.200.62 port=5432 user=postgres’ //для потоковой репликации
trigger_file нужен для того, чтобы в случае падения мастера, можно было бы сделать слейв-мастером. Т.е. доступным на запись.
9. На slave-сервере внесем одно изменение в файл /usr/local/pgsql/postgresql.conf:
hot_standby=on
Создадим директорию в которую будут попадать wal-logs с мастера:
mkdir /usr/local/pgsql/wal_archive_in
chown -R postgres /usr/local/pgsql/wal_archive_in
10. Запускаем postgresql на slave-сервере:
/etc/init.dpostgres start
11.Добавим в cron пользователя postgres копировать wal-logs с мастер сервера:
* * * * * /opt/scripts/wal_copy.pl [email protected]:/usr/local/pgsql/wal_archive/ /usr/local/pgsql/wal_archive_in 2>&1 | /bin/logger -t pgsql.error
12. Для настройки потоковой репликации postgresql достаточно на мастер сервере:
/usr/local/pgsql/data/postgresql.conf:
max_wal_senders = 2
13. Добавить в файл /usr/local/pgsql/data/pg_hba.conf :
# for streaming replication
host replication postgres 192.168.51.52/32 trust
14. На slave расскоментировать строку:
primary_conninfo = ‘host=192.168.200.62 port=5432 user=postgres’
15. Мониторинг репликации postgresql:
При настроенной репликации на мастере и slave запускаются дополнительные процессы: postgres: wal sender process и postgres: wal receiver process, соответственно.
postgres 3510 11745 0 Apr15 ? 00:21:11 postgres: wal sender process postgres 192.168.51.52(47161) streaming 19/E493D4F8
postgres: wal receiver process streaming 19/E496A050
Для анализа от полученных результатов нужно взять только шестнадцатиричное (HEX) значение, которое после слеша ‘/’ и перевести в десятичный (DEC) формат. Разница этих чисел даст некоторое значение от которого можно отталкиваться при подсчете отставания слейва от мастера. Для перевода HEX to DEC, т.е. шестнадцатиричного в десятичное число можно воспользоваться, к примеру, такими утилитами:
echo «ibase=16; FF»|bc
255
printf «%d\n» 0xff
255
Если у вас есть некоторая таблица в которую данные поступают регулярну то можно просто написать запрос который будет сравнивать время последнего изменения в данной таблицы с текущим — таким образом можно будет определить на сколько отстает slave от мастера.
Ссылки:
Мониторинг репликации postgresql
Настройка репликации postgresql
Рубрика: *CentOS, *Unix,*Linux, FreeBSD
Оставить комментарий
Установка веб-сервера apache22+php52

Apache HTTP-сервер (сокращение от англ. a patchy server) — свободный веб-сервер.
Система конфигурации Apache основана на текстовых конфигурационных файлах. Имеет три условных уровня конфигурации:
— Конфигурация сервера (httpd.conf).
— Конфигурация виртуального хоста (httpd.conf c версии 2.2 extra/httpd-vhosts.conf).
— Конфигурация уровня директории (.htaccess).
Ставить будем apache22+php52
==============================================================
Часть 1 — Устанавливаем веб-сервер Apache
==============================================================
Первое, с чего необходимо начинать любую установку, это обновление портов . Рекомендую держать Ваши порты в current состоянии.
Далее, переходим в порты:
|
|
выполняем установку:
|
|
Появится окошко выбора устанавливаемых опций, оставляем все в дефолте и нажимаем Ок
Полезные советы:
Если вам понадобится выбрать другие опции в апаче (или в любом другом порту), выполните /usr/ports/www/apache22/make config
после этого /usr/ports/www/apache22/make deinstall clean && make install clean. При удалении программы, например apache, она будет работать до ее выключения или перезагрузки системы.
Если вам нужно удалить порт, выполните /usr/ports/www/apache22/make deinstall clean
Если, при установке какого-либо порта, Вы получаете похожую ошибку —
===> apache-2.2.21 is already installed
You may wish to ``makedeinstall''andinstallthis port again
by ``makereinstall''to upgrade it properly.
If you really wish to overwrite the old port of www/apache22
without deleting it first,setthe variable"FORCE_PKG_REGISTER"
inyour environment or the"make install"commandline.
*** Error code 1
Stopin/usr/ports/www/apache22.
*** Error code 1Значит порт, который вы ставите, или явно зависящий от него порт — уже установлены. Если это порт-зависимость, то перейдите к этому порту и выполните make deinstall clean, после чего вернитесь в порт, который вы ставили, и продолжайте установку. Зависимость он установит сам.
После успешной установки, конфигурационные файлы Вы найдете в /usr/local/etc/apache22/
Добавляем apache в автозагрузку apache
echo'apache22_enable="YES"'>>/etc/rc.conf==============================================================
Часть 2 — Устанавливаем PHP5.2
==============================================================
Далее устанавливаем модуль PHP. Так как мы будем использовать версию PHP 5.2, то переходим в соответствующий порт и запускаем установку:
cd/usr/ports/lang/php52
/usr/ports/lang/makeinstallcleanПоявится меню выбора соответствующих модулей, нам необходимо поставить галочку на:
[X] APACHE Build Apache moduleи нажимаем Ок
Дожидаемся окончания процесса установки. В конфигурационный файл apache httpd.conf автоматически будет добавлен модуль PHP:
LoadModule php5_module libexec/apache22/libphp5.soА программа установки напоследок выдаст следующее сообщение:
***************************************************************
Make sure index.php is part of your DirectoryIndex.
You should add the following to your Apache configurationfile:
AddType application/x-httpd-php.php
AddType application/x-httpd-php-source.phps
***************************************************************Последние две строчки мы должны добавить в главный конфигурационный файл веб-сервера /usr/local/etc/apache22/httpd.conf в директиву IfModule mime_module
В директиве Directorylndex можно задать несколько имен файлов. Если первый документ, указанный в строке, не найден в каталоге, то сервер ищет следующий и, в случае успеха, передает его клиенту. Чтобы разрешить в качестве индексных страниц передавать файлы index.php или index.phps, приведите строку Directorylndex к такому виду:
DirectoryIndex index.html index.html.var index.php index.phpsЧто бы проверить, что мы ничего не забыли, выполните следующую команду и сравните результат с моим:
/usr/local/etc/apache22]# cat httpd.conf | grep php
LoadModule php5_module libexec/apache22/libphp5.so
DirectoryIndex index.html index.html.var index.php index.phps
AddType application/x-httpd-php.php
AddType application/x-httpd-php-source.phpsНа этом, работа с PHP еще не закончена. Возвращаемся в порты и переходим к установке модулей PHP:
cd/usr/ports/lang/php52-extensions/
/usr/ports/lang/php52-extensions]# make install cleanПоявится окно с выбором модулей. Здесь Вы должны выбрать модули, которые планируете использовать в дальнейшей работе вашего веб-сервера.
Мне необходимы следующие модули:
Optionsforphp52-extensions 1.3_1
│ │ [X] BCMATHbcstyle precision math functions
│ │ [X] BZ2bzip2library support
│ │ [ ] CALENDAR calendar conversion support
│ │ [X] CTYPE ctype functions
│ │ [X] CURL CURL support
│ │ [ ] DBA dba support
│ │ [ ] DBASE dBase library support
│ │ [X] DOM DOM support
│ │ [X] EXIF EXIF support
│ │ [X] FILEINFO fileinfo support
│ │ [X] FILTER input filter support
│ │ [ ] FRIBIDI FriBidi support
│ │ [ ] FTP FTP support
│ │ [X] GD GD library support
│ │ [X] GETTEXT gettext library support
│ │ [ ] GMP GNU MP support
│ │ [X] HASH HASH Message Digest Framework
│ │ [X] ICONV iconv support
│ │ [X] IMAP IMAP support
│ │ [ ] INTERBASE Interbase 6 database support (Firebird)
│ │ [X] JSON JavaScript Object Serialization support
│ │ [ ] LDAP OpenLDAP support
│ │ [X] MBSTRING multibyte string support
│ │ [X] MCRYPT Encryption support
│ │ [ ] MHASH Crypto-hashing support
│ │ [ ] MING ming shockwave flash support
│ │ [X] MSSQL MS-SQL database support
│ │ [X] MYSQL MySQL database support
│ │ [X] MYSQLI MySQLi database support
│ │ [ ] NCURSES ncurses support (CLI only)
│ │ [ ] ODBC unixODBC support
│ │ [X] OPENSSL OpenSSL support
│ │ [ ] PCNTL pcntl support (CLI only)
│ │ [X] PCRE Perl Compatible Regular Expression support
│ │ [ ] PDF PDFlib support (implies GD)
│ │ [ ] PDO PHP Data Objects Interface (PDO)
│ │ [ ] PDO_SQLITE PDO sqlite driver
│ │ [ ] PDO_MYSQL PDO mysql driver
│ │ [ ] PGSQL PostgreSQL database support
│ │ [X] POSIX POSIX-like functions
│ │ [X] PSPELL pspell support
│ │ [ ] READLINE readline support (CLI only)
│ │ [ ] RECODE recode support
│ │ [X] SESSION session support
│ │ [ ] SHMOP shmop support
│ │ [X] SIMPLEXML simplexml support
│ │ [X] SNMP SNMP support
│ │ [ ] SOAP SOAP support
│ │ [X] SOCKETS sockets support
│ │ [X] SPL Standard PHP Library
│ │ [ ] SQLITE sqlite support
│ │ [ ] SYBASE_CT Sybase database support
│ │ [ ] SYSVMSG System V message support
│ │ [ ] SYSVSEM System V semaphore support
│ │ [ ] SYSVSHM System V shared memory support
│ │ [ ] TIDY TIDY support
│ │ [ ] TOKENIZER tokenizer support
│ │ [ ] WDDX WDDX support (implies XML)
│ │ [X] XML XML support
│ │ [X] XMLREADER XMLReader support
│ │ [X] XMLRPC XMLRPC-EPI support
│ │ [X] XMLWRITER XMLWriter support
│ │ [X] XSL XSL support (Implies DOM)
│ │ [ ] YAZ YAZ support (ANSI/NISOZ39.50)
│ │ [X] ZIP ZIP support
│ │ [] ZLIB ZLIB supportНажимаем Ок и ждем. Установка займет какое-то время, в течении которого, вам будут предложены к установке дополнительные опции устанавливаемых модулей. Можете просто соглашаться с предлагаемыми значениями.
Если вам необходимо добавить какой-нибудь модуль PHP, например php52-zlib, Вам нет необходимости пересобирать полностью все модули. Выполняем поиск:
/usr/ports]# whereis php52-zlib
php52-zlib:/usr/ports/archivers/php52-zlibУстанавливаем:
/usr/ports/archivers/php52-zlib#/make install cleanПерезапускаем apache
/usr/local/etc/rc.d/./apache22restartВсе, Ваш модуль php52-zlib установлен и работает.
И в конце, нам необходимо показать PHP как ему работать. Делается это через файл php.ini – это файл настроек и конфигурации PHP. В нем находится ряд директив, которые определяют различное поведение PHP, ну и, следовательно, сайта.
После установки в каталоге /usr/local/etc/ будет несколько вариантов этого файлы. Скопируем и переименуем нужный нам:
cp/usr/local/etc/php.ini-dist/usr/local/etc/php.ini===================================================
Часть 3 — настройка Apache+PHP
===================================================Полезный совет:
Сделаю небольшое отступление — когда я начинал изучать apache, я делал все по разным мануалам, не до конца представляя себе конечную цель. Имею ввиду всю структуру, с дальнейшим наращиванием виртуалхостов, каких-то дополнительных программ и модулей. К чему я это говорю? А к тому, что сразу приучите себя видеть конечный результат. Делайте сразу эстетично и удобно структуру тех же каталогов и логов. Когда у Вас их будет 50, а Вы все еще будете писать все виртуалхосты в одном файле httpd-vhosts.conf — сразу же поймете как это было неправильно. При том, что можно было сразу делать удобнее. Логи хранить отдельно для каждого хоста. Ротировать их и снимать статистику. Один хост — отдельный конфиг. А в httpd-vhosts.conf только глобальные алиасы сервера.Итак, мы установили apche 2.2+PHP5.2 и прописали в http.conf использовать PHP
Для запуска apache необходимо изменить еще несколько секций в конфигурационном файле /usr/local/etc/apache22/httpd.conf
Раскомментировать и изменить значение:
ServerName на своё, например —
ServerName soulbrat.org.ua:80Раскомментировать следующие конфиги:
# Вирутал хосты
Include etc/apache22/extra/httpd-vhosts.conf
# Статистика apache
Include etc/apache22/extra/httpd-info.conf
# Различные настройки по умолчанию
Include etc/apache22/extra/httpd-default.conf
# Убедиться, что раскомментирован конфиг - тут мы будем хранить конфигурационные файлы наших виртуалхостов:
Include etc/apache22/Includes/*.confВ конфигурационном файле /etc/apache22/extra/httpd-vhosts.conf мы будем описывать только глобальные алиасы сервера и дефолтовый хост, который будет выводиться при запросе о несуществующем виртуахосте нашего сервера.
Если мы не создадим виртуалхост по-умолчанию, то при не найденных запросах, будет выводиться виртуалхост, который apache найдет первым по списку, просматривая файлы в порядке очереди — httpd.conf, httpd-vhosts.conf и дальше каталог Includes/*.conf — первый найденный конфиг в алфавитном порядке.
Удаляем все, что есть в нашем текущем /etc/apache22/extra/httpd-vhosts.conf и пишем что нам необходимо:
cat/etc/apache22/extra/httpd-vhosts.conf
NameVirtualHost *:80
# Наш виртуалхост по-умолчанию, слушает 80-й порт
# Какой домен
ServerName default
# Директория с файлами
DocumentRoot/usr/local/www/non-existent-host/www
# Подключаемые директивы, в указанном каталоге
"/usr/local/www/non-existent-host/www">
# Включаем листинг каталога (что бы отключить листинг, добавте минус Options -Indexes)
Options Indexes
# Разрешаем чтение файлов .htaccess
AllowOverride All
# Индексный файл директории
DirectoryIndex index.php
</Directory>
</VirtualHost>
#######################################################
###############ALIASES#################################
# Наш первый алиас, по этому принципу добавляются и остальные
### В алиасе выведем PHP-info для проверки работы нашего php-модуля
### php-info
Alias/testphp"/usr/local/www/test"
"/usr/local/www/test">
Options Indexes
AllowOverride All
# Запретим доступ к нашей странице, всем кроме своей сети. Незачем кому-то видеть настройки нашего PHP
Order deny,allow
Deny from all
Allow from 195.8.40.0/24
DirectoryIndex index.php
</Directory>Создаем необходимые директории и файлы:
mkdir/usr/local/www/non-existent-host
mkdir/usr/local/www/non-existent-host/www
touch/usr/local/www/non-existent-host/www/.htaccess
mkdir/usr/local/www/test
touch/usr/local/www/test/index.phpРедактируем htaccess дефолтового хоста:
ee/usr/local/www/non-existent-host/www/.htaccessЗдесь будет всего одна строчка, которая будет редиректить (перенаправлять), любой, не найденный запрос, на наш виртуалхост (любой), например -
Redirect 301 / http://soulbrat.org.uaПишем наш PHP-info
ee/usr/local/www/test/index.php
phpinfo();
?>Теперь создадим конфигурационный файл, нашего виртуалхоста:
touch/usr/local/etc/apache22/Includes/soulbrat.org.ua.conf
ee/usr/local/etc/apache22/Includes/soulbrat.org.ua.conf
###################################################
###SOULBRAT.ORG.UA######################
ServerAdmin [email protected]
DocumentRoot"/usr/www/soulbrat.org.ua/WWW"
ServerName soulbrat.org.ua
ServerAlias http://soulbrat.org.ua, www.soulbrat.org.ua
"/usr/www/soulbrat.org.ua/WWW">
Options Indexes
AllowOverride All
DirectoryIndex index.php
</Directory>
# Делаем отдельные логи для нашего хоста
ErrorLog/usr/www/soulbrat.org.ua/logs/soulbrat-error.log
CustomLog/usr/www/soulbrat.org.ua/logs/soulbrat.log combined
</VirtualHost>Мне удобно хранить все виртуалхосты в директории /usr/www — это дело вкуса каждого. Так же я создаю имена директорий по доменному имени, так удобней.
Создаем директории:
mkdir/usr/www
mkdir/usr/www/soulbrat.org.ua
mkdir/usr/www/soulbrat.org.ua/WWW
mkdir/usr/www/soulbrat.org.ua/logsСоздаем индексный файл:
touch/usr/www/soulbrat.org.ua/WWW/index.phpИ выведем в нем надпись:
ee/usr/www/soulbrat.org.ua/WWW/index.php
echo"Привет мир!";
?>В конфигурационном файле httpd.conf, мы так же включили статистику apache. Настроим ее:
ee/usr/local/etc/apache22/extra/httpd-info.conf
# включаем ExtendedStatus, меняем значение на On
ExtendedStatus On
# В директиве, добавляем разрешение просмотра этой
# страницы, только нашей внутренней сети.
/server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from 10.0.0.0/24
</Location>Сохраняем изменения.
==============================================================
Часть 4 — Запуск и проверка веб-сервера Apache
==============================================================Итак все готово, можно проверять.
Запускаем наш апач и если все нормально, Вы должны увидеть такую надпись:
/usr/local/etc/rc.d/./apache22start
Performing sanity check on apache22 configuration:
Syntax OK
Starting apache22.Проверяем что апач запущен и слушает 80-й порт
sockstat |grep80
www httpd 49729 3 tcp46 *:80 *:*
www httpd 49728 3 tcp46 *:80 *:*Видим, что все нормально. Идем дальше, открываем браузер и проверяем http://soulbrat.org.ua — если Вы увидели надпись «Привет мир!» — значит наш виртуалхост работает нормально.
Добавьте к имени алиас — http://soulbrat.org.ua/testphp и должна открыться такая страница:
А теперь введите в строке адреса, просто IP-адрес Вашего сервера — http://195.8.40.85
Если Вы снова увидели надпись «Привет мир!» — значит редирект дефолтового хоста работает так же нормально.Для просмотра статистики веб-сервера, добавим алиас в виде server-status:
http://soulbrat.org.ua/server-status
должна открыться страница текущего состояния Apache, вот такая:
На этом наша установка завершена.
Если вы, вместо PHP-info, видите белый, пустой лист — значит PHP не работает. Возможно Вы забыли прописать нужные параметры в файл httpd.conf
Если у Вас возникли проблемы с запуском, например апач ругается на какие-то файлы и не стартует, более подробную информацию Вы найдете в его логах —
cat /var/log/httpd-error.logЛоги конкретного вируалхоста Вы найдете, там, где их создали:
/usr/www/soulbrat.org.ua/logs/*logПо этой аналогии, теперь Вы можете добавлять следующие виртуалхосты и алиасы.
По материалам: soulbrat.org.ua/?p=230Рубрика: *CentOS, *Unix,*Linux, *Web, FreeBSD Оставить комментарий

RSS & RSS to Email