HP UX

Материал из Eludia
Перейти к: навигация, поиск
Существует ли отдел контроля? Да, тут повсюду одни отделы контроля. Правда, они не для того предназначены, чтобы обнаруживать ошибки в грубом смысле этого слова, потому что ошибок тут не бывает, а если и бывает, как в вашем случае, то кто может окончательно сказать, что это — ошибка?

Ф. Кафка, «Замок».

Note.jpg Эта заметка не претендует на энциклопедичность. Она не отличается ни широтой охвата, ни строгостью формулировок. Это просто записочка на память.

Содержание

Эта шпаргалка содержит некоторые сведения, накопленные в процессе настройки Eludia-приложений на платформе HP UX 11.3 / IA64. Они могут оказаться полезными любому, кто работает с Apache / mod_perl под HP UX, но, конечно, ни в коей мере не заменяют фирменного обучения.

Особенности системы вообще

Коллективное прослушивание портов

В Linux и Windows, когда процесс пытается начать прослушивание TCP-порта, который на данный момент уже кем-то занят, возникает вполне естественная и предсказуемая ошибочная ситуация: can't bind to port.

Не знаю, считается ли это багом или фичей, но в HP UX такой ошибки не возникает. Кто последний встал — того и порт. Но в случае его ухода порт передаётся предпоследнему — в общем, стек.

Это надо иметь в виду, в частности, при настройке нескольких конфигураций Apache на одном сервере: одно неверное движение — и Вам придётся долго гадать, не с того ли света приходят HTTP-сообщение после того, как httpd-процесс хорошо и честно убит.

Внимание: права доступа!

Если вы имеете опыт поддержки Eludia- (или иных mod_perl-) приложений на базе Linux или FreeBSD и попробуете воспроизвести его на HP UX, то с большой вероятностью обнаружите, что копирование свежих версий файлов не приводит к обновлению версии ПО. Таблицы не перестраиваются, Update-скрипты не запускаются, touch не помогает. Это, скорее всего, происходит из-за того, что:

  • вы копируете файлы от имени не того пользователя, из-под которого работает Apache;
  • ваша umask не предполагает права чтения для чужаков;
  • у Apache нет права поиска (флаг x) на хотя бы одну из вышележащих директорий.

При этом ошибки не возникает, новых файлов будто бы нет.

Поэтому после каждого обновления кода необходимо исполнять команду

chown -R myuser:mygroup /path/to/your/app

Если вы сначала обновили файлы, потом сделали несколько запросов к приложению, потом вспомнили про chmod и отработали его, то не удивляйтесь, если разные экземпляры httpd будут по-разному обрабатывать один запрос: старая версия останется закэшированной. Перезапустите Apache.

Проблемы с кодировкой

Iconv

При обращении к Iconv вы можете обнаружить отсутствие необходимых имён кодировок. Пугаться этого не надо, просто, скорее всего, вы привыкли использовать синонимы, которые здесь не поддерживаются.

В частности, надо помнить, что utf-8 называется utf8, а windows-1251 — cp1251.

Spreadsheet::ParseExcel

Здесь опаснее: FmtUnicode может не выдавать сообщений об ошибке, но оставлять строки в utf-8. Надёжный способ избавиться от проблемы: не использовать его вовсе, а явно вызывать Text::Iconv поверх результатов.

Установка Apache 1.3.x / mod_ssl / mod_perl 1.x

По этому поводу есть 2 толковых описания, ни одно из которых неприменимо в данном случае полностью:

Тем не менее, перед установкой Apache / mod_ssl / mod_perl на HP UX стоит прочесть то и другое, сравнить и попытаться понять причину различий. Ну и то, что здесь написано, тоже не мешает поиметь в виду.

Получение исходников

Вам понадобятся свежие версии архивов, которые можно добыть на

Запаситесь ими заранее, особенно если отправляетесь в "закрытый космос" (серверная комната без доступа к внешней Сети).

На http://www.modssl.org/source/ берите не тот архив, который помечен как LATEST, а тот, который соответствует по номеру дистрибутиву Apache.

Распаковка

Если вместо самопального GNU tar вы используете 100% фирменный, честно купленный родной HP UX tar, то приготовьтесь к 2 неприятностям:

  • опции z не будет. Запускать gunzip будете сами (если он, конечно, установлен. В случае сомнений не мешает запастись и его исходниками. Которые стоит развернуть заблаговременно);
  • даты файлов будут равны моменту распаковки. Это вам аукнется при сборке mod_ssl.

Установка OpenSSL и подготовка mod_ssl

Этот шаг более-менее соответствует описанному в документации mod_perl. Тем не менее, некоторые вещи стоит подчеркнуть особо.

Если вы решите проверить наличие готового OpenSSL командой openssl, то это очень зря. Собранный бинарник вполне может присутствовать в PATH при том, что /usr/lib/openssl с заголовками и библиотечками, скорее всего, не будет. Это, кстати, относится не только к HP UX. Так что в любом случае начните со сборки и установки OpenSSL.

Зайдя в исходники и набрав

./config

вы увидите сообщение, недвусмысленно предлагающее вам запустить другой конфигуратор, а именно 32-разрядный. Последуйте этому совету. Потом будет make && make test && make install: очень долго, но, скорее всего, без сюрпризов.

Потом, как сказано в вышеупомянутой доке, надо перейти в директорию mod_ssl и сказать

./configure --with-apache=../apache_1.3.xx

Проблем, скорее всего, не возникнет. Точнее, вам о них не сообщат.

Сборка Apache / mod_ssl без mod_perl

