【问题标题】:Is it possible to control which libraries apache uses?是否可以控制 apache 使用哪些库?
【发布时间】:2010-01-31 20:02:11
【问题描述】:

好的,所以我有一个 earlier problem with PIL 仍未解决。其他人遇到了这个问题,并通过removing the old JPEG library 获得了成功。但是,我不能在我的机器上真正做到这一点,因为它是 RHEL,很多东西都依赖于 libjpeg 和 libjpeg-devel(当我尝试 yum remove libjpeg 只是为了查看时,总共有 252 个包删除!)

我在 /usr/local/lib 中安装了 jpeg-8。它被 python 正确使用,但 not 被 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 also 但仍然遇到错误,这表明它仍在使用 62 版本.有没有办法让 8 版本优先?

更新 #1

对 lib64/modules 中的所有模块运行 ldd 时没有引用 libjpeg。在 PIL 的 _imaging.so 文件上运行 ldd 表明它正在使用新版本的 libjpeg。我很确定我的系统上只有一个版本的 PIL -- 我已经进行了相当彻底的搜索。

有没有人知道哪些与 httpd 或 python 相关的程序或模块可能会加载 libjpeg?我知道 something 正在通过 apache 加载它,因为它显示在 lsof 中。

【问题讨论】:

  • 对 httpd 和所有 Apache 的 dso 模块运行 'ldd' 以查看问题所在...
  • 我对 httpd.conf 和 conf.d 文件中使用 LoadModule 调用的每个模块运行 ldd,但没有匹配项。 “ldd -v -r /usr/sbin/httpd”也没有出现。还有其他我需要看的吗?

标签: apache python-imaging-library libjpeg lsof


【解决方案1】:

有一种方法,但由于它是 jpeg 库的不同版本,因此您可能会破坏首先加载旧库的任何方法。

问题可能是您正在将 PHP 加载到同一个 Apache 安装中,并且它正在预加载一个 PHP 扩展模块,该模块依赖于旧版本的 jpeg 库。因为 PHP 优先于 Python 所做的事情,所以你会被错误的库困住。

因此,请尝试禁用 mod_php,使其不会加载到 Apache。如果你的问题消失了,你就知道是这样。如果它确实有效并且您不需要 PHP,则将其永久禁用。如果您确实需要 PHP,则改为在 fastcgi 下使用 PHP,这样可以避免 PHP 被加载到 Apache 进程本身。或者,您需要更新/重建 PHP 以使用相同的 jpeg 版本。

现在让 hack 预加载不同版本的 jpeg 库,但这可能不起作用或导致以后出现问题。这个技巧是改变 Apache 的初始化脚本,使其设置:

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

这告诉操作系统在它做任何事情之前将该库预加载到进程地址空间中。

顺便说一句,如果是 PHP,你没有用 ldd 找到它的原因是 PHP 扩展模块安装在与 Apache 模块不同的目录中。

【讨论】:

  • 大概就是这样!如果我更改模块加载的顺序,那会改变情况吗?我正在运行 lot 的基于 PHP 的代码,因此 FastCGI 可能是要走的路。如果这是答案,我会尽快通知您。
  • 嗯嗯嗯。所以我通过注释掉 AddHandler php5-script .php 暂时在服务器上禁用了 PHP,这是我看到 PHP 调用的唯一地方,错误仍在发生,httpd 仍在使用 libjpeg 62。所以,else 可以使用旧的 jpeg 库吗?列出我的 LoadModules 列表会有帮助吗?
  • 您并没有通过这样做禁用 PHP。搜索引用 PHP 的 LoadModule 行,可能是 libphp5.so 或类似的。注释掉那一行。不,更改 LoadModule 行的顺序将无济于事,因为 PHP 会预加载到 Apache 父级中,而 Python 正在执行延迟加载,因此 PHP 将始终获胜。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多