showdoc 升级到当前最新版 3.7.1
前言
早上服务号突然推了一篇《showdoc 发布重构版,全新UI,高颜值!》,看了一下决定再升级一次。上次升级到 3.6.2 是为了解决客户端弹窗的问题,这次完全是为了体验新的 UI 设计,主要是文档右侧新加的目录。
按照之前写过的一篇《阿里云服务器报警:挖矿处置通知 && showdoc 手动升级》,升级版本,结果访问的时候出现“操作失败”的弹窗,显然是出问题了。控制台看到返回的信息 ShowDoc requires PHP >= 7.4.0. Current version: 7.3.5。这意味着新版本有 PHP 的新要求,要么回退到使用之前的版本,要么给 PHP 升级。
这台服务器还有一个 Typecho 的博客系统(就是当前的博客),需要考虑它的兼容性。打开 typecho 的官网,点击跳转到 typecho github。好家伙,typecho 竟然偷偷升级了版本到 1.3.0 了,但后台首页并没有发布日志,说明还在调试阶段。typecho 的文档里找到了明确的版本要求:PHP 7.4.0 or higher,所以升级 php 到 7.4.0 是完全契合当前的情况的,反正后面也要升。
过程
当前的主服务器系统信息:
CentOS release 6.10 (Final)
php 7.3.5
httpd 2.4.54
mysql 5.5.37
docker 1.7.1一开始当然是沿着之前的一贯做法,先去下载编译 php 7.4.33(php74 的最新一版)。现在比较方便的是,这些基础教程类的问题,问一下 deepseek 就可以帮你把详细步骤,下载、编译、安装等指令都给出来。
跟着编译报错信息好久,从一开始类库的缺失安装,到后来的升级 gcc 编译器,最后 deepseek 也没辙了,强烈建议我使用其他的比如 docker 方案来解决。
你正试图在一台已经停止维护超过3年、软件生态环境完全断裂的系统上,从零开始手工构建一个极其复杂的现代软件工具链。这个过程充满了无法预知的、深层次的兼容性问题。
largefile-config.h 警告本身就在暗示:你的系统核心头文件(glibc/kernel)与GCC 8.5.0期望的现代标准存在不匹配。即使你花费数小时甚至数天绕过了这一个错误,在编译ICU、PHP及其众多扩展时,几乎可以肯定还会遇到下一个类似的、甚至更棘手的兼容性问题。
转战 docker 之后也是一堆问题,从一开始拉不到公共库里的 php:7.4-fpm,到后面本地下载上传上去,通过 load 方式导入,都不行。最后通过 import 标准输入导入 cat php_7.4_fpm.tar | sudo docker import - php:7.4-fpm 导入成功了,但容器无法启动:
sudo docker run -d \
--name php74_fpm \
-p 9001:9000 \
-v /alidata/www/:/var/www/html:rw \
php:7.4-fpm \
php-fpm \
/usr/local/sbin/php-fpm
Error response from daemon: Cannot start container 9a8cb8d5b688ccd0abb666998713f33fa3a1c2d55e6105e374c15b710bc81699: no such file or directory最后 deepseek 也服了:
这个错误和你之前运行 php:7.4-fpm 时遇到的 no such file or directory 是同一个根本原因:你使用的 Docker 1.7.1 版本太老,它启动容器时依赖的基础工具(如 containerd、runc)可能缺失或与镜像不兼容,导致无法创建容器的运行时环境。
简单说,当前的 Docker 1.7.1 环境已经损坏或不完整,无法正常启动任何新容器。继续尝试不同的镜像或参数只是在重复错误。
这个时候又提出了一个新方案:使用新系统部署。就是放弃当前这个稳定但兼容性差的旧服务器,找一个新服务器去部署服务,然后旧服务器通过 Apache/nginx 做反向代理,到新服务器+端口上。
没办法,有些东西总要取舍,就像谈恋爱,不能既要又要。
刚好 showdoc 有一个 docker 的部署方式,直接部署不用考虑其他的环境依赖(也不需要下载源码,提供的容器里全都有)。
docker pull registry.cn-shenzhen.aliyuncs.com/star7th/showdoc
docker tag registry.cn-shenzhen.aliyuncs.com/star7th/showdoc:latest star7th/showdoc:latest
mkdir -p /showdoc_data/html
chmod -R 777 /showdoc_data
docker run -d --name showdoc --restart=always -p 4999:80 -v /showdoc_data/html:/var/www/html/ star7th/showdoc
chmod -R 777 /showdoc_data再参考,非docker安装方式如何升级到docker安装方式
#转移旧数据库
\cp -r -f /tmp/showdoc/Sqlite/showdoc.db.php /showdoc_data/html/Sqlite/showdoc.db.php
#转移旧附件数据
\cp -r -f /tmp/showdoc/Public/Uploads/. /showdoc_data/html/Public/Uploads我是把旧版的打包上传到新服务器,之后再替换这两项。
此时在新服务器上查看映射出来的 4999 端口服务,是可以的。
> curl -I http://localhost:4999/
HTTP/1.1 302 Found
Server: nginx/1.28.0
Date: Tue, 27 Jan 2026 09:03:33 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
location: ./install/index.php但本地访问报错 curl: (28) Failed to connect to IP port 4999 after 7788 ms: Could not connect to server,需要在阿里云的安全组里入方向添加一条新的 4999 端口的访问规则。可以限定访问来源为旧服务器的 IP,减少非法请求可能性。
此时在旧(主)服务器是可以访问到的:
> curl -I http://新IP:4999/
HTTP/1.1 302 Found
Server: nginx/1.28.0
Date: Tue, 27 Jan 2026 09:07:42 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
location: ./install/index.php此时在原来(Httpd)的域名 host 中,注释掉 DocumentRoot 添加反向代理:
ProxyRequests off
ProxyPass / http://新ip:4999/
ProxyPassReverse / http://新ip:4999/httpd -k restart 重启 httpd 服务,域名访问 OK!
比较遗憾的是,这新旧两台服务器不在一个区,没办法通过内网 ip 去访问(可以减少公网流量费)。