layout: post

title: [DEBUG] QAT Nginx for docker 部署时"--with-ld-opt"出错

subtitle: 记一次debug经历

tags: [debug, linux]

comments: true


[DEBUG] QAT Nginx for docker 部署时"--with-ld-opt"出错

在将 Openssl + QAT + async-mode-nginx 部署至docker的container中时,在执行async-mode-nginx的./configure时,出现了如下报错:

  1. checking for OS
  2. + Linux 4.18.0-305.el8.x86_64 x86_64
  3. checking for C compiler ... found
  4. + using GNU C compiler
  5. + gcc version: 8.5.0 20210514 (Red Hat 8.5.0-4) (GCC)
  6. checking for gcc -pipe switch ... found
  7. checking for --with-ld-opt="-Wl,-rpath=/root/openssl/lib -L/root/openssl/lib -lz" ... not found
  8. ./configure: error: the invalid value in --with-ld-opt="-Wl,-rpath=/root/openssl/lib -L/root/openssl/lib -lz"

"not found" , 找不到/root/openssl/lib这个目录。但是实际上该目录是存在的。起初我认为是docker container环境本身不支持"--with-ld-opt", 在bing和百度上搜索,找到一些类似问题,解决方法是屏蔽了该参数。确实,屏蔽之后nginx顺利编译,但是如此,nginx就无法与openssl交叉编译。

于是查找了async-mode-nginx中与“--with-ld-opt”相关的代码,在该source目录下的auto/lib/openssl/conf文件中,有三段相似代码,第一段是这样:

  1. if [ $ngx_found = no ]; then
  2. # FreeBSD port
  3. ngx_feature="OpenSSL library in /usr/local/"
  4. ngx_feature_path="/usr/local/include"
  5. if [ $NGX_RPATH = YES ]; then
  6. ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lssl -lcrypto"
  7. else
  8. ngx_feature_libs="-L/usr/local/lib -lssl -lcrypto"
  9. fi
  10. ngx_feature_libs="$ngx_feature_libs $NGX_LIBDL $NGX_LIBPTHREAD"
  11. . auto/feature
  12. fi

nginx的./configure会执行 check OS 过程,如果发现缺少某些库,则会报错退出,ngx_found这个变量如果为0,就会进入如下判断,configure程序会依次寻找/usr/local/lib, /usr/pkg/lib和/opt/local/lib, 三个路径如果都没有找到openssl/lib, 则configure就会报错退出。

我echo了ngx_found的值,发现是0,一般来说在host下,没有出现为0的情况,所以不会走这三个判断。

因此,我决定试一试把container中的nginx/auto/lib/openssl/conf文件修改一下,把/usr/local/改成了本地的openssl地址:

  1. if [ $ngx_found = no ]; then
  2. # FreeBSD port
  3. openssl_path=/root/openssl
  4. ngx_feature="OpenSSL library in $openssl_path"
  5. ngx_feature_path="$openssl_path/include"
  6. if [ $NGX_RPATH = YES ]; then
  7. ngx_feature_libs="-R$openssl_path/lib -L$openssl_path/lib -lssl -lcrypto"
  8. else
  9. ngx_feature_libs="-L$openssl_path/lib -lssl -lcrypto"
  10. fi
  11. ngx_feature_libs="$ngx_feature_libs $NGX_LIBDL $NGX_LIBPTHREAD"
  12. . auto/feature
  13. fi

再次编译,nginx通过了,openssl和nginx顺利交叉编译。

这说明,async mode nginx在container中完全可以正常安装,一定是编译环节缺失了什么才导致了出现--with-ld-opt出错。

于是我搜索nginx的--with-ld-opt参数, 发现它和--with-cc-opt参数一样,都与PCRE库密切相关。PCRE是Perl5的软件库,Perl5在文本处理和编译安装,系统运维上有重要作用,是很多软件的辅助工具,在python出现之前Perl的使用范围非常巨大,以至于今天仍是Linux系统自带的语言。PCRE库不是所有Linux系统自带的,需要手动安装。

于是在container(该container基于redhat8.4 ubi:213制作)中先更新了repo源,再执行:

  1. yum install pcre2-tools.x86_64 pcre-devel.x86_64 zlib-static.x86_64 zlib

保守起见,conf文件中还提到了zlib,所以一并安装。

这次nginx的configure执行加上--with-ld-opt之后顺利编译,没有再报错。于是该BUG顺利解决!唯一没搞懂的是,为什么当时执行的时候不是报找不到PCRE库而是报找不到openssl文件目录。

这次debug, 感受就是一定要具体定位到错误产生的源头,一定要尽可能直接看执行编译的conf文件是怎么写的,弄清楚编译逻辑,知道错从何处产生,大胆尝试修改代码check问题,才可能快速寻找到解决办法。

