Библиотека сайта rus-linux.net
2. Получение и компиляция Squid
2.1 Какие файлы мне загрузить ?
Вам необходимо скачать файл архива исходных текстов с именем вида squid-x.y.z-src.tar.gz (к примеру, squid-1.1.6-src.tar.gz) с домашней страницы Squid или с FTP-сайта Squid. Доступны также изменения (diffs) для обновления до новой версии. Накладываются при помощи программы patch (доступна с сайта GNU FTP).
2.2 Как мне откомпилировать Squid?
Для версий Squid-1.0 и Squid-1.1 вы можете просто сделать make из корневой директории куда распакованы файлы исходников. К примеру:
% tar xzf squid-1.1.21-src.tar.gz % cd squid-1.1.21 % make
Для Squid-2 вам необходимо запустить скрипт configure прежде чем запускать make:
% tar xzf squid-2.0.RELEASE-src.tar.gz % cd squid-2.0.RELEASE % ./configure % make
2.3 Какой компилятор мне необходим?
Чтобы откомпилировать Squid, вам будет необходим компилятор ANSI C. Большинство современных систем Unix поставляются с уже установленными компиляторами, которые работают отлично. Старые компиляторы SunOS не поддерживают ANSI C и компилятор Sun для Solaris - должен быть заказан отдельно.
Если у вас есть сомнения относительно C-компилятора вашей системы, можете воспользоваться компилятором GNU C, он доступен на сайте GNU FTP. В добавок к gcc, вам возможно понадобится установить пакет binutils.
2.4 Что еще мне необходимо для компиляции Squid?
Вам понадобится также установить Perl на вашу систему.
2.5 А есть откомпилировннык бинарники?
Разработчики не имеют возможности собирать и выкладывать откомпилированные бинарники. Вместо этого мы вкладываем усилия в разработку максимально портабельного кода. Некторые люди выкладывают бинарные пакеты для общего использования. См. нашу Страницу поддерживаемых платформ.
На сайте SGI Freeware есть откомпилированные пакеты для SGI IRIX.
Бинарники Squid для FreeBSD на Alpha и Intel.
Бинарники Squid для r NetBSD на различных платформах
2.6 Как мне наложить патч ?
Вам необходима программа patch
. You should probably duplicate the
entire directory structure before applying the patch. К примеру, если вы обновляете
версию squid-1.1.10 до 1.1.11, вам необходимо выполнить такие команды:
cd squid-1.1.10 mkdir ../squid-1.1.11 find . -depth -print | cpio -pdv ../squid-1.1.11 cd ../squid-1.1.11 patch < /tmp/diff-1.1.10-1.1.11После того, как патч наложен, вы должны пересобрать Squid с самого начала, т.е.:
make realclean ./configure make make installЗаметьте, что в более поздних дистрибутивах (Squid 2), 'realclean' было заменено на 'distclean'.
Если patch запрашивает вас имя файла, попробуйте добавить ключ ``-p0'':
patch -p0 < filename
Если ваша программа patch
отказывается работать, вы должны загрузить
более свежую версию с сайта
GNU FTP, к примеру.
2.7 Опции configure.
Конфигурационный скрипт имеет большое кол-во опций. Наиболее полезная -
это --prefix
, предназначенная для установки Squid в различные
директории. По умолчанию пакет ставится в директорию /usr/local/squid/. Чтобы
изменить значение по умолчанию, вам необходимо сделать:
% cd squid-x.y.z % ./configure --prefix=/some/other/directory/squid
Наберите
% ./configure --helpчтобы просмотреть список доступных опций. Вам понадобится указать некторые из этих опций, чтобы включить/выключить использование определенных возможностей. Некоторые наиболее часто используемые опции:
--prefix=PREFIX устанавливать архитектурно-независимые файлы в PREFIX [/usr/local/squid] --enable-dlmalloc[=LIB] откомплировать и использовать пакет malloc от Doug Lea --enable-gnuregex поддержка GNUregex --enable-splaytree использовать SPLAY-дерево для хранения списков ACL --enable-xmalloc-debug включить простейшую отладку для malloc --enable-xmalloc-debug-trace детальная трасировка использования памяти --enable-xmalloc-statistics показывать статистику malloc на странице статуса --enable-carp включить поддержку CARP --enable-async-io включить ASYNC операции I/O для диска, используя треды --enable-icmp включить пингование ICMP --enable-delay-pools включить delay pools для органичения полосы пропускания --enable-mem-gen-trace включить трассировку memory stuff --enable-useragent-log включить журналирование заголовка User-Agent --enable-kill-parent-hack убрать парента при окончании работы --enable-snmp включить мониторинг SNMP --enable-time-hack брать значение времени только раз в секунду --enable-cachemgr-hostname[=hostname] использовать cachemgr.cgi по умолчанию для этого хоста --enable-arp-acl включить использование списков ARP ACL (по MAC-адресам) --enable-htpc включить поддержку протокола HTCP --enable-forw-via-db включить оддержку базы Forw/Via --enable-cache-digests использовать Cache Digests см. http://squid.opennet.ru/FAQ/my/FAQrus-16.html --enable-err-language=lang выбрать язык для страниц с сообщениями о ошибкахs,hfnm zpsr lkSelect language for Error pages (see errors dir)
2.8 undefined reference to __inet_ntoa
от Kevin Sartorelli и Andreas Doering.
Скорее всего вы недавно установили bind 8.x. Есть несоответствие между заголовочными файлами и библиотекой DNS, которую обнаружил Squid. Есть пара вариантов, кторые вы можете попробовать, чтобы исправить это.
Во-первых, попробуйте добавить -lbind
к XTRA_LIBS в src/Makefile.
Если уже указано -lresolv
, удалите.
Если по прежнему ничего не работает, отредактируйте файл arpa/inet.h, закомментировав следующие строки:
#define inet_addr __inet_addr #define inet_aton __inet_aton #define inet_lnaof __inet_lnaof #define inet_makeaddr __inet_makeaddr #define inet_neta __inet_neta #define inet_netof __inet_netof #define inet_network __inet_network #define inet_net_ntop __inet_net_ntop #define inet_net_pton __inet_net_pton #define inet_ntoa __inet_ntoa #define inet_pton __inet_pton #define inet_ntop __inet_ntop #define inet_nsap_addr __inet_nsap_addr #define inet_nsap_ntoa __inet_nsap_ntoa
2.9 Как мне получить действительное DNS TTL в IP-rtit Squid?
Если у вас есть исходники BIND, вы можете модифицировать их как указано ниже. При этом глобальная переменная _dns_ttl_ будет установлена в TTL для последующих запросов. Потом, когда вы будете компилировать Squid, конфигурационный скрипт будет искать _dns_ttl_ symbol в libresolv.a. Если найдено, то dnsserver будет возвращать значение TTL для каждого запроса.
Код представлен Endre Balint Nagy.
diff -ru bind-4.9.4-orig/res/gethnamaddr.c bind-4.9.4/res/gethnamaddr.c --- bind-4.9.4-orig/res/gethnamaddr.c Mon Aug 5 02:31:35 1996 +++ bind-4.9.4/res/gethnamaddr.c Tue Aug 27 15:33:11 1996 @@ -133,6 +133,7 @@ } align; extern int h_errno; +int _dns_ttl_; #ifdef DEBUG static void @@ -223,6 +224,7 @@ host.h_addr_list = h_addr_ptrs; haveanswer = 0; had_error = 0; + _dns_ttl_ = -1; while (ancount-- > 0 && cp < eom && !had_error) { n = dn_expand(answer->buf, eom, cp, bp, buflen); if ((n < 0) || !(*name_ok)(bp)) { @@ -232,8 +234,11 @@ cp += n; /* name */ type = _getshort(cp); cp += INT16SZ; /* type */ - class = _getshort(cp); - cp += INT16SZ + INT32SZ; /* class, TTL */ + class = _getshort(cp); + cp += INT16SZ; /* class */ + if (qtype == T_A && type == T_A) + _dns_ttl_ = _getlong(cp); + cp += INT32SZ; /* TTL */ n = _getshort(cp); cp += INT16SZ; /* len */ if (class != C_IN) {
А это заплатка для BIND-8:
*** src/lib/irs/dns_ho.c.orig Tue May 26 21:55:51 1998 --- src/lib/irs/dns_ho.c Tue May 26 21:59:57 1998 *************** *** 87,92 **** --- 87,93 ---- #endif extern int h_errno; + int _dns_ttl_; /* Definitions. */ *************** *** 395,400 **** --- 396,402 ---- pvt->host.h_addr_list = pvt->h_addr_ptrs; haveanswer = 0; had_error = 0; + _dns_ttl_ = -1; while (ancount-- > 0 && cp < eom && !had_error) { n = dn_expand(ansbuf, eom, cp, bp, buflen); if ((n < 0) || !(*name_ok)(bp)) { *************** *** 404,411 **** cp += n; /* name */ type = ns_get16(cp); cp += INT16SZ; /* type */ ! class = ns_get16(cp); ! cp += INT16SZ + INT32SZ; /* class, TTL */ n = ns_get16(cp); cp += INT16SZ; /* len */ if (class != C_IN) { --- 406,416 ---- cp += n; /* name */ type = ns_get16(cp); cp += INT16SZ; /* type */ ! class = _getshort(cp); ! cp += INT16SZ; /* class */ ! if (qtype == T_A && type == T_A) ! _dns_ttl_ = _getlong(cp); ! cp += INT32SZ; /* TTL */ n = ns_get16(cp); cp += INT16SZ; /* len */ if (class != C_IN) {
2.10 Моя платформа - BSD/OS или BSDI и я не могу откомпилировать Squid.
cache_cf.c: In function `parseConfigFile': cache_cf.c:1353: yacc stack overflow before `token' ...
Вам возможно необходимо обновить установленную вами gcc до более свежей версии. Проверьет вашу версию gcc при помощи
gcc -vЕсли версия более ранняя, чем 2.7.2, вам необходимо ее обновить.
Другой вариант - можете взять уже откомпилированный бинарник Squid для BSD/OS 2.1 на the BSD patches FTP site, патч U210-019.
2.11 Проблемы компиляции libmiscutil.a на Solaris.
Подобная ошибка появляется на системах Solaris, которые используют gcc, когда Solaris C-компилятор не установлен:
/usr/bin/rm -f libmiscutil.a /usr/bin/false r libmiscutil.a rfc1123.o rfc1738.o util.o ... make[1]: *** [libmiscutil.a] Error 255 make[1]: Leaving directory `/tmp/squid-1.1.11/lib' make: *** [all] Error 1Обратите внимание на вторую строку /usr/bin/false. Имеетс ввиду путь ек программе ar. Если configure не может найти ar в вашей системе, то он выдает false.
Чтобы исправить это, вам необходимо:
- Добавьте /usr/ccs/bin к переменной PATH. В этом каталоге должна находится программа ar. Вы должны установить SUNWbtool если ar там нет. Либо,
- Установите пакет binutils с сайта GNU FTP. Этот пакет включает такие программы как ar, as и ld.
2.12 У меня проблемы при компиляции Squid на некоторой платформе.
Пожалуйста посетите страницу поддерживаемых платформ, на которых Squid точно компилируется. Ваша проблема может быть описана там вместе с ее решением. Если ничего подбного не указано - напиишите нам, что вы пытались сделать, укажите вашу версию Squid и проблемы, с которыми вы столкнулись.
2.13 Я вижу много предупреждений во время компиляции.
Предупреждения обычно не вызывают большого беспокойства и чаще всего связаны с тем, что ПО разрабатывалась для работы на большом кол-ве платформ. Если вы желаете исправить предупреждения, которые появаляются при компиляции, пожалуйста сделайте это, а нам отошлите патч.
2.14 Сборка Squid на OS/2
от Doug Nazar
In order in compile squid, you need to have a reasonable facsimile of a Unix system installed. Это включает в себя bash, make, sed, emx, различные утилиты работы с файлами и кое-что еще. I've setup a TVFS drive that matches a Unix file system but this probably isn't strictly necessary.
Я внес несколько изменений в древний EMX 0.9d.
- добавил дефайны для strcasecmp() & strncasecmp() в string.h
- changed all occurrences of time_t to signed long instead of unsigned long
- поправил ld.exe
- чтобы искал как xxxx.a так и libxxxx.a
- чтобы указывал верное имя файла, когда использует опцию -Zexe
Вам необходимо будет запустить scripts/convert.configure.to.os2 (в директории дистрибутива Squid), для модификации конфигурационного скрипта, чтобы он мог искать различные программы.
Далее вам необходимо установить переменные окружения (см. документы по EMX для пояснений):
export EMXOPT="-h256 -c" export LDFLAGS="-Zexe -Zbin -s"
Теперь вы готовы конфигурировать Squid:
./configure
Откомпилируйте все это:
make
и установите:
make install
По умолчанию все установится в директорию /usr/local/squid. Если вы хотите установить куда-либо еще, используйте опцию --prefix скрипта configure.
Не забывайте устанавливать EMXOPT при каждом запуске Squid. Я рекомендую использовать ключи -Y и -N.
Вперед Назад Содержание