phpEnv 的 Nginx 默认不支持 TLS 1.3,因其捆绑的 OpenSSL 版本过旧(如 1.0.2k/u),必须重新编译 Nginx 并显式链接 OpenSSL ≥ 1.1.1 库,且需修正启动脚本避免加载旧库。

phpEnv 环境下的 Nginx 默认不支持 TLS 1.3,根本原因是它捆绑的 OpenSSL 版本太旧(通常是 1.0.2k 或 1.0.2u),而 TLS 1.3 要求 OpenSSL ≥ 1.1.1 —— 升级 OpenSSL 库本身无效,必须重新编译 Nginx 并显式链接新库。
确认当前 Nginx 实际使用的 OpenSSL 版本
phpEnv 的 Nginx 是静态编译或预打包的,openssl version 命令输出的是系统命令行工具版本,和 Nginx 运行时无关。真正要查的是 Nginx 二进制文件链接的库:
- 执行
/www/phpenv/nginx/sbin/nginx -V 2>&1 | grep "OpenSSL",看 built with OpenSSL 后面的版本号 - 若显示
OpenSSL 1.0.2u或类似,说明不支持 TLS 1.3,跳过“改配置”幻想 - 再用
ldd /www/phpenv/nginx/sbin/nginx | grep ssl确认 libssl.so 路径,避免后续编译后仍加载旧库
下载并编译 OpenSSL 1.1.1w 到非系统路径
不能覆盖 /usr/lib64/libssl.so 或 /usr/bin/openssl,否则 phpEnv 自身或面板功能可能异常。必须指定独立安装前缀:
- 创建目录:
mkdir -p /opt/openssl-1.1.1w && cd /opt/openssl-1.1.1w - 下载源码:
wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz - 解压编译:
tar zxf openssl-1.1.1w.tar.gz && cd openssl-1.1.1w && ./config --prefix=/usr/local/openssl-1.1.1w --openssldir=/usr/local/openssl-1.1.1w shared zlib && make -j$(nproc) && make install - 验证新库可用:
/usr/local/openssl-1.1.1w/bin/openssl version -a应输出OpenSSL 1.1.1w和正确 built on 时间
重编译 phpEnv 的 Nginx 指向新 OpenSSL
phpEnv 官方未提供一键升级脚本,需手动进入其 Nginx 源码目录(通常在 /www/phpenv/src/nginx-*)重新 configure:
- 先备份原
nginx二进制:cp /www/phpenv/nginx/sbin/nginx /www/phpenv/nginx/sbin/nginx.bak - 进入源码目录,清理旧配置:
make clean(如有) - 重新 configure,关键参数是
--with-openssl=/usr/local/openssl-1.1.1w,其他选项需与原编译一致(可从nginx -V输出中复制原有--with-xxx参数) - 编译安装:
make -j$(nproc) && make install - 重启:
/etc/init.d/phpenv restart或直接killall nginx && /www/phpenv/nginx/sbin/nginx
配置 ssl_protocols 和 ssl_ciphers 必须严格匹配 TLS 1.3
即使底层就绪,错误的 cipher 配置也会导致协商失败或静默降级到 TLS 1.2:
-
ssl_protocols可设为TLSv1.2 TLSv1.3(兼容旧客户端),但绝不能只写TLSv1.3(会断连 IE11/Android 4.x) -
ssl_ciphers必须只包含 TLS 1.3 原生套件,例如:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256 - 禁用所有带
_SHA、_SHA256(非 TLSv1.3 后缀)、ECDHE-开头的旧套件,它们在 TLS 1.3 握手中会被忽略,反而干扰协商 - 验证是否生效:
openssl ciphers -v 'TLSv1.3'应至少输出 3 行,且不含SSLv3或TLSv1.2字样
最易被忽略的一点:phpEnv 的 Nginx 启动脚本(如 /etc/init.d/phpenv)可能硬编码了 LD_LIBRARY_PATH 或预设了旧 OpenSSL 路径,重编译后若仍 fallback 到旧库,需检查该脚本内是否有 export LD_LIBRARY_PATH=... 并注释或修正。否则一切配置都只是纸上谈兵。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











