Ubuntu 22.04 源码编译安装 PHP7.4 使用OpenSSL1.1.1版本
· 技术积累 · PHP ubuntu openssl

最近服务器到期了,续费不划算就从买了一台,原来一直用的centos7,于是就想换Ubuntu用用,我喜欢用源码编译安装服务,于是先搞基础环境,Nginx1.24、Mysql5.7、PHP7.4,到了php这里就出问题了!

Ubuntu 22.04 默认自带oepenssl 3.0.2的版本,但是php官网声明:要使用 OpenSSL 函数,你必须安装» OpenSSL 库。
PHP 7.0 需要 OpenSSL >= 0.9.8。
PHP 7.1-8.0 需要 OpenSSL >= 1.0.1,< 3.0。
PHP >= 8.1 支持 OpenSSL >= 1.0.2,< 4.0。

尽量不动原来的程序版本前提下进行更换,因为改过不少文件,升级最新1.2发现对我来说改动有点大,于是能保持原来环境一致最好

踩坑 1
1、于是源码安装下openssl1.1.1i版本,替换下原版的3.0版本命令,lib库添加了
2、openssl version 输出也是openssl 1.1.1i版本
2、然后配置使用--with-openssl=指定下安装后目录
4、结果是安装完php -m查看发现没有openssl的支持...

踩坑 2
1、这次配置使用--with-openssl-dir=指定下目录
2、发现编译时候还是调用的3.0的一些依赖
3、然后报错make: *** [Makefile:750: ext/openssl/openssl.lo] Error 1

踩坑 3
1、既然7.4和自带的openssl3.0不兼容,那就用php8.2版本
2、配置,编译,安装下来,顺利的很然后该支持的都支持
3、结果发现typecho博客后台登录不上去了
4、可算不知道怎么登录上去了,结果发现文章和页面打开编辑页面就503了,后台其他功能都正常,微信小程序输出也全是空白了
4、查看日志报错 Fatal error: Array and string offset access syntax with curly braces is no longer supported in
5、按网上解决方案,PHP8.0不再能够使用花括号来访问数组或者字符串的偏移.需要将{}修改成[] 就可以解决问题,于是把后台Json.php中所有{}这样符号的数组,全换成[]这样符号的就恢复正常了
6、结果第二天换了个电脑死活就是登录不了后台,前台提示用户密码错误,日志一直是:PHP Warning: Trying to access array offset on value of type null in
7、网上搜搜改了下也不行,不懂php太难搞了,继续换原来的7.4找解决办法

遇到问题过程肯定少不了 百度,谷歌,chatgpt,不停一遍遍重来,搞了一整天得有了,最后还是解决了
来源于一篇文章:如何在Ubuntu 22.04上使用OpenSSL 1.1.1正确编译PHP 7.4.33

# 先安装依赖包(原本是centos上安装依赖,让chatgpt转换了下对应的ubutnu下包名,如果编译过程有缺失,按报错提示再安装下)
apt install zlib1g zlib1g-dev libpcre3 libpcre3-dev libfreetype6 \
libfreetype6-dev libssl-dev libcurl4-openssl-dev libxslt1-dev libgd-dev libc6-dev \
libglib2.0-0 libglib2.0-dev libmcrypt-dev libmhash-dev libicu-dev libncurses5-dev \
libjpeg-dev libpng-dev libxml2-dev libbz2-dev libsqlite3-dev libonig-dev \
imagemagick libmagickwand-dev unixodbc unixodbc-dev -y

# 安装liviconv 1.17
wget https://jinchuang.org/novel/php/libiconv-1.17.tar.gz
tar xf libiconv-1.17.tar.gz
cd libiconv-1.17/
./configure --prefix=/usr/lcoal/libiconv && make && make install
echo "/usr/local/libiconv/lib" >>/etc/ld.so.conf
ldconfig

# 安装openssl1.1.1i
tar xvf openssl-1.1.1i.tar.gz
cd openssl-1.1.1i/
./Configure --prefix=/opt/openssl --openssldir=/opt/openssl -fPIC -shared linux-x86_64
make -j4 && make install

# 设置pkgconfig,为默认openssl.cnf设置ENV
echo 'export PKG_CONFIG_PATH=/opt/openssl/lib/pkgconfig' >>/etc/profile
echo 'export OPENSSL_CONF=/usr/lib/ssl/openssl.cnf' >>/etc/profile
source /etc/profile

