必须同时满足编译选项、系统依赖和路径配置三要素:Ubuntu/Debian需装libssl-dev与libnghttp2-dev,CentOS/RHEL需装openssl-devel与nghttp2-devel;configure必须指定--with-php-config绝对路径,并同时启用--enable-openssl和--enable-http2;验证需php --ri swoole显示openssl=>enabled且http2=>enabled。

要让 Swoole 4(如 v4.8.0+)真正支持 OpenSSL 和 HTTP/2,光在运行时设参数远远不够——编译阶段的选项、系统依赖、路径指向,三者缺一不可。漏掉任一环,服务可能静默失败、握手卡死、或只报模糊错误(比如 Connection reset by peer),根本看不出是编译问题。
必须装全系统级依赖
仅装 PHP 扩展不行,底层库必须就位:
- Ubuntu/Debian:运行
sudo apt install libssl-dev libnghttp2-dev - CentOS/RHEL:运行
sudo dnf install openssl-devel nghttp2-devel - 注意:
libnghttp2-dev常被忽略,不装它,--enable-http2会被自动禁用,且无提示
configure 必须带全关键开关和绝对路径
不能只写 ./configure --enable-openssl --enable-http2,这样会找不到 PHP 环境和底层库:
-
--with-php-config必须指定完整路径,例如:/www/server/php/83/bin/php-config(宝塔)或~/.phpenv/versions/8.3.0/bin/php-config(phpenv) -
--enable-openssl和--enable-http2必须同时存在,少一个,SSL 握手或 HTTP/2 协商就会失败 - 若系统 OpenSSL 或 nghttp2 不在标准路径,需额外加
--with-openssl-dir=/opt/openssl或--with-nghttp2-dir=/opt/nghttp2
安装后验证与常见踩坑点
编译安装完不是终点,还要确认是否真正生效:
- 执行
php --ri swoole,输出中必须同时出现:openssl => enabled和http2 => enabled - 检查
php.ini中extension_dir是否指向新生成的扩展目录(如/www/server/php/83/lib/php/extensions/no-debug-non-zts-20230831/) - 私钥文件权限必须为
600,且属主为运行 Swoole 的用户(如 www);PKCS#8 格式私钥不被支持,需转成传统 PEM:openssl rsa -in key.pem -out key_unencrypted.pem - 改完配置后,别忘了重启 PHP 服务:
bt restart php83(宝塔)或systemctl restart php-fpm
不复杂但容易忽略。


















