Perl 6 Cro Stub运行失败:请求HTTP/2但不支持ALPN,编译libssl仍未解决
解决Cro服务中“HTTP/2 is requested, but ALPN is not supported”错误
首先,你找对了方向:ALPN(Application Layer Protocol Negotiation)是HTTP/2协议必须依赖的特性,而你系统里的旧版libssl(1.0.0及更早版本)确实不支持ALPN——OpenSSL从1.1.0版本才开始原生支持ALPN,所以手动编译新版OpenSSL是正确的思路,但问题出在你编译安装后,Cro并没有正确链接到新版的OpenSSL库。
下面是一步步排查和解决的方法:
1. 确认新版OpenSSL是否正确启用ALPN
先验证你编译的openssl-1.1.1-pre6是否真的支持ALPN:
- 运行
openssl version -a,确认输出的版本是1.1.1-pre6,且安装路径是你指定的位置(比如/usr/local)。 - 运行
openssl ciphers -V | grep ALPN,如果能看到包含ALPN字样的加密套件,说明ALPN已经启用。
2. 确保系统环境能找到新版OpenSSL
手动编译的OpenSSL通常会安装在/usr/local/lib,而系统默认的库路径可能优先指向旧版的/usr/lib。你需要让Cro的运行环境优先加载新版库:
- 在终端中设置临时环境变量(适合测试):
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH - 如果要永久生效,可以把上面的命令添加到你的
~/.bashrc或~/.zshrc文件中,然后重新加载终端配置。
3. 重新安装Cro组件并验证链接
设置好环境变量后,重新用zef安装Cro相关模块:
zef uninstall Cro::HTTP zef install Cro::HTTP
安装完成后,检查Cro的动态库是否链接到新版OpenSSL:
- Linux系统:运行
ldd $(which perl6) | grep ssl,看输出的路径是否是/usr/local/lib/libssl.so.1.1。 - 如果是Cro的特定模块文件,可以找到模块的安装目录,对其中的动态库文件执行同样的
ldd命令。
4. 检查OpenSSL编译参数
如果上面的步骤还是没解决,可能是你编译OpenSSL时的参数有问题:
- 重新编译时,确保使用
shared参数生成动态库(Cro需要动态链接):cd openssl-1.1.1-pre6 ./config --prefix=/usr/local shared make clean make make install - 避免使用
static参数,否则生成的静态库可能无法被Perl 6的模块正确调用。
总结
你的核心问题不是新版OpenSSL不能解决问题,而是编译安装后的库没有被Cro的运行环境正确识别。通过调整环境变量、确保编译参数正确,再重新安装Cro组件,应该就能让Cro用上支持ALPN的新版OpenSSL,解决HTTP/2的错误提示。
内容的提问来源于stack exchange,提问作者user2410502
相关产品推荐
相关产品推荐