А вот тут mod_perl'овский рецепт, похоже, становится неприменимым, так что мы переключаемся на рекомендации знатоков DBD::Oracle (сам по себе этот модуль здесь ни при чём). Правда, мы там подправили 2 вещи:

  • изменили значения --enable-module (это несущественно, выбирайте модули, которые вам нужны);
  • вписали в CFLAGS опцию -DEAPI (а вот это принципиально, иначе все стандартные модули в присутствии mod_ssl будут грузиться с ошибками).

Итак, заходим в исходники apache,

LDFLAGS_SHLIB_EXPORT="" \
   LDFLAGS="-lm -lpthread -lcl" \
   CC=/usr/bin/cc \
   CFLAGS="-DEAPI -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64" \
   ./configure \
       --prefix=/opt/www/apache \
       --enable-shared=max \
       --disable-rule=EXPAT \
       --enable-module=proxy \
       --enable-module=ssl \
       --enable-module=rewrite \
       --enable-rule=SHARED_CORE

и понеслась:

make

Flex?!!

Спустя несколько экранов, где предупреждения компилятора cc перемежаются с комментариями о том, до какой степени он неправ, вы, вероятно, получите сообщение об ошибке, причину которой наверняка не сможете угадать самостоятельно. Конкретно процесс компиляции застрянет на отсутствии в системе команды flex. Если вы в курсе того, что flex — это мощный генератор C-кода лексических анализаторов, то, вероятно, будете сильно раздосадованы тем обстоятельством, что вас не предупредили о необходимости предварительно установить его (а заодно и bison). Особенно если исходники взять неоткуда, а через полчаса вас выгонят из серверной или вы ещё раньше умрёте от переохлаждения.

В действительности результаты работы flex / bison у вас уже есть, просто при распаковке tar пометил их тем же временем, что и исходники (*.l, *.y), а теперь make подозревает обновление и хочет перегенерировать код.

Лекарство простое:

touch src/modules/ssl/ssl_expr_scan.c 
touch src/modules/ssl/ssl_expr_parse.h 
touch src/modules/ssl/ssl_expr_parse.c

и снова

make

dbm не той системы

Успешно скомпилировав каждый исходник mod_ssl, вы имеете шанс обломиться при попытке собрать библиотеку в целом. Ругань при этом будет относиться к опции -ldbm.

Заглянем в mod_ssl.h и прочтём:

#ifndef WIN32
#define SSL_DBM_FILE_MODE ( S_IRUSR|S_IWUSR )
#else
#define SSL_USE_SDBM
#define SSL_DBM_FILE_MODE ( _S_IREAD|_S_IWRITE )
#endif 

Отметив про себя тот факт, что SSL_USE_SDBM имеет место только для WIN32 и для HP UX, очевидно, не установлена, читаем ниже:

#ifdef SSL_USE_SDBM
...
#else /* !SSL_USE_SDBM */
#include <ndbm.h>
#define ssl_dbm_open     dbm_open 
...

Итак, для всех ОС, отличных от WIN32 в качестве аналога dbm используется ndbm. Замените в Makefile '-ldbm' на '-lndbm', и этот шаг сборки пройдёт корректно.

Возможно, читатель знает корректный способ решения данной проблемы и последний совет кажется ему дичью из серии "дилетант — профанам". Было бы крайне интересно узнать, каким ключом конфигуратора надо воспользоваться или какую переменную установить. И для комплекта: с какой радости это надо делать вручную.

Ну и mod_perl

После того, как make, наконец, отработает, подготовьте сертификат, как будет написано в выданных вам комментариях, и уложите apache на место:

make install

И, наконец:

perl Makefile.PL \
   NO_HTTPD=1 \
   USE_APXS=1 \
   WITH_APXS=/opt/www/apache/bin/apxs \
   EVERYTHING=1
make
make install

Проблемы с невидимостью библиотек

Не грузится mod_perl

Сделав всё по инструкции, при попытке запустить Apache вы можете, тем не менее, получить сообщение:

/usr/lib/hpux32/dld.so: Unsatisfied code symbol 'boot_DynaLoader' 
 in load module '.../libexec/libperl.so'

Это значит, что Apache не понимает, где в системе можно найти файл libperl.so (собственно, интерпретатор Perl). По идее, бинарник perl должен прописывать этот путь в исходники mod_perl при perl Makefile.PL, но почему-то это иногда не работает.

Выход из ситуации заключается в том, чтобы использовать директиву LoadFile, которая явно загружает динамическую библиотеку:

LoadFile /opt/perl_32/lib/5.8.8/IA64.ARCHREV_0-thread-multi/CORE/libperl.so

Эта директива должна стоять раньше LoadModule perl_module.

Не грузится DBD::Oracle

Если mod_perl в порядке, но при первой попытке загрузить DBD::Oracle вы получаете сообщение "... Oracle.so: file not found", то LoadFile, в отличие от предыдущего случая, не поможет. Потому что на самом деле не найден не сам Oracle.so, а клиентская часть Oracle.

Единственный (известный нам) способ задать местоположение этих библиотек: установить переменные LD_LIBRARY_PATH и SHLIB_PATH (имеют ли они значение обе или по отдельности — отдельный вопрос. Установите обе — хуже не будет).

На практике встретился случай, когда попытки добиться этого при помощи SetEnv и PerlSetEnv результата не дали. Грубый, но эффективный обходной манёвр заключается в том, чтобы отредактировать скрипт apachectl: заменить

if $HTTPD ; then

на

RETURN_CODE=`LD_LIBRARY_PATH=...; SHLIB_PATH=...; $HTTPD` 

if $RETURN_CODE ; then
Персональные инструменты
Пространства имён

Варианты
Действия
Навигация
Разработчику
Администратору
Инструменты