我下载并解压了 nginx 源代码到 ~/nginx-1.0.11,然后直接下载 PCRE 8.20,因为最新版本的 Passenger 安装程序无法自动下载。我执行了典型的 ./configure、make、sudo make install 操作,默认情况下 PCRE 会放在 /usr/local/lib 中。到目前为止一切顺利。使用 Passenger-install-nginx-module 并将源目录指定为 /home/username/nginx-1.0.11 就可以了。
当我使用 /opt/nginx/sbin/nginx -t 运行语法检查时,我被告知找不到 libpcre.so.0。我对 nginx 运行了 ldd,得到了以下结果:
linux-vdso.so.1 => (0x00007fff1dd7b000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00007fbfcde57000)
libcrypt.so.1 => /lib/libcrypt.so.1 (0x00007fbfcdc1e000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007fbfcd909000)
libm.so.6 => /lib/libm.so.6 (0x00007fbfcd686000)
libpcre.so.0 => not found
(truncated after this line)
由于 nginx 能够在 /usr/lib 中找到文件,我使用 ./configure --prefix=/usr 重新编译了 PCRE,现在一切都运行正常。我的问题是是否有更智能的方法来做到这一点。我是否可以将 PCRE 安装在默认的 /usr/local 位置,并以某种方式告诉系统或 nginx 在那里查找 lib 目录?库对我来说仍然有点神秘。
答案1
我能想到几个选择……
/etc/ld.so.conf
您可以将其添加/usr/local/lib
到要搜索的库路径的全局列表中。将其添加到/etc/ld.so.conf文件,然后运行ldconfig
以更新缓存。就我个人而言,由于此选项对全球产生影响,我不太满意。
LD_LIBRARY_PATH
通过添加/usr/local/lib
到LD_LIBRARY_PATH环境变量,系统应该能够在 nginx 运行时找到它。您可能不应该在 shell 环境中永久设置它,因为它将产生与修改类似的全局影响/etc/ld.so.conf。相反,您可以通过在 nginx 命令前面加上前缀来以临时方式进行测试:
LD_LIBRARY_PATH=/usr/local/lib /opt/nginx/sbin/nginx -t
您也可以在 nginx 的初始化脚本中设置变量。
选择configure
nginx 的 configure 脚本似乎有一个标志,允许您将额外的选项传递给ld
。您可以尝试使用 运行 nginx 的 configure 脚本--with-ld-opt='-L/usr/local/lib'
。我不确定这是否只会在编译时修改库搜索路径,或者是否也会影响运行时。可能还有其他链接器选项可以解决问题。我已经有一段时间没有处理这些东西了。
配置脚本似乎还有一个--with-pcre
选项,用于将路径传递给 PCRE 源,但这似乎是用于将库静态链接到 nginx。这可能也不是一个好主意。
我建议使用 进行 nginx 测试构建--with-ld-opt='-L/usr/local/lib'
(如果您想保留原始文件,可以在单独的构建目录中进行)。然后,您可以像以前一样使用 检查构建目录中已编译的二进制文件,ldd
看看是否有任何不同。