# 安装php
tar xf php-7.4.28.tar.gz
cd php-7.4.28/
./buildconf --force
./configure \
--prefix=/usr/local/php74 \
--with-fpm-user=nginx \
--with-fpm-group=nginx \
--with-config-file-path=/usr/local/php74/etc \
--with-bz2 \
--with-curl \
--with-xsl \
--with-openssl=/opt/openssl \
--with-mhash \
--with-jpeg \
--with-freetype \
--with-iconv-dir=/usr/local/libiconv \
--with-gettext \
--with-zlib \
--with-xmlrpc \
--with-external-pcre \
--with-pcre-jit \
--with-libxml \
--with-zip \
--with-pdo-odbc=unixODBC,/usr \
--with-pdo-mysql=mysqlnd \
--with-mysqli=mysqlnd \
--with-libdir=lib64 \
--enable-gd \
--enable-mysqlnd \
--enable-intl \
--enable-dom \
--enable-xml \
--enable-simplexml \
--enable-fpm \
--enable-bcmath \
--enable-ftp \
--enable-sockets \
--enable-mbregex \
--enable-mbstring \
--enable-inline-optimization \
--enable-calendar \
--enable-static \
--enable-bcmath \
--enable-opcache \
--enable-pcntl \
--enable-shmop \
--enable-soap \
--enable-exif \
--enable-sysvsem

# 编译
make -j4
# 编译成功最后输出的警告内容:
/usr/bin/ld: warning: libssl.so.3, needed by /usr/lib/gcc/x86_64-linux-gnu/11/../../../x86_64-linux-gnu/libcurl.so, may conflict with libssl.so.1.1
/usr/bin/ld: warning: libcrypto.so.3, needed by /usr/lib/gcc/x86_64-linux-gnu/11/../../../x86_64-linux-gnu/libcurl.so, may conflict with libcrypto.so.1.1
/usr/bin/ld: warning: libssl.so.3, needed by /usr/lib/gcc/x86_64-linux-gnu/11/../../../x86_64-linux-gnu/libcurl.so, may conflict with libssl.so.1.1
/usr/bin/ld: warning: libcrypto.so.3, needed by /usr/lib/gcc/x86_64-linux-gnu/11/../../../x86_64-linux-gnu/libcurl.so, may conflict with libcrypto.so.1.1
/usr/bin/ld: warning: libssl.so.3, needed by /usr/lib/gcc/x86_64-linux-gnu/11/../../../x86_64-linux-gnu/libcurl.so, may conflict with libssl.so.1.1
/usr/bin/ld: warning: libcrypto.so.3, needed by /usr/lib/gcc/x86_64-linux-gnu/11/../../../x86_64-linux-gnu/libcurl.so, may conflict with libcrypto.so.1.1
/usr/bin/ld: warning: libssl.so.3, needed by /usr/lib/gcc/x86_64-linux-gnu/11/../../../x86_64-linux-gnu/libcurl.so, may conflict with libssl.so.1.1
/usr/bin/ld: warning: libcrypto.so.3, needed by /usr/lib/gcc/x86_64-linux-gnu/11/../../../x86_64-linux-gnu/libcurl.so, may conflict with libcrypto.so.1.1

# 安装
make install

# 配置文件
\cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
chmod +x /etc/init.d/php-fpm
cp php.ini-production /usr/local/php74/etc/php.ini
cd /usr/local/php74/etc/
cp php-fpm.conf.default php-fpm.conf
cd php-fpm.d/
cp www.conf.default www.conf

# 启动服务
/etc/init.d/php-fpm start

php7.png

php启动后,打开网站还是503,日志显示 PHP message: SQLSTATE[HY000] [2002] No such file or directory" while reading response header from upstream

# 需要在php.ini中,把你的mysql.sock写上,重启下php就正常访问了
[Pdo_mysql]
pdo_mysql.default_socket= 你的mysql.sock路径

本文最后更新时间 2023-06-08
文章链接地址:https://me.jinchuang.org/archives/1405.html
本站文章除注明[转载|引用|原文]出处外,均为本站原生内容,转载前请注明出处


留言

顶部
您当前正在使用Internet Explorer浏览器访问本站,本站在此浏览器上兼容性较差
建议使用 Chrome, Firefox, or Edge浏览器访问本网站