用户密码正确情况下,nginx转发执行PHP报用户名密码不对
问题现象
php通过pdo接口,用odbc连接yashandb,代码如下图:
报错如下图:
问题的风险及影响
odbc连接失败,影响业务
问题影响的版本
23.2.3.100及之后版本
问题发生原因
yasdb升级到23.2.3.100之后,需要1.1.1l的openssl版本,否则加载libcrypto.so加载不了
解决方法及规避方式
yashandb-client包有ibcrypto.so,直接把client包放到LD_LIBARAY_PATH前面,先加载client包的库即可。
sudo vi /etc/sysconfig/php-fpm 修改path,把/lib目录去掉即可,如下图:
之后显示正常:
问题分析和处理过程
本地复现成功,分析yasdb报错过程:
clear_env=no已打开
php环境变量已添加
1、正常情况下,传到yasdb的密码已加密,yasdb解密后,pwd是正确的密码。
2、有报错情况下,发现传到yasdb的密码没有加密,yasdb解密后,pwd是乱码,导致报错。
分析odbc发送端,发现正常情况下,yasconnect在发送前,会调用加密接口,而报错的情况则没有调用该接口,如下图,从而定位到同encrypt加密相关。
本地环境虽然安装了openssl 1.1.1l,但是/lib64目录下还存在1.1.1k版本的库,替换掉即可解决问题。
yasdb加载的是openssl 1.1.1l版本,但是php使用的却是/lib64目录下的1.1.1k版本的库,导致问题出现。
openssl 1.1.1l的库放到了ld.so.conf中,比LD_LIBRARY_PATH 后加载,比/lib64先加载,导致的问题。
动态库加载优先级:
在 Linux 系统中,动态库的加载优先级可以由多个因素决定,包括:
1、LD_LIBRARY_PATH 环境变量:如果在环境变量 LD_LIBRARY_PATH 中指定了一个库文件的路径,那么在这个路径中找到的库文件将会被优先加载。
2、程序的 RPATH 属性:如果程序在编译时设置了 RPATH 属性,则会优先搜索 RPATH 中指定的路径来加载库文件。
3、系统的加载路径:在 /etc/ld.so.conf 文件中定义的路径,以及在 /etc/ld.so.conf.d 目录中的路径,都会被用来搜索库文件。
4、系统的默认加载路径:在大多数 Linux 系统中,/lib 和 /usr/lib 目录都是默认的加载路径,因此如果在这些目录中找到了库文件,就会被加载。
注意,上述加载优先级是相对的,也就是说,如果在 LD_LIBRARY_PATH 中找到了库文件,则不会再搜索 RPATH 和其他路径。另外,如果在 RPATH 中找到了库文件,则不会再搜索其他路径。
相关问题单
nginx转发执行PHP报错用户名和密码错误