PHP 8.3 源码编译部署优化与nginx高速缓存session共享实战
2026/9/19 10:39:22 网站建设 项目流程

目录

  • 1. 环境准备与用户创建
    • 1.1 下载 PHP 源码
    • 1.2 创建专用系统用户
  • 2. 编译配置与依赖解决
    • 2.1 初始编译配置
    • 2.2 安装编译依赖
    • 2.3 解决 libzip 版本过低问题
    • 2.4 升级 OpenSSL
    • 2.5 重新配置 PHP
  • 3. PHP 配置与服务管理
    • 3.1 配置文件初始化
    • 3.2 配置 systemd 服务
    • 3.3 设置环境变量与启动服务
  • 4. Nginx 与 PHP 整合
    • 4.1 配置 Nginx 支持 PHP
    • 4.2 创建测试页面
    • 4.3 重启 Nginx 并测试
  • 5. PHP 动态扩展模块安装(以 Memcache 为例)
    • 5.1 下载与编译模块
    • 5.2 启用扩展
    • 5.3 验证扩展
    • 5.4 安装并启动 Memcached 服务
    • 5.5 部署测试脚本
  • 6. OpenResty 部署与配置
    • 6.1 安装 OpenResty
    • 6.2 迁移 Nginx 配置
    • 6.3 迁移网站文件
  • 7. 性能测试与优化
    • 7.1 nginx配置高效缓存
    • 7.2 会话(Session)共享方案
      • 7.2.1 部署 Tomcat 服务器(以 Server8 为例)
      • 7.2.2 nginx整合tomcat
      • 7.2.3 验证 Session 共享
    • 7.3 tomcat整合memcached

1. 环境准备与用户创建

1.1 下载 PHP 源码

从 PHP 官方网站下载指定版本源码包(此处以 8.3.32 为例)。

1.2 创建专用系统用户

为安全运行 PHP-FPM,创建一个无法登录的系统用户:

useradd-M-d/usr/local/php-s/sbin/nologin php

参数说明:

  • -M:不创建用户家目录(避免在/home下生成目录)。
  • -d /usr/local/php:指定用户家目录为/usr/local/php(仅记录在/etc/passwd中)。
  • -s /sbin/nologin:禁止该用户登录系统(仅用于运行服务)。
  • php:用户名。

2. 编译配置与依赖解决

2.1 初始编译配置

进入解压后的 PHP 源码目录,执行配置命令:

./configure\--prefix=/usr/local/php\--with-config-file-path=/usr/local/php/etc\--enable-fpm\--with-fpm-user=php\--with-fpm-group=php\--enable-cli\--enable-opcache\--enable-mysqlnd\--with-mysqli\--with-pdo-mysql\--enable-mbstring\--enable-xml\--enable-gd\--with-zip\--with-curl\--with-jpeg\--with-freetype\--with-openssl\--enable-bcmath\--enable-soap\--enable-sockets\--enable-exif\--with-readline\--with-zlib

2.2 安装编译依赖

配置过程中可能会报缺少依赖,按需安装以下包:

# 基础编译工具与库yuminstall-ysystemd-devel libxml2-devel libcurl-devel# 图像处理库yuminstall-ylibpng-devel libjpeg-turbo-devel freetype-devel# 其他功能库yuminstall-yoniguruma-devel readline-devel# 若提示找不到 oniguruma-devel,需先启用 EPEL 仓库yuminstall-yepel-release yuminstall-yoniguruma-devel

开始报错

1.yum install -y systemd-devel
yum search libxml
yum list libxml2-devel

2.yum install -y libxml2-devel

3.yum search sqlite3
yum list sqlite-devel

4.yum list libcurl

yum install -y libcurl-devel


5.

没有报错提示版本
yum install -y libpng-devel

6.安装 oniguruma-devel:
yum install -y oniguruma-devel
如果提示 No package oniguruma-devel available,需要先启用 EPEL 仓库:
yum install -y epel-release
yum install -y oniguruma-devel

7.yum search libjpeg
yum install -y libjpeg-turbo-devel

8.yum search freetype2
yum install -y freetype-devel

9.yum install -y readline-devel

2.3 解决 libzip 版本过低问题


系统自带的 libzip 版本可能过低,需要手动编译新版:

# 下载并解压 libzip 源码(以 1.9.2 为例)tar-xflibzip-1.9.2.tar.gzcdlibzip-1.9.2# 使用 CMake 构建mkdirbuild&&cdbuild yuminstall-ycmake3# 创建软链接,让 cmake 命令指向 cmake3(兼容性)ln-sf/usr/bin/cmake3 /usr/bin/cmake# 配置编译选项cmake\-DCMAKE_INSTALL_PREFIX=/usr/local/libzip\-DBUILD_SHARED_LIBS=ON\..

