Можно ли контролировать, какие библиотеки использует Apache? - PullRequest
1 голос
/ 31 января 2010

Хорошо, поэтому у меня была более ранняя проблема с PIL , которая до сих пор не решена. У кого-то еще была эта проблема, и он добился успеха, удалив старую библиотеку JPEG . Однако я не могу сделать это на своей машине, так как это RHEL, и так много вещей зависит от libjpeg и libjpeg-devel (когда я попытался yum удалить libjpeg, просто чтобы увидеть, было всего 252 пакета, удалено!)

У меня установлен jpeg-8 в / usr / local / lib. Это правильно используется Python, но не Apache. Вот список из lsof:

COMMAND     PID      USER   FD      TYPE             DEVICE     SIZE       NODE NAME
httpd     xxxxx      root  mem       REG              253,3   xxxxx0    xxxxx34 /usr/lib64/libjpeg.so.62.0.0
python    xxxxx    jordan  DEL       REG              253,3             xxxxx63 /usr/local/lib/libjpeg.so.8.0.0
httpd     xxxxx    apache  mem       REG              253,3   xxxxx0    xxxxx34 /usr/lib64/libjpeg.so.62.0.0
httpd     xxxxx    apache  mem       REG              253,3   xxxxx0    xxxxx34 /usr/lib64/libjpeg.so.62.0.0
httpd     xxxxx    apache  mem       REG              253,3   xxxxx0    xxxxx34 /usr/lib64/libjpeg.so.62.0.0
httpd     xxxxx    apache  mem       REG              253,3   xxxxx0    xxxxx34 /usr/lib64/libjpeg.so.62.0.0
httpd     xxxxx    apache  mem       REG              253,3   xxxxx0    xxxxx34 /usr/lib64/libjpeg.so.62.0.0
httpd     xxxxx    apache  mem       REG              253,3   xxxxx0    xxxxx34 /usr/lib64/libjpeg.so.62.0.0
httpd     xxxxx    apache  mem       REG              253,3   xxxxx0    xxxxx34 /usr/lib64/libjpeg.so.62.0.0
httpd     xxxxx    apache  mem       REG              253,3   xxxxx0    xxxxx34 /usr/lib64/libjpeg.so.62.0.0

Итак, вот что мне интересно. Учитывая, что я не могу удалить libjpeg-6b, могу ли я заставить apache использовать вместо него libjpeg-8?

Хорошо, недавний запуск lsof показывает, что apache теперь загружает libjpeg.so.8.0.0 также , но все еще сталкивается с ошибками, что предполагает, что он все еще использует версию 62 Есть ли какой-нибудь способ дать приоритет 8 версии?

ОБНОВЛЕНИЕ # 1

Запуск ldd для всех модулей в lib64 / modules не содержит ссылки на libjpeg. Запуск ldd для файла _imaging.so в PIL показал, что он использует новую версию libjpeg. Я почти уверен, что в моей системе есть только одна версия PIL - я провел довольно тщательный поиск.

Кто-нибудь знает, какие программы или модули, связанные с httpd или python, могут загружать libjpeg? Я знаю, что что-то загружает это через apache, так как оно появляется в lsof.

1 Ответ

1 голос
/ 03 февраля 2010

Есть способ, но, поскольку это другая версия библиотеки jpeg, вы, скорее всего, сломаете все, что сначала загружает старую библиотеку.

Проблема, вероятно, заключается в том, что вы загружаете PHP в ту же установку Apache, и он предварительно загружает модуль расширения PHP, который зависит от более старой версии библиотеки jpeg. Поскольку PHP имеет приоритет над тем, что делает Python, вы застряли с этой неправильной библиотекой.

Итак, попробуйте отключить mod_php, чтобы он не загружался в Apache. Если ваша проблема исчезнет, ​​вы знаете, что это так. Если он работает и вам не нужен PHP, оставьте его отключенным навсегда. Если вам нужен PHP, вместо этого перейдите на использование PHP в fastcgi, чтобы избежать загрузки PHP в сами процессы Apache. В качестве альтернативы вам потребуется обновить / пересобрать PHP, чтобы использовать ту же версию jpeg.

Теперь для взлома, чтобы предварительно загрузить другую версию библиотеки jpeg, но это, вероятно, не будет работать или вызывать более поздние проблемы. Этот хак должен изменить сценарии инициализации для Apache так, чтобы он установил:

LD_PRELOAD=/some/path/libjpeg.so.8.0.0
export LD_PRELOAD

Это указывает операционной системе предварительно загружать эту библиотеку в адресное пространство процесса, прежде чем она что-либо сделает.

Кстати, если это PHP, причина, по которой вы не можете найти его с помощью ldd, заключается в том, что модули расширения PHP установлены в другом каталоге, в котором находится модуль Apache.

...