ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

PHP 8.3 源码编译部署优化与nginx高速缓存session共享实战

PHP 8.3 源码编译部署优化与nginx高速缓存session共享实战 目录1. 环境准备与用户创建1.1 下载 PHP 源码1.2 创建专用系统用户2. 编译配置与依赖解决2.1 初始编译配置2.2 安装编译依赖2.3 解决 libzip 版本过低问题2.4 升级 OpenSSL2.5 重新配置 PHP3. PHP 配置与服务管理3.1 配置文件初始化3.2 配置 systemd 服务3.3 设置环境变量与启动服务4. Nginx 与 PHP 整合4.1 配置 Nginx 支持 PHP4.2 创建测试页面4.3 重启 Nginx 并测试5. PHP 动态扩展模块安装以 Memcache 为例5.1 下载与编译模块5.2 启用扩展5.3 验证扩展5.4 安装并启动 Memcached 服务5.5 部署测试脚本6. OpenResty 部署与配置6.1 安装 OpenResty6.2 迁移 Nginx 配置6.3 迁移网站文件7. 性能测试与优化7.1 nginx配置高效缓存7.2 会话Session共享方案7.2.1 部署 Tomcat 服务器以 Server8 为例7.2.2 nginx整合tomcat7.2.3 验证 Session 共享7.3 tomcat整合memcached1. 环境准备与用户创建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-userphp\--with-fpm-groupphp\--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-zlib2.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-develyum search libxmlyum list libxml2-devel2.yum install -y libxml2-devel3.yum search sqlite3yum list sqlite-devel4.yum list libcurlyum install -y libcurl-devel5.没有报错提示版本yum install -y libpng-devel6.安装 oniguruma-develyum install -y oniguruma-devel如果提示 No package oniguruma-devel available需要先启用 EPEL 仓库yum install -y epel-releaseyum install -y oniguruma-devel7.yum search libjpegyum install -y libjpeg-turbo-devel8.yum search freetype2yum install -y freetype-devel9.yum install -y readline-devel2.3 解决 libzip 版本过低问题系统自带的 libzip 版本可能过低需要手动编译新版# 下载并解压 libzip 源码以 1.9.2 为例tar-xflibzip-1.9.2.tar.gzcdlibzip-1.9.2# 使用 CMake 构建mkdirbuildcdbuild yuminstall-ycmake3# 创建软链接让 cmake 命令指向 cmake3兼容性ln-sf/usr/bin/cmake3 /usr/bin/cmake# 配置编译选项cmake\-DCMAKE_INSTALL_PREFIX/usr/local/libzip\-DBUILD_SHARED_LIBSON\..# 安装额外依赖yuminstall-ybzip2-devel libzstd-devel.x86_64# 编译并安装cmake\-DCMAKE_INSTALL_PREFIX/usr/local/libzip\-DBUILD_SHARED_LIBSON\..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--modversionlibzipmake -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--modversionopenssl2.5 重新配置 PHP确保环境变量已设置后重新执行配置命令注意指定自定义路径./configure\--prefix/usr/local/php\--with-config-file-path/usr/local/php/etc\--enable-fpm\--with-fpm-userphp\--with-fpm-groupphp\--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)makeinstall3. PHP 配置与服务管理3.1 配置文件初始化# 复制主配置文件生产环境推荐使用 php.ini-productioncpphp.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.conf3.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找到ProtectSystemfull一行将其注释前面加##ProtectSystemfull3.3 设置环境变量与启动服务# 重新加载 systemd 配置systemctl daemon-reload# 将 PHP 可执行文件路径加入当前用户的 PATH永久生效echoPATH/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.service4. 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.php4.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 ./configuremakemakeinstall5.2 启用扩展编辑php.ini文件在扩展部分取消注释extensionmemcache重启 PHP-FPM 使配置生效systemctl reload php-fpm.service5.3 验证扩展php-m|grepmemcache5.4 安装并启动 Memcached 服务yuminstall-ymemcached systemctlenable--nowmemcached5.5 部署测试脚本cdmemcache-8.2/# 复制示例文件到 Web 目录cpexample.php memcache.php /usr/local/nginx/html/vimmemcache.php编辑memcache.php配置连接信息后通过浏览器访问即可查看缓存状态。查看缓存命中状态http://192.168.150.139/memcache.php6. OpenResty 部署与配置6.1 安装 OpenResty# 添加 OpenResty 官方仓库cd/etc/yum.repos.d/wgethttps://openresty.org/package/rhel/openresty.repo# 安装 OpenRestyyuminstall-yopenresty6.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/nginx6.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.conf中index指令的顺序index index.html index.php index.htm;7. 性能测试与优化7.1 nginx配置高效缓存拷贝测试页面[rootserver5 html]# pwd/usr/local/openresty/nginx/html[rootserver5 html]# cp /usr/local/nginx/html/index.php .[rootserver5 html]# cp /usr/local/nginx/html/example.php .[rootserver5 conf]# pwd/usr/local/openresty/nginx/conf/usr/local/openresty/nginx/sbin/nginx -s reload测试ab -c10 -n1000 http://192.168.150.139/index.php7.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整合tomcatcd/usr/local/nginx/conf/vimnginx.confcd/usr/local/tomcat/webapps/ROOT/ ll test.jsp# 导入测试 http://192.168.150.139/test.jsp7.2.3 验证 Session 共享停止 Server8 的 Tomcat 服务bin/shutdown.sh此时通过负载均衡如 Nginx访问应用请求应自动切换到另一台配置了相同 Memcached 的 Tomcat 服务器如 Server3。检查 Session 信息是否依然存在验证共享是否成功。7.3 tomcat整合memcachedtomcat服务通过msm模块把session信息交叉存储到memcached上systemctlenable--nowmemcachednetstat-antlp|grep:11211tarzxf msm.tgzcdmsm/cp* /usr/local/tomcat/lib/vimcontext.xml...ManagerclassNamede.javakaffee.web.msm.MemcachedBackupSessionManagermemcachedNodesn1:192.168.36.133:11211,n2:192.168.36.134:11211failoverNodesn1#server3上修改为n2requestUriIgnorePattern.*\.(ico|png|gif|jpg|css|js)$transcoderFactoryClassde.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服务
返回列表