Linux CentOS离线部署实战之——构建PHP本地yum源与编译环境

Linux CentOS离线部署实战之——构建PHP本地yum源与编译环境 1. 为什么需要本地yum源与PHP编译环境在政府、金融等对网络安全要求极高的场景中服务器往往处于完全隔离的内网环境。这种情况下传统的在线安装方式完全失效而U盘等移动存储介质也常被禁用。我去年给某省级政务云平台做迁移时就遇到过这种情况——20台物理服务器连光驱都是焊死的最后只能通过局域网共享ISO文件解决问题。本地yum源的本质就是把CentOS官方仓库搬到你的内网里。就像在家里建了个小超市虽然商品种类不如沃尔玛齐全但紧急情况下不用跑远路。而PHP编译环境就像厨房设备有了它才能把原材料源码包变成可执行的程序。这里有个常见误区很多人以为只要下载php.tar.gz就能直接运行其实还需要autoconf、libjpeg等二十多个依赖包就像做蛋糕不光需要面粉还要鸡蛋、糖和烤箱。2. 镜像选择与本地源搭建2.1 镜像选择的三个关键点上周帮某证券公司部署时他们用了CentOS 7.6的服务器却下载了8.2的镜像结果大量软件包不兼容。这里强调几个要点版本匹配原则大版本必须一致如都是7.x小版本建议完全一致。可以通过cat /etc/redhat-release查看当前系统版本镜像类型选择DVD版4.7GB适合大多数场景Everything版10GB包含所有软件包但需要蓝光刻录Minimal版千万别选缺少太多基础工具推荐从国内镜像站下载速度更快。比如南京邮电大学的镜像站http://mirrors.njupt.edu.cn/centos/7.9.2009/isos/x86_64/2.2 本地源搭建五步法实际操作中我更喜欢把ISO文件放在本地硬盘而非光盘因为光盘读取速度慢且易损坏。以下是优化后的流程# 1. 创建挂载点 mkdir -p /mnt/centos7 # 2. 挂载ISO假设ISO已上传到/root mount -o loop /root/CentOS-7-x86_64-Everything-2009.iso /mnt/centos7 # 3. 永久挂载重启后生效 echo /root/CentOS-7-x86_64-Everything-2009.iso /mnt/centos7 iso9660 loop 0 0 /etc/fstab # 4. 备份原有repo配置 mv /etc/yum.repos.d /etc/yum.repos.d.bak mkdir /etc/yum.repos.d # 5. 创建本地repo文件 cat /etc/yum.repos.d/local.repo EOF [local] nameLocal CentOS baseurlfile:///mnt/centos7 gpgcheck1 gpgkeyfile:///mnt/centos7/RPM-GPG-KEY-CentOS-7 enabled1 EOF避坑指南遇到mount: unknown filesystem type iso9660错误时需要先安装相关驱动yum install isomd5sum如果gpgcheck报错可以临时设置为0但正式环境不建议禁用验证3. PHP依赖的离线解决方案3.1 基础工具安装在编译PHP前需要先准备好工具链。就像装修房子要先买电钻和锤子yum install -y autoconf m4 libtool bison re2c gcc-c make这些工具的作用autoconf生成configure脚本libtool管理库文件依赖gcc-cC/C编译器3.2 依赖包全家桶PHP编译依赖就像俄罗斯套娃经常出现A依赖BB又依赖C的情况。我整理了一份最小依赖清单依赖包作用是否必须libxml2XML解析是libjpeg图像处理可选openssl加密通信是libcurlHTTP请求可选zlib压缩支持是对于完全离线的环境建议提前下载这些rpm包yum install yum-utils repotrack libxml2 openssl zlib libjpeg-turbo libcurl下载的rpm包会保存在当前目录可以打包带到离线环境安装。4. PHP编译安装实战4.1 源码准备技巧从php.net下载源码时有个小技巧——使用镜像站点加速wget https://www.php.net/distributions/php-7.4.33.tar.gz建议同时下载对应的asc签名文件验证完整性wget https://www.php.net/distributions/php-7.4.33.tar.gz.asc gpg --verify php-7.4.33.tar.gz.asc4.2 编译参数优化configure参数就像定制汽车的选配单。这是我给金融客户常用的配置./configure \ --prefix/usr/local/php \ --with-config-file-path/etc \ --enable-fpm \ --with-fpm-usernginx \ --with-fpm-groupnginx \ --with-openssl \ --with-pcre-jit \ --with-zlib \ --enable-mysqlnd \ --with-curl \ --enable-mbstring \ --with-gd \ --enable-gd-jis-conv \ --with-webp关键参数说明--enable-fpmPHP-FPM模式适合高并发--with-pcre-jit正则表达式性能优化--enable-mysqlnd原生MySQL驱动4.3 编译加速技巧在32核服务器上可以这样加速编译make -j$(nproc) make install如果遇到memory exhausted错误需要增加swap空间dd if/dev/zero of/swapfile bs1M count2048 mkswap /swapfile swapon /swapfile5. 配置与调优5.1 安全加固配置php.ini中这几个参数必须修改expose_php Off display_errors Off upload_max_filesize 10M post_max_size 12M cgi.fix_pathinfo0对于PHP-FPM建议调整进程管理方式pm dynamic pm.max_children 50 pm.start_servers 5 pm.min_spare_servers 2 pm.max_spare_servers 105.2 系统服务集成创建systemd服务文件更方便管理cat /etc/systemd/system/php-fpm.service EOF [Unit] DescriptionPHP FastCGI Process Manager Afternetwork.target [Service] Typeforking ExecStart/usr/local/php/sbin/php-fpm --nodaemonize ExecReload/bin/kill -USR2 \$MAINPID [Install] WantedBymulti-user.target EOF然后启动服务systemctl daemon-reload systemctl enable --now php-fpm6. 常见问题排查依赖缺失问题 如果configure报错configure: error: Package requirements (xxx) were not met可以使用yum provides */xxx.h查找对应开发包内存不足问题 编译PHP 7.4建议至少2GB内存可以通过临时文件解决mount -t tmpfs -o size2G tmpfs /dev/shm版本冲突问题 当系统已存在旧版PHP时建议用alternatives管理多版本alternatives --install /usr/bin/php php /usr/local/php/bin/php 70