是否可以控制apache使用哪些库?

时间:2010-01-31 20:02:11

标签: apache python-imaging-library libjpeg lsof

好的,所以我的earlier problem with PIL还没有解决。其他人遇到了这个问题并且removing the old JPEG library取得了成功。我不能在我的机器上真的这样做,但是,因为它是RHEL而且很多东西都依赖于libjpeg和libjpeg-devel(当我尝试yum删除libjpeg只是为了看,总共有252个包本来删除!)

我在/ usr / local / lib中安装了jpeg-8。它被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

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

有没有人知道哪些程序或模块绑定到httpd或python可能会加载libjpeg?我知道某些东西正在通过apache加载它,因为它出现在lsof中。

1 个答案:

答案 0 :(得分:1)

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

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

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

现在为hack预加载不同版本的jpeg库,但这可能无法工作或导致以后出现问题。这个hack是改变Apache的init脚本,它设置:

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

这告诉操作系统在执行任何操作之前将该库预加载到进程地址空间。

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