[DEBUG] QAT Nginx for docker 部署时"--with-ld-opt"出错的更多相关文章

  1. Nginx 的 docker 部署

    1.输入命令 docker pull nginx:1.15 拉取 nginx 的镜像: 2.使用 docker images 查看拉取到的镜像信息: 3.在主机上创建用于映射的目录 mkdir -p ...

  2. Captcha生成验证码,docker部署时问题

    https://blog.csdn.net/huofuman960209/article/details/100738712 Dockerfile FROM openjdk:8-jdk-alpine ...

  3. 使用Flask+nginx+uwsgi+Docker部署python应用

    https://www.cnblogs.com/vh-pg/p/11731637.html

  4. 【原创】运维基础之Docker(2)通过docker部署zookeeper nginx tomcat redis kibana/elasticsearch/logstash mysql kafka mesos/marathon

    通过docker可以从头开始构建集群,也可以将现有集群(配置以及数据)平滑的迁移到docker部署: 1 docker部署zookeeper # usermod -G docker zookeeper ...

  5. 阿里云服务器centos7,docker部署mysql+Redis+vue+springboot+Nginx+fastdfs,亲测可用

    一.购买云服务器 我是今年双十一期间在阿里云购买的服务器, 简单配置2核_4G_40G_3M,三年用了不到800块,不过当时我记得腾讯云更便宜,个人感觉,阿里的云服务器更加的稳定, 毕竟身经百战, 经 ...

  6. 【原创】大数据基础之Mesos+Marathon+Docker部署nginx

    一 安装 安装docker:https://www.cnblogs.com/barneywill/p/10343091.html安装mesos:https://www.cnblogs.com/barn ...

  7. docker 部署nginx 使用keepalived 部署高可用

    一.体系架构 在Keepalived + Nginx高可用负载均衡架构中,keepalived负责实现High-availability (HA) 功能控制前端机VIP(虚拟网络地址),当有设备发生故 ...

  8. 【转载】Docker部署nginx并修改配置文件

    docker 部署个nginx docker run \ --name nginx-health-web-pc \ -d -p 6800:80 \ -v /usr/docker/nginx/html: ...

  9. 使用docker部署nginx+tomcat架构(3):使用docker-compose简化部署操作

    经历了之前的两篇,我们已经大体上了解了docker部署容器的过程. 使用docker部署nginx+tomcat架构 使用docker部署nginx+tomcat架构():访问mysql数据库 不过, ...

随机推荐

  1. CF736D Permutations(伴随矩阵)

    CF736D Permutations(伴随矩阵) Luogu 题解时间 首先把边直接放进邻接矩阵, 很明显行列式的奇偶和方案数的奇偶一样. 设 $ A_{ i , j } $ 为矩阵的该行列的余子式 ...

  2. 职场PUA

    哈哈 你这个的底层逻辑是什么? 顶层设计在哪? 最终交付价值是什么? 过程的抓手在哪里? 如何保证结果的闭环? 你比别人的亮点在哪里? 优势在哪里? 你的思考和沉淀在哪里? 你有形成自己的方法论吗?

  3. vue的seo问题?

    seo关系到网站排名, vue搭建spa做前后端分离不好做seo, 可通过其他方法解决: SSR服务端渲染: 将同一个组件渲染为服务器端的 HTML 字符串.利于seo且更快. vue-meta-in ...

  4. Java中会存在内存泄漏吗,请简单描述?

    为了搞清楚Java程序是否有内存泄露存在,我们首先了解一下什么是内存泄露:程序运行过程中会不断地分配内存空间:那些不再使用的内存空间应该即时回收它们,从而保证系统可以再次使用这些内存.如果存在无用的内 ...

  5. Oracle入门基础(六)一一子查询

    SQL> --查询工资比SCOTT高的员工信息 SQL> --1. SCOTT的工资 SQL> select sal from emp where ename='SCOTT'; SA ...

  6. django中动态新建postgres数据库表

    import psycopg2def create_new_table(table_id): conn = psycopg2.connect(database='Test', user='postgr ...

  7. 字节码增强-learnning

    jvm加载java的过程主要是: 编写java文件->进行java文件的编译->生成.class字节码文件->jvm通过类加载器去加载生成的二进制文件 java编译器将源码文件编译称 ...

  8. memcached 是怎么工作的?

    Memcached 的神奇来自两阶段哈希(two-stage hash).Memcached 就像一 个巨大的.存储了很多<key,value>对的哈希表.通过 key,可以存储或查询任意 ...

  9. Netty学习摘记 —— 预置SSL / HTTP / WebSocket编解码器

    本文参考 本篇文章是对<Netty In Action>一书第十一章"预置的ChannelHandler和编解码器"的学习摘记,主要内容为通过 SSL/TLS 保护 N ...

  10. C语言之API

    C语言之API 1.输入(控制台输入) scanf("%d,%d",&a,&b); 2.输出(打印数值) printf("max=%d\n",c ...