因之前的CentOS8系统提前EOL,综合考虑已将目前维护很多服务器切换到了Rocky9, 在最近的一个项目中需要配置PHP 7.4 环境(要求openssl库版本要大于1.0.1小于3.0 ) 但 Rocky 9 自带的OpenSSL库 3.0.7 不受支持, 在此重新整理了下编译配置安装方法,也可供PHP 5.6 5.5 5.4 5.3 5.2 低版本在Rocky9上的编译安装参考.
原创文章,创作不易,转载请注明出处.
OpenSSL 是Linux系统常用的一个加解密库,基本所有涉及到加解密算法,SSL,HTTPS 应用的软件都会用到它, 在 Rocky 9 中默认的OpenSSL 版本为 3.0.7 仅支持PHP8.1 后的版本,若使用早期PHP版本需要搭配低版本OpenSSL,如果拿它去直接去替换系统内置版本会引起很多应用报错,所以需要正确处理版本兼容问题.
在PHP及扩展中和openssl 依赖关系如下
PHP 7.0 需要 OpenSSL >= 0.9.8 < 1.2
PHP 7.1-8.0 需要 >= 1.0.1 < 3.0
PHP >= 8.1 需要 >= 1.0.2 < 4.0
PHP扩展curl 依赖curl库 需openssl支持, 编译使用非系统自带版本
PHP扩展zip 依赖libzip库 需openssl支持,编译使用非系统自带版本
系统环境 Rocky Linux 9.4 x86_64 最小化安装
PHP版本 PHP 7.4.32
OpenSSL openssl-3.0.7-27(系统自带) openssl-1.1.1w(编译安装)
1. 为系统开启 epel 和 crb 扩展源 (编译PHP依赖的包部分在这2个软件源里)
dnf install -y epel-release
dnf config-manager --set-enabled crb
2. 安装编译PHP所需的软件包.
dnf install -y wget gcc gcc-c++ make cmake perl flex bison autoconf \
automake bzip2-devel zlib-devel freetds-devel ncurses-devel \
libjpeg-devel libpng-devel libtiff-devel freetype-devel pam-devel \
openssl-devel libxml2-devel gettext-devel pcre-devel curl-devel \
openldap-devel mhash-devel libtool libtool-ltdl-devel gd-devel \
net-snmp-devel libicu-devel sqlite-devel oniguruma-devel \
libsodium-devel expat-devel libzip-devel c-ares-devel
3. 编译安装 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
// 注: -j4 用于并行编译提速,确认CPU核心不低于4个, install_sw 不安装man文档
./config --prefix=/usr/local/openssl && make -j4 && make install_sw
4. 向系统添加 openssl 1.1.1 动态库搜索路径
echo "/usr/local/openssl/lib" >> /etc/ld.so.conf.d/openssl111w.conf && ldconfig
// 检查确认结果
ldconfig -p | grep "/usr/local/openssl"
5. 确认编译的openssl 1.1.1w 版本信息
/usr/local/openssl/bin/openssl version
6. 编译安装 curl 8.9.0 使用openssl 1.1.1 版本,PHP的curl扩展需要用到它.
wget https://curl.se/download/curl-8.9.0.tar.gz
tar zxf curl-8.9.0.tar.gz
cd curl-8.9.0
// --with-ssl 指定前面安装的openssl 1.1.1w路径
// -disable-ldap 禁用ldap支持, 其依赖ldap库关联openssl3, 编译PHP 时ld会报错.
./configure --prefix=/usr/local/curl --enable-ares --without-nss --disable-ldaps --disable-ldap --with-ssl=/usr/local/openssl
make -j4 && make install
7. 编译安装libzip 1.10.1 使用openssl 1.1.1 版本,PHP的zip 扩展需要用到它
wget https://libzip.org/download/libzip-1.10.1.tar.gz
tar zxf libzip-1.10.1.tar.gz
cd libzip-1.10.1
// 使用CMAKE参数指定前面安装的 openssl 1.1.1w 路径
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/libzip \
-DOPENSSL_ROOT_DIR=/usr/local/openssl \
-DOPENSSL_LIBRARIES=/usr/local/openssl/lib \
-DENABLE_OPENSSL=on -DENABLE_GNUTLS=off \
-DENABLE_MBEDTLS=off
make -j4 && make install
8. 下载PHP 7.4.33 并进行配置安装
wget https://www.php.net/distributions/php-7.4.33.tar.gz
tar zxf php-7.4.33.tar.gz
cd php-7.4.33
//编译PHP前引入GCC环境变量,传递openssl,curl,libzip头文件和动态库路径
export CFLAGS="-I/usr/local/openssl/include -I/usr/local/curl/include -I/usr/local/libzip/include"
export LIBS="-L/usr/local/openssl/lib -L/usr/local/curl/lib -L/usr/local/libzip/lib64"
// 配置PHP编译参数,根据实际情况来配置需要开启的扩展
./configure --prefix=/usr/local/php \
--enable-fpm \
--sysconfdir=/usr/local/php/etc \
--with-config-file-path=/usr/local/php/etc \
--enable-mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-iconv-dir=/usr/lib64 \
--with-openssl \
--with-expat \
--with-freetype \
--with-jpeg \
--with-webp \
--with-zlib \
--with-bz2 \
--with-curl \
--with-sodium \
--with-mhash \
--with-zip \
--enable-gd \
--enable-gd-jis-conv \
--enable-xml \
--enable-bcmath \
--enable-dba \
--enable-shmop \
--enable-pcntl \
--enable-calendar \
--enable-inline-optimization \
--enable-gd-jis-conv \
--enable-mbregex \
--enable-sysvshm \
--enable-soap \
--enable-mbstring \
--enable-shmop \
--enable-sysvmsg \
--enable-sockets \
--enable-ftp \
--enable-exif \
--disable-rpath \
--without-pear \
--enable-opcache
//开始编译
make -j4
//注意: 如果修改了php编译参数,在编译结束时, ld链接器报warning 警告信息,关联到
libssl.so.3 和 libcrypto.so.3 openssl3 库,需要再参考前面步骤来解决其冲突依赖.
//安装并进行配置
make install
//将php.ini 配置复制到 安装目录配置文件夹中
cp php.ini-production /usr/local/php/etc/php.ini
//链接一个php命令行工具便于使用,可选
ln -s /usr/local/php/bin/php /usr/bin/php
//检查 php的openssl扩展版本信息, 返回的版本信息均为1.1.1w 则正确
php -i | grep OpenSSL
返回
SSL Version => OpenSSL/1.1.1w
OpenSSL support => enabled
OpenSSL Library Version => OpenSSL 1.1.1w 11 Sep 2023
OpenSSL Header Version => OpenSSL 1.1.1w 11 Sep 2023
Native OpenSSL support => enabled
9. 为编译的PHP的openssl,curl 扩展指定正确的CA证书路径, 以便正常使用.
红帽系的CA Root 证书路径在 /etc/pki/tls/certs/ca-bundle.crt 文件中
编辑 php.ini 指定 curl 和 openssl 扩展使用其证书
vim /usr/local/php/etc/php.ini
//找到以下区段并进行修改
[curl]
curl.cainfo = /etc/pki/tls/certs/ca-bundle.crt
[openssl]
openssl.cafile=/etc/pki/tls/certs/ca-bundle.crt
10. 验证PHP的openssl扩展功能是否正常.
php -r 'echo file_get_contents("https://www.baidu.com");'
//用PHP file_get_contents 函数访问 https 页面如能抓取则表示openssl 配置无误
评论关闭。