# 安装额外依赖yuminstall-ybzip2-devel libzstd-devel.x86_64# 编译并安装cmake\-DCMAKE_INSTALL_PREFIX=/usr/local/libzip\-DBUILD_SHARED_LIBS=ON\..make-j$(nproc)makeinstall# 将 libzip 库路径加入系统动态链接库搜索路径echo"/usr/local/libzip/lib64">/etc/ld.so.conf.d/libzip.conf ldconfig# 验证是否识别成功pkg-config--modversionlibzip

默认情况下,系统会在 /lib、/lib64、/usr/lib、/usr/lib64 等标准路径下搜索共享库(.so 文件)。

如果你将 libzip 编译安装到了 /usr/local/libzip/lib64,这个路径不在默认搜索范围内。 写入该配置文件后,动态链接器(ld.so)会在运行时自动包含该路径,从而让依赖 libzip 的程序(如 PHP 的 --with-zip 扩展)能够找到所需的库
# 设置 pkg-config 路径,让后续编译能找到新版 libzipexportPKG_CONFIG_PATH=/usr/local/libzip/lib64/pkgconfig:$PKG_CONFIG_PATHpkg-config--modversionlibzip


make -j2会报错

2.4 升级 OpenSSL

若系统 OpenSSL 版本过低,同样需要手动升级:

# 下载并解压 OpenSSL 源码(以 1.1.1w 为例)wgethttps://www.openssl.org/source/openssl-1.1.1w.tar.gztar-xfopenssl-1.1.1w.tar.gzcdopenssl-1.1.1w# 编译安装(启用共享库,支持 zlib)./config shared zlib--prefix=/usr/local/opensslmake-j$(nproc)makeinstallcd/usr/local/openssl/# 设置 pkg-config 路径exportPKG_CONFIG_PATH=/usr/local/openssl/lib/pkgconfig:$PKG_CONFIG_PATH# 将 OpenSSL 库路径加入动态链接库搜索路径echo"/usr/local/openssl/lib">/etc/ld.so.conf.d/openssl.conf ldconfig# 验证版本pkg-config--modversionopenssl

2.5 重新配置 PHP

确保环境变量已设置后,重新执行配置命令(注意指定自定义路径):

./configure\--prefix=/usr/local/php\--with-config-file-path=/usr/local/php/etc\--enable-fpm\--with-fpm-user=php\--with-fpm-group=php\--enable-cli\--enable-opcache\--enable-mysqlnd\--with-mysqli\--with-pdo-mysql\--enable-mbstring\--enable-xml\--enable-gd\--with-zip=/usr/local/libzip\--with-curl\--with-jpeg\--with-freetype\--with-openssl=/usr/local/openssl\--enable-bcmath\--enable-soap\--enable-sockets\--enable-exif\--with-readline\--with-zlib

配置成功后,执行编译与安装:

make-j$(nproc)makeinstall

3. PHP 配置与服务管理

3.1 配置文件初始化

# 复制主配置文件(生产环境推荐使用 php.ini-production)cpphp.ini-production /usr/local/php/etc/php.ini# 初始化 PHP-FPM 配置文件cd/usr/local/php/etc/cpphp-fpm.conf.default php-fpm.confcdphp-fpm.d/cpwww.conf.default www.conf

3.2 配置 systemd 服务

# 复制服务文件(位于 PHP 源码目录)cd/path/to/php-8.3.32/sapi/fpmcpphp-fpm.service /etc/systemd/system/# 编辑服务文件,注释掉可能导致权限问题的行cd/etc/systemd/system/vim/etc/systemd/system/php-fpm.service

