我已经创建了一个 docker 多阶段构建,以便最终得到一个包含最新 nginx 版本和一些从源代码编译的模块的小型精简容器。
最后,我将二进制文件和其他一些文件复制到最终容器中 - 一切正常。
此外,我正在尝试按照此处的说明设置 modsecurity: https://www.nginx.com/blog/compiling-and-installing-modsecurity-for-open-source-nginx/
这在原始构建容器中也能正常工作。但是当我将 ngx_http_modsecurity_module.so 复制到最终目标容器并启动 nginx 时,它会失败并显示:
[emerg] 1#1: dlopen() "/usr/local/nginx/modules/ngx_http_modsecurity_module.so" failed (libmodsecurity.so.3: cannot open shared object file: No such file or directory) in /etc/nginx/nginx.conf:10
该文件确实存在,因此错误消息既不十分精确,也没有什么帮助。
由于它在构建容器中工作,我怀疑缺少了其他东西,但错误消息没有提供任何有用的线索?可能缺少了什么?我可以在哪里寻找更多线索?谢谢。
PS:我从 debian:stretch-slim 图像开始
答案1
碰巧我现在发现了这一点。我必须:
同时复制:
/usr/local/modsecurity
并安装:
libgeoip1 libxml2 liblmdb0 libyajl2
可能是因为这是一个动态模块。
答案2
尝试https://hub.docker.com/r/krish512/modsecurity/,它已经使用最新的 ModSecurity CRS 规则构建
答案3
检查后这个问题我通过添加这两个标志,在 Debian 上正确安装了 ModSecurity lib,并使其全局可用./configure
--prefix=/usr --with-ld-opt=/usr/lib
在此之前,ldd ngx_http_modsecurity_module.so
我在检查时
libmodsecurity.so.3 => /opt/ModSecurity/src/.libs/libmodsecurity.so.3
在我清理构建文件之前,它一直运行良好。删除/opt/ModSecurity
目录后,ldd
它又恢复了
libmodsecurity.so.3 => 未找到
并且 openresty/nginx 失败并显示与问题相同的错误消息。