Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта 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.

  1. добавил дефайны для strcasecmp() & strncasecmp() в string.h
  2. changed all occurrences of time_t to signed long instead of unsigned long
  3. поправил ld.exe
    1. чтобы искал как xxxx.a так и libxxxx.a
    2. чтобы указывал верное имя файла, когда использует опцию -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.


Вперед Назад Содержание