找到ProtectSystem=full一行,将其注释(前面加#):

#ProtectSystem=full

3.3 设置环境变量与启动服务

# 重新加载 systemd 配置systemctl daemon-reload# 将 PHP 可执行文件路径加入当前用户的 PATH(永久生效)echo'PATH=/usr/local/php/bin:$PATH:$HOME/bin:/usr/local/nginx/sbin'>>~/.bash_profilesource~/.bash_profile

# 启动 PHP-FPM 服务systemctl start php-fpm.service systemctlenablephp-fpm.service# 设置开机自启# 验证服务状态systemctl status php-fpm.service
# 修改配置vimphp-fpm.confvimphp.ini systemctl reload php-fpm.service


4. Nginx 与 PHP 整合

4.1 配置 Nginx 支持 PHP

编辑 Nginx 配置文件(例如/usr/local/nginx/conf/nginx.conf),在server块中添加或修改location指令:

location ~ \.php$ { root /usr/local/nginx/html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi.conf; }

4.2 创建测试页面

# 在网站根目录创建测试文件echo"<?php phpinfo(); ?>">/usr/local/nginx/html/index.php

4.3 重启 Nginx 并测试

nginx-sreload

浏览器访问http://服务器IP/index.php,应显示 PHP 信息页面。

5. PHP 动态扩展模块安装(以 Memcache 为例)

5.1 下载与编译模块

# 下载 Memcache 扩展(以 8.2 版本为例)wgethttps://pecl.php.net/get/memcache-8.2.tgztar-xfmemcache-8.2.tgzcdmemcache-8.2/# 使用 phpize 准备编译环境yuminstall-yautoconf phpize ./configuremakemakeinstall


5.2 启用扩展

编辑php.ini文件,在扩展部分取消注释:

extension=memcache


重启 PHP-FPM 使配置生效:

systemctl reload php-fpm.service

5.3 验证扩展

php-m|grepmemcache

5.4 安装并启动 Memcached 服务

yuminstall-ymemcached systemctlenable--nowmemcached

5.5 部署测试脚本

cdmemcache-8.2/# 复制示例文件到 Web 目录cpexample.php memcache.php /usr/local/nginx/html/vimmemcache.php


编辑memcache.php配置连接信息后,通过浏览器访问即可查看缓存状态。


查看缓存命中状态
http://192.168.150.139/memcache.php

6. OpenResty 部署与配置

6.1 安装 OpenResty

# 添加 OpenResty 官方仓库cd/etc/yum.repos.d/wgethttps://openresty.org/package/rhel/openresty.repo# 安装 OpenRestyyuminstall-yopenresty

6.2 迁移 Nginx 配置

# 停止原有 Nginxnginx-sstopcd/usr/local/nginx/conf/# 复制配置文件cp/usr/local/nginx/conf/nginx.conf /usr/local/openresty/nginx/conf/# 复制 SSL 证书等必要文件cpcert.pem /usr/local/openresty/nginx/conf/# 测试配置文件语法/usr/local/openresty/nginx/sbin/nginx-t# 启动 OpenResty/usr/local/openresty/nginx/sbin/nginx

6.3 迁移网站文件

cp/usr/local/nginx/html/* /usr/local/openresty/nginx/html/

浏览器访问http://192.168.150.139/

root html; 表示 OpenResty 的网站根目录是/usr/local/openresty/nginx/html/
index 指令中 index.php 排在第一位,因此访问根路径 / 时,OpenResty 会优先查找并执行 index.php。
由于/usr/local/openresty/nginx/html/目录下存在 index.php,所以访问 http://192.168.150.139/ 就会显示 phpMyAdmin 页面,而不是 OpenResty 默认欢迎页

若希望优先显示静态页面,可修改nginx.confindex指令的顺序:

index index.html index.php index.htm;

7. 性能测试与优化

7.1 nginx配置高效缓存

拷贝测试页面[root@server5 html]# pwd/usr/local/openresty/nginx/html[root@server5 html]# cp /usr/local/nginx/html/index.php .[root@server5 html]# cp /usr/local/nginx/html/example.php .[root@server5 conf]# pwd/usr/local/openresty/nginx/conf



/usr/local/openresty/nginx/sbin/nginx -s reload

测试:ab -c10 -n1000 http://192.168.150.139/index.php

7.2 会话(Session)共享方案

在多台后端服务器(如 Tomcat)场景下,可通过 Memcached 或 Redis 实现 Session 共享,避免用户会话丢失。以下以 Tomcat 整合 Memcached 为例,演示如何配置 Session 共享。

7.2.1 部署 Tomcat 服务器(以 Server8 为例)
# 安装 Java 运行环境yuminstall-yjava-1.8.0-openjdk.x86_64# 解压 Tomcat 到 /usr/local 目录tarxf apache-tomcat-9.0.120.tar.gz-C/usr/local/# 创建软链接方便管理cd/usr/localln-sapache-tomcat-9.0.120/ tomcat# 启动 Tomcat 服务cdtomcat bin/startup.sh# 验证服务是否启动netstat-antlp|grep:8080

浏览器访问http://服务器IP:8080/应显示 Tomcat 默认页面。

7.2.2 nginx整合tomcat
cd/usr/local/nginx/conf/vimnginx.conf


cd/usr/local/tomcat/webapps/ROOT/ ll test.jsp# 导入

测试: http://192.168.150.139/test.jsp

7.2.3 验证 Session 共享
  1. 停止 Server8 的 Tomcat 服务:
bin/shutdown.sh
  1. 此时,通过负载均衡(如 Nginx)访问应用,请求应自动切换到另一台配置了相同 Memcached 的 Tomcat 服务器(如 Server3)。
  2. 检查 Session 信息是否依然存在,验证共享是否成功。

7.3 tomcat整合memcached

tomcat服务通过msm模块把session信息交叉存储到memcached上

systemctlenable--nowmemcachednetstat-antlp|grep:11211

tarzxf msm.tgzcdmsm/cp* /usr/local/tomcat/lib/vimcontext.xml...<ManagerclassName="de.javakaffee.web.msm.MemcachedBackupSessionManager"memcachedNodes="n1:192.168.36.133:11211,n2:192.168.36.134:11211"failoverNodes="n1"#server3上修改为n2requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"/>

# 重启tomcatcd/usr/local/tomcat/ bin/shutdown.sh bin/startup.sh# 查看日志catlogs/catalina.out


测试: http://192.168.150.139/test.jsp


关掉server6的tomcat服务会自动切换到server8



关闭server2上的memcached服务后,会自动切换到server3上的memcached服务

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询