Сборка Perl и mod_perl: Сборка Perl и mod_perl, утечки памяти, настройка


Общие замечания
Эта заметка относится к Apache 1.3. Версия 2.0 заметно отличается.

При установке ПО из исходников, я предпочитаю не «портить» систему. На большинстве серверов вы обнаружите ПО, собранное именно с общепринятыми опциями.

Поэтому я собираю ПО из-под пользователя (не root) и устанавливаю в домашней папке этого пользователя.

Сборка Perl
Зачем: утечки памяти во FreeBSD/mod_perl

Обнаружено (и это достаточно известный факт), что «родной» Perl во FreeBSD (а возможно и в других UNIX) собран с такими опциями, что mod_perl чуть-чуть «течёт» (происходит постоянная утечка памяти).

Основное зло — опция usemymalloc. Если Вы заметили, что mod_perl «течёт», то прежде всего проверьте, не установлена ли эта опция:

perl -V | grep usemymalloc

Если вы нашли запись

-Dusemymalloc=y

то дело скорее всего в этом.

Пересборка
Я пересобираю Perl вот в такой конфигурации:

#!/bin/sh
sh Configure -sde \
-Dprefix=/usr/home/c/local \
-Ui_malloc \
-Ui_iconv \
-Uinstallusrbinperl \
-Doptimize=-O2 \
-Ui_gdbm \
-Uusethreads \
-Uusemymalloc \
-Uuse64bitint \
-Uuse64bitall \
-Uuselargefiles

Этих опций мне всегда хватало.

Основные отличия от «стандартного» Perl:
• Perl устанавливается в нестандартную директорию: /usr/home/c/local. Отсюда несколько особенностей: (i) для закуска этого Perl следует указывать правильный путь; (ii) этот Perl не видит модулей, установленных для системного Perl (см. далее).
• Отключены многие функции, в том числе и родные Perl-функции управления памятью. Вместо них Perl будет использовать стандартные вызовы malloc. Разработчики утверждают, что это работает чуть медленнее, но утечек памяти не происходит.

Если вы захотите установить дополнительные модули для этого Perl, то просто вызывайте именно его (с указанием полного пути), при запуске Makefile.PL. В остальном процедура стандартная.
Сборка mod_perl

Чтобы собрать mod_perl с собственным Perl (т.е. не с системным Perl), я использую примерно такой скрипт:

#!/bin/sh
#
# опции сервера
#
a='—enable-module=info
—enable-module=usertrack
—enable-module=rewrite
—without-execstrip'
#
# массовое отключение возможностей сервера
# (иногда полезно)
#
#for i in setenvif auth alias userdir actions imap asis cgi \
# autoindex include negotiation env
#do
# a="$a —disable-module=$i"
#done
#
# куда ставим
#
root=/usr/home/c/local
#
# собираем сразу и mod_perl и сервер
#
$root/bin/perl Makefile.PL \
PREFIX=$root/perl \
PERL_STACKED_HANDLERS=1 \
PERL_UTIL_API=1 \
PERL_DEBUG=1 \
DO_HTTPD=1 \
USE_APACI=1 \
APACI_ARGS="$a" \
DYNAMIC=1 \
PERL_TABLE_API=1 \
APACHE_PREFIX=$root
#
# опции, которые тоже могут пригодиться
#
# USE_APXS=1 \
# USE_DSO=1
# WITH_APXS=$root/apache/bin/apxs
# APACHE_SRC=../apache_1.3.34/src
#
# ставим
#
make && make test && make install

Сборка идёт по классической схеме: Распаковывать исходника mod_perl и Apache следует в одной директории. Этот скрипт, естественно, надо запускать в директории, в которую распаковались исходники mod_perl. Если вы всё так и сделаете, то mod_perl сам найдёт исходники Apache'a и соберёт всё.

Если вы хотите собрать mod_perl с «родным» Perl — просто не указывайте путь к perl при запуске Makefile.PL.


Комментарии запрещены.




Статистика