目录
- 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-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-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--modversionopenssl2.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)makeinstall3. 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.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找到ProtectSystem=full一行,将其注释(前面加#):
#ProtectSystem=full3.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.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文件,在扩展部分取消注释:
extension=memcache重启 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.php
6. 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配置高效缓存
拷贝测试页面[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.confcd/usr/local/tomcat/webapps/ROOT/ ll test.jsp# 导入测试: http://192.168.150.139/test.jsp
7.2.3 验证 Session 共享
- 停止 Server8 的 Tomcat 服务:
bin/shutdown.sh- 此时,通过负载均衡(如 Nginx)访问应用,请求应自动切换到另一台配置了相同 Memcached 的 Tomcat 服务器(如 Server3)。
- 检查 Session 信息是否依然存在,验证共享是否成功。
7.3 tomcat整合memcached
tomcat服务通过msm模块把session信息交叉存储到memcached上
systemctlenable--nowmemcachednetstat-antlp|grep:11211tarzxf 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服务