CentOS7 源码安装PHP 8.3.11

官网下载地址:https://www.php.net/distributions

参考文档:https://blog.hxwsq.com/article/CentOS7-PHP8_Source_Install

一、PHP概念

PHP(PHP: Hypertext Preprocessor)是一种广泛使用的开源服务器端脚本语言,特别适用于Web开发并可嵌入HTML中。PHP最初由Rasmus Lerdorf于1994年创建,现由PHP开发团队和开源社区共同维护。以下是关于PHP的一些关键点:

  • 服务器端脚本语言
    • PHP代码在服务器上执行,生成的HTML内容发送到客户端浏览器。
    • 这使得PHP特别适合生成动态网页内容。
  • 嵌入HTML
    • PHP代码可以嵌入到HTML代码中,使得开发者可以在同一文件中同时编写HTML和PHP代码。
  • 跨平台
    • PHP可以运行在各种操作系统上,包括Linux、Windows、macOS等。
    • 兼容多种Web服务器,如Apache、Nginx、IIS等。
  • 广泛的数据库支持
    • PHP支持多种数据库,包括MySQL、PostgreSQL、SQLite、Oracle、SQL Server等。
    • 使用PDO(PHP Data Objects)和MySQLi扩展进行数据库连接和操作。
  • 丰富的功能和扩展
    • PHP内置了丰富的函数库,支持字符串处理、文件操作、会话管理、网络通信等。
    • 可以通过扩展库(如cURL、GD、mbstring等)扩展PHP的功能。
  • 面向对象编程(OOP)支持
    • PHP 5引入了对面向对象编程的支持,包括类、继承、多态、接口、命名空间等特性。
  • 广泛的社区和生态系统
    • PHP有一个活跃的开发者社区,提供大量的开源框架和工具,如Laravel、Symfony、CodeIgniter、Zend Framework等。
    • 丰富的文档和教程资源,帮助开发者快速上手和解决问题。
  • 安全性
    • PHP提供多种安全功能和最佳实践,如数据过滤、输入验证、会话管理、安全编码等。
    • 开发者需要注意防范常见的Web安全威胁,如SQL注入、XSS(跨站脚本攻击)、CSRF(跨站请求伪造)等。
  • 快速开发和部署
    • PHP语法简单易学,开发速度快,特别适合快速原型开发和中小型Web项目。
    • 支持多种部署方式,可以与版本控制系统(如Git)和持续集成/持续部署(CI/CD)工具集成。

二、LAMP和LNMP架构

LAMP 和 LNMP 是两种常见的 Web 应用程序架构,分别代表不同的技术栈组合。

1. LAMP架构

LAMP 是一种经典的 Web 开发平台,它包括以下四个组件:

  • Linux:操作系统,提供服务器的基础运行环境。
  • Apache:Web 服务器软件,用于处理 HTTP 请求并将响应返回给用户。
  • MySQL / MariaDB:数据库管理系统,用于存储网站数据。
  • PHP / Perl / Python:动态脚本语言,用于开发服务器端逻辑和生成动态内容。

LAMP 工作原理:

  • Apache 服务器负责处理客户端的 HTTP 请求,并根据请求调用 PHP 脚本。
  • PHP 脚本处理请求,可能需要与 MySQL 数据库交互,查询或更新数据。
  • 数据库返回的数据由 PHP 处理,生成 HTML 页面,然后通过 Apache 返回给客户端浏览器。
  • Linux 操作系统为整个技术栈提供运行环境和安全机制。

LAMP 的优势:

  • 结构成熟,应用广泛,支持大量开源项目。
  • 各组件间兼容性好,易于部署和管理。
  • 有大量社区支持和资源。

2. LNMP架构

LNMP 是 LAMP 的一种变体,使用 Nginx 取代了 Apache,其他组件基本相同:

  • Linux:操作系统。
  • Nginx:高性能 Web 服务器,通常用于处理静态内容和反向代理请求。
  • MySQL / MariaDB:数据库系统。
  • PHP:动态脚本语言,通常通过 php-fpm 方式与 Nginx 结合使用。

LNMP 工作原理:

  • Nginx 处理客户端的请求,尤其是静态资源(如图片、CSS、JS 文件等)直接由 Nginx 返回。
  • 对于动态内容的请求,Nginx 通过 FastCGI 将请求转发给 PHP-FPM。
  • PHP-FPM 处理 PHP 脚本,可能需要从 MySQL 数据库获取数据,生成响应内容并返回给 Nginx。
  • 最终 Nginx 将生成的 HTML 页面返回给客户端。

LNMP 的优势:

  • Nginx 在处理静态文件和并发请求方面比 Apache 更高效。
  • 占用资源少,适合高并发场景,尤其是在需要处理大量连接的情况下。
  • 在反向代理、负载均衡和缓存等方面表现出色。

3.总结

  • LAMP 更加传统,适用于大多数中小型网站,易于配置和管理。
  • LNMP 在性能上更具优势,特别适合处理高并发的 Web 应用。

三、系统环境配置

1.关闭防火墙

systemctl stop firewalld
systemctl disable firewalld

2.关闭selinux

sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0

四、安装依赖

1.安装Nginx/Apache

**安装Nginx:**可参考我博客中相关文档,这里就不说明具体安装过程了。

**安装Apache:**可参考我博客中相关文档,这里就不说明具体安装过程了。

使用 NginxApache 二选一,这里都安装,其中配置的 nginx 默认端口为 8081apache 默认端口为 80,用于后续与PHP进行配置。

2.安装PHP依赖包

除了前面这些,还需要安装一些PHP的构建工具和依赖项:

yum install -y gcc gcc-c++ autoconf automake bison re2c
yum install -y openssl-devel zlib-devel bzip2-devel libffi-devel sqlite-devel gettext-devel oniguruma-devel libsodium-devel xz-devel libxml2-devel libcurl-devel libicu-devel boost-devel libevent-devel gd-devel openjpeg-devel freetype-devel libgcrypt-devel libjpeg-devel libpng-devel libgpg-error-devel libxslt-devel libmcrypt-devel recode-devel pcre-devel readline-devel perl-devel libjpeg-turbo-devel

其中 libzip-devel 安装后的版本为 libzip-0.10.1 版本,针对于PHP 8.3版本无法使用,需源码进行安装 libzip

3.安装Cmake

官网下载地址:https://cmake.org/download/

参考文档:https://osfere.com/linux/how-to-install-latest-cmake-on-centos

安装 libzip-1.10.1 时要求Cmake版本在3.5.0及以上,而通过yum源安装的Cmake版本只有2.8.12.2,因此需要通过源码安装Cmake更高级的版本。

3.1 Cmake概念

CMake 是一个开源、跨平台的工具系列,旨在构建、测试和打包软件。它被用来利用原始平台及编译器无关的配置文件来控制软件的编译过程,并生成可供你所选择编译器环境使用的 Makefile 文件和工作区。

3.2 下载并解压Cmake源代码

下载 Cmake 源代码,并解压到 /usr/local 目录下,并重命名为 cmake

cd /usr/local/src
wget https://github.com/Kitware/CMake/releases/download/v3.30.3/cmake-3.30.3-linux-x86_64.tar.gz
tar -xzf cmake-3.30.3-linux-x86_64.tar.gz -C /usr/local
mv /usr/local/cmake-3.30.3-linux-x86_64 /usr/local/cmake

至此 CMake 就安装完成了。

3.3 配置Cmake环境变量

设置 Cmake 可执行文件所在路径为环境变量:

cat >> /etc/profile <<'EOF'
# Cmake
export CMAKE_HOME=/usr/local/cmake
export PATH=$CMAKE_HOME/bin:$PATH
EOF

执行生效:

source /etc/profile
3.4 验证Cmake版本

安装成功后,可以通过检查 Cmake 版本来验证:

cmake --version

# 显示版本信息
cmake version 3.30.3

CMake suite maintained and supported by Kitware (kitware.com/cmake).

4.libzip-0.10.1升级到libzip-1.10.1

官网下载地址:https://libzip.org/download/

参考文档:https://osfere.com/linux/how-to-build-and-install-latest-libzip-on-centos

安装 PHP 8.3版本时要求libzip版本在0.11及以上,而通过yum源安装的libzip版本只有0.10.1,因此需要升级libzip(如果安装的是PHP 8.0及以下版本,不需要源码安装,直接通过yum源安装即可)。

如果不升级的话,在编译PHP源码时,会报如下错误:

configure: error: Package requirements (libzip >= 0.11 libzip != 1.3.1 libzip != 1.7.0) were not met:
Requested 'libzip >= 0.11' but version of libzip is 0.10.1
4.1 卸载原有的libzip

卸载原有的通过yum源安装的libzip-0.10.1版本:

yum remove -y libzip libzip-devel
4.2 下载并解压libzip源代码

安装libnl3的依赖包:

yum install -y gcc zlib-devel openssl-devel libzstd-devel

下载libzip源码包并解压:

cd /usr/local/src
wget https://github.com/nih-at/libzip/releases/download/v1.10.1/libzip-1.10.1.tar.gz
tar -xzf libzip-1.10.1.tar.gz
cd libzip-1.10.1
4.3 构建Makefile文件生成项目

创建 build 目录并进入该目录,使用 cmake 命令执行生成Makefile文件的项目构建系统:

mkdir build
cd build
cmake .. \
-DCMAKE_INSTALL_PREFIX=/usr/local/libzip \
-DENABLE_OPENSSL=on \
-DENABLE_GNUTLS=off \
-DENABLE_MBEDTLS=off

解释说明:

  • CMAKE_INSTALL_PREFIX:指定 libzip 库安装位置。
  • ENABLE_OPENSSL:指定使用 OpenSSL 作为 AES 实现。
  • ENABLE_GNUTLSENABLE_MBEDTLS:禁用被自动检测到的其它 AES 实现。
4.4 编译并安装libzip
make -j $(nproc)
make install
4.5 配置动态链接库路径

配置和更新系统的 libzip 库路径,以确保系统可以正确找到并使用特定版本的 libzip 库:

echo /usr/local/libzip/lib64 > /etc/ld.so.conf.d/libzip.conf
sudo ldconfig
4.6 配置pkg-config路径并添加到环境变量

设置环境变量,以确保系统能够正确找到并使用安装在 /usr/local/libzip 路径下的 libzip 库:

cat > /etc/profile.d/libzip.sh << 'EOF'
# libzip
export PATH="/usr/local/libzip/bin:$PATH"
export PKG_CONFIG_PATH="/usr/local/libzip/lib64/pkgconfig:$PKG_CONFIG_PATH"
EOF

加载新的环境变量:

source /etc/profile
4.7 验证libzip版本

使用 pkg-config 命令来检查,显示 1.10.1 表示安装成功:

pkg-config --modversion libzip
# 显示版本
1.10.1

五、安装PHP

1.下载并解压PHP源代码

下载PHP源码包并解压:

cd /usr/local/src
wget https://www.php.net/distributions/php-8.3.11.tar.gz
tar -xzf php-8.3.11.tar.gz
cd php-8.3.11

2.编译并安装PHP

在编译PHP时,指定安装路径,这里安装到 /usr/local/php

./configure \
--prefix=/usr/local/php \
--with-config-file-path=/usr/local/php/etc \
--with-fpm-user=php \
--with-fpm-group=php \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--enable-fpm \
--enable-mbstring \
--enable-shared \
--enable-soap \
--enable-sockets \
--enable-gd \
--enable-opcache \
--enable-xml \
--enable-bcmath  \
--enable-calendar \
--enable-exif \
--enable-ftp \
--enable-pcntl \
--enable-shmop \
--enable-sysvmsg \
--enable-sysvsem \
--enable-sysvshm \
--enable-pdo  \
--enable-mbregex \
--enable-cli \
--enable-opcache \
--enable-intl \
--disable-ipv6 \
--disable-debug \
--with-jpeg  \
--with-freetype \
--with-zlib \
--with-libxml \
--with-curl \
--with-openssl \
--with-bz2 \
--with-gettext \
--with-readline \
--with-pear \
--with-mhash \
--with-ldap-sasl \
--with-xsl \
--with-zip \
--with-iconv  \
--with-kerberos \
--with-libdir=lib64 \
--with-apxs2=/usr/local/apache/bin/apxs

解释说明:

  • 基本路径与用户配置:
    • --prefix=/usr/local/php:指定 PHP 的安装目录,PHP 将被安装到 /usr/local/php 下。
    • --with-config-file-path=/usr/local/php/etc:指定 PHP 配置文件(如 php.ini)的存放路径为 /usr/local/php/etc
    • --with-fpm-user=php:指定 PHP-FPM 运行时的用户为 php
    • --with-fpm-group=php:指定 PHP-FPM 运行时的用户组为 php
  • 数据库支持:
    • --with-mysqli=mysqlnd:启用 mysqli 扩展,使用 mysqlnd(MySQL Native Driver)。
    • --with-pdo-mysql=mysqlnd:启用 PDO_MySQL 扩展,使用 mysqlnd 驱动程序。
  • PHP-FPM 和核心功能:
    • --enable-fpm:启用 PHP-FPM(FastCGI Process Manager),用于处理高并发的 PHP 请求,适合于生产环境下与 Nginx 或 Apache 配合使用。
    • --enable-mbstring:启用多字节字符串支持(如 UTF-8 字符处理),对于处理非英文字符的环境非常有用。
    • --enable-cli:启用 PHP 命令行接口(CLI),用于通过命令行执行 PHP 脚本。
  • 扩展支持:
    • --enable-soap:启用 SOAP 扩展,用于 Web 服务通信。
    • --enable-sockets:启用 Sockets 扩展,允许进行低级别的网络编程。
    • --enable-gd:启用 GD 图像处理库,支持创建和操作图像文件。
    • --enable-opcache:启用 OpCache 扩展,用于加速 PHP 脚本的执行,通过缓存编译后的字节码减少重复的编译开销。
    • --enable-xml:启用 XML 解析支持。
    • --enable-bcmath:启用 BC Math 扩展,用于处理高精度数学运算。
    • --enable-calendar:启用 Calendar 扩展,提供日历日期运算。
    • --enable-exif:启用 EXIF 数据支持,用于读取图像文件的元数据。
    • --enable-ftp:启用 FTP 扩展,允许 PHP 脚本通过 FTP 协议传输文件。
    • --enable-pcntl:启用进程控制功能,用于创建和管理子进程。
    • --enable-shmop:启用共享内存操作支持。
    • --enable-sysvmsg--enable-sysvsem--enable-sysvshm:启用 System V 共享内存、信号量和消息队列支持。
    • --enable-pdo:启用 PDO(PHP Data Objects),一个数据库访问的抽象层,用于支持多个数据库(MySQL、PostgreSQL、SQLite等)。
    • --enable-mbregex:启用多字节正则表达式支持,与 mbstring 一起使用,用于处理多字节字符编码的正则表达式。--
    • enable-intl:启用国际化支持(Intl 扩展),用于处理语言、区域设置、日期、货币格式等国际化功能。
  • 编译相关选项:
    • --enable-shared:编译为共享库,允许多个程序共享同一个 PHP 库。--enable-static:编译为静态库(与共享库
    • 相反),在某些需要静态链接的场景下使用。
    • --disable-ipv6:禁用对 IPv6 的支持。
    • --disable-debug:禁用调试模式,生产环境通常会禁用,以提高性能。
  • 外部库支持:
    • --with-jpeg:启用对 JPEG 图像格式的支持。
    • --with-freetype:启用 FreeType 字体库支持,用于处理文本到位图转换,特别是在生成图像时与 GD 库一起使用。
    • --with-zlib:启用 zlib 库支持,处理压缩文件(如 gzip)。
    • --with-libxml:启用 libxml2 库支持,用于 XML 解析。
    • --with-curl:启用 cURL 库支持,用于与 HTTP 和 FTP 等协议进行交互。
    • --with-openssl:启用 OpenSSL 支持,用于加密和安全传输(如 HTTPS)。
    • --with-bz2:启用 Bzip2 压缩库支持,处理 .bz2 格式的文件。
    • --with-gettext:启用 Gettext 支持,用于翻译和本地化功能。
    • --with-readline:启用 Readline 库,允许 PHP 命令行接口支持命令历史记录和命令行编辑功能。
    • --with-pear:启用 PEAR(PHP Extension and Application Repository),这是 PHP 的扩展和包管理系统。
    • --with-mhash:启用 mhash 库支持,用于加密哈希算法。
    • --with-ldap-sasl:启用 LDAP 支持,并启用 SASL 认证功能,用于与目录服务交互。
    • --with-xsl:启用 XSLT 支持,用于 XML 转换(基于 libxslt)。
    • --with-zip:启用 Zip 压缩支持,用于处理 .zip 文件。
    • --with-iconv:启用 iconv 字符集转换支持,用于字符集的转换和编码处理。
    • --with-kerberos:启用 Kerberos 认证支持,用于网络服务的安全认证。
    • --with-libdir=lib64:指定库文件的位置为 lib64 目录,通常用于 64 位系统,确保链接 64 位库。
    • --with-apxs2:指定 apxs2 安装路径,需要先安装 Apache

这些配置选项确保 PHP 在安装时启用了广泛的扩展和功能,包括数据库支持(MySQL)、网络功能、文件处理、图像处理、加密、国际化等,适合在生产环境下使用。同时,这些配置也启用了 PHP-FPM,以便与 Nginx 等 Web 服务器协同工作。

开始编译并安装 PHP 源码:

make -j $(nproc)   # 编译
make test          # 测试编译(可选)
make install       # 安装

3.配置PHP环境变量

设置 PHP 可执行文件所在路径为环境变量:

echo -e '# PHP\nexport PATH=/usr/local/php/bin:$PATH' >> /etc/profile.d/php.sh

执行生效:

source /etc/profile

4.验证PHP版本

php --version

# 显示版本信息
PHP 8.3.11 (cli) (built: Sep 11 2024 15:35:59) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.3.11, Copyright (c) Zend Technologies

5.PHP命令说明

php -m       # 查看 php 启用的模块
php --ini    # 查看 php.ini 路径

六、php.ini配置

1.复制PHP配置文件

php.ini 是 PHP 的主要配置文件,用于设置 PHP 运行环境的各种参数和选项。它控制着 PHP 的行为,包括错误报告、内存限制、文件上传设置等。

先将源码包中的 php.ini-development 配置文件复制到 PHP 安装目录下的 etc 目录,并重命名为 php.ini

cp /usr/local/src/php-8.3.11/php.ini-development /usr/local/php/etc/php.ini

2.修改PHP配置文件

进入 PHP 安装目录下的 etc 目录,修改 PHP 的主配置文件 php.ini,替换以下内容:

cd /usr/local/php/etc

sed -i 's@max_execution_time = 30@max_execution_time = 300@g' php.ini
sed -i 's@max_input_time = 60@max_input_time = 300@g' php.ini
sed -i 's@post_max_size = 8M@post_max_size = 500M@g' php.ini
sed -i 's@memory_limit = 128M@memory_limit = 1024M@g' php.ini
sed -i 's@upload_max_filesize = 2M@upload_max_filesize = 500M@g' php.ini
sed -i 's@;date.timezone =@date.timezone = Asia/Shanghai@g' php.ini

如果有安装 MySQL,还需要替换以下内容:

sed -i 's@mysqli.default_socket =@mysqli.default_socket = /data/mysql/sock/mysql.sock@g' php.ini

解释说明:

  • max_execution_time:设置单个PHP脚本的最大执行时间(以秒为单位)。如果脚本运行时间超过这个值,PHP将自动终止脚本执行。
  • max_input_time:设置PHP脚本解析输入数据(如POST和GET数据)的最大时间(以秒为单位)。
  • post_max_size:设置通过POST方法上传数据的最大值。这包括文件上传和普通表单数据。
  • memory_limit:设置允许使用的最大内存大小。
  • upload_max_filesize:设置允许上传的单个文件的最大尺寸。
  • date.timezone:设置PHP默认的时区。
  • mysqli.default_socket:设置MySQLi扩展默认使用的套接字文件路径。

3.查看配置信息

修改完后,通过 egrep 命令查看 php.ini 配置文件内容是否有误,由于配置文件比较长,可以将其重定向到一个文件内再查看:

egrep -v ';|^$' php.ini > /root/php.txt

七、apxs配置

--with-apxs2=/usr/bin/apxs 是一个在编译 PHP 时用于指定 Apache 扩展的选项,不需要单独配置和启动PHP-FPM,安装PHP使用此参数必须先安装 Apache。

1.修改Apache配置文件

httpd.conf 是 Apache 的主要配置文件,用于定义服务器的各种设置,例如端口号、文档根目录、日志文件路径等。

进入 Apache 安装目录下的 conf 目录,修改 Apache 的主配置文件 httpd.conf,使 Apache 能够支持 PHP:

vim /usr/local/apache/conf/httpd.conf
# 66行(如有不需要增加此项)
LoadModule php_module   modules/libphp.so
# 257行,添加index.php
<IfModule dir_module>
    DirectoryIndex index.html index.php
</IfModule>

# 文件尾添加
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>

**注:**如果安装的是PHP 7版本,66行写为:LoadModule php7_module modules/libphp7.so

2.重启Apache服务

配置完成后,需 Apache 服务方可生效:

systemctl restart httpd

八、php-fpm配置

1.文件配置

1.1 创建php-fpm运行用户
useradd -s /sbin/nologin -M php
1.2 修改php-fpm配置文件

php-fpm.conf 是 PHP-FPM(FastCGI Process Manager) 的主配置文件,用于管理和配置 PHP-FPM 服务。PHP-FPM 是 PHP 的一个进程管理器,专门用于处理高并发情况下的 PHP 请求,通常与 Nginx 或 Apache 一起使用来提升网站性能。这个配置文件控制 PHP-FPM 进程的行为,例如如何管理进程池、日志记录、错误处理等。

在 PHP 安装目录下的 etc 目录中,将 php-fpm.conf.default 复制到同一目录下,并重命名为 php-fpm.conf

cd /usr/local/php/etc
cp php-fpm.conf.default php-fpm.conf

修改 PHP 的主配置文件 php-fpm.conf,主要修改PID文件的路径:

sed -i 's@;pid = run/php-fpm.pid@pid = /usr/local/php/var/run/php-fpm.pid@g' php-fpm.conf
1.3 修改www配置文件

www.conf 是 PHP-FPM 的进程池(Pool)配置文件,它具体定义了 PHP-FPM 的一个进程池的行为。每个进程池负责处理特定的 PHP 请求,它们可以有不同的配置,比如使用不同的用户、监听不同的端口或套接字。在 php-fpm.conf 中,一般通过 include 语句引入这些池配置文件,而 www.conf 是默认的进程池配置文件名称。

在 PHP 安装目录下的 etc 目录中,将 php-fpm.d 目录下的 www.conf.default 复制到同一目录下,并重命名为 www.conf

cd /usr/local/php/etc/php-fpm.d
cp www.conf.default www.conf

修改 PHP 的进程池配置文件 www.conf,设置运行用户权限,与站点目录权限一致:

sed -i 's/user = php/user = php/g' www.conf
sed -i 's/group = php/group = php/g' www.conf
sed -i 's/listen = 127.0.0.1:9000/listen = 127.0.0.1:9000/g' www.conf
# sed -i 's@listen = 127.0.0.1:9000@listen = /usr/local/php/var/run/php-fpm.sock@g' www.conf
sed -i 's/;listen.owner = php/listen.owner = php/g' www.conf
sed -i 's/;listen.group = php/listen.group = php/g' www.conf
sed -i 's/;listen.mode = 0660/listen.mode = 0660/g' www.conf

解释说明:

  • listen = 127.0.0.1:9000:使用TCP监听,允许不同的服务器和应用程序通过网络访问 PHP-FPM,可以在不同的主机之间进行通信,相比Unix套接字,性能略低。
  • listen = /usr/local/php/var/run/php-fpm.sock:使用 Unix 套接字,只能在本地访问,无法跨主机进行通信。
  • listen.owner:指定监听文件的拥有者为 php
  • listen.group:指定监听文件的拥有组为 php
  • listen.mode = 0660:指定监听文件的权限为 0660,即所有者和组可以读写,其他人没有权限。

2.自启服务配置

2.1 配置启动服务

创建一个名为 php-fpm.service 的 systemd 服务单元文件,用于管理 PHP 服务,存放于 /usr/lib/systemd/system 目录下,并添加以下内容:

cat > /usr/lib/systemd/system/php-fpm.service <<'EOF'
[Unit]
Description=The PHP FastCGI Process Manager
Documentation=http://php.net/docs.php
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/php/sbin/php-fpm -R
ExecReload=/bin/kill -USR2 $MAINPID
ExecStop=/bin/kill -SIGINT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target
EOF
2.2 启动PHP服务

配置完成后,重载系统服务并启动 PHP 服务:

systemctl daemon-reload         # 重载单元服务
systemctl start php-fpm		    # 启动 PHP
systemctl enable php-fpm		# 启用 PHP 开机自启
systemctl status php-fpm		# 检查 PHP 服务状态
systemctl restart php-fpm		# 重启服务

启动如出现报错,使用以下命令查看具体报错:

journalctl -u php-fpm -b

-u php-fpm:限定只显示与 php-fpm 服务相关的日志条目。php-fpm 是服务名,和 php-fpm.service 一样,指定要查看的服务。

-b:限定只显示当前引导(boot)周期内的日志,即从系统最近一次启动之后产生的日志。

2.3 验证使用TCP监听

如果前面 PHP 的进程池配置文件 www.conf 配置为 listen = 127.0.0.1:9000,则使用TCP监听。

查看PHP服务的进程:

[root@localhost /usr/local/php]# ps aux | grep php | grep -v grep
root      7565  0.0  0.1 296028  8552 ?        Ss   11:09   0:00 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)
php       7566  0.0  0.1 298112  8368 ?        S    11:09   0:00 php-fpm: pool www
php       7567  0.0  0.1 298112  8372 ?        S    11:09   0:00 php-fpm: pool www

查看PHP服务的端口:

[root@localhost /usr/local/php]# ss -lntp | grep php
LISTEN     0      128    127.0.0.1:9000                     *:*                   users:(("php-fpm",pid=7567,fd=5),("php-fpm",pid=7566,fd=5),("php-fpm",pid=7565,fd=7))
2.4 验证使用Unix套接字

如果前面 PHP 的进程池配置文件 www.conf 配置为 listen = /usr/local/php/var/run/php-fpm.sock,则使用Unix套接字。

查看生成的Unix套接字:

ls /usr/local/php/var/run/php-fpm.sock

这时候查看PHP服务的端口会发现并没有,因此使用的是Unix套接字。

3.Apache配置

3.1 修改Apache配置文件

进入 Apache 安装目录下的 conf 目录,修改 Apache 的主配置文件 httpd.conf

cd /usr/local/apache/conf

sed -i 's/#LoadModule proxy_module/LoadModule proxy_module/g' httpd.conf
sed -i 's/#LoadModule proxy_fcgi_module/LoadModule proxy_fcgi_module/g' httpd.conf
echo 'Include conf/conf.d/*.conf' >> /usr/local/apache/conf/httpd.conf

解释说明:

  • LoadModule proxy_module:启用 proxy_module 模块,是 Apache 的代理模块,用于处理反向代理的功能,比如把请求转发到其他服务器。
  • LoadModule proxy_fcgi_module:启用 proxy_fcgi_module 模块,是专门为处理 FastCGI 请求的代理模块,常用于将 PHP-FPM 的 FastCGI 请求转发到 PHP 处理器。
  • Include conf/conf.d/*.conf:将指定目录下的所有 .conf 配置文件包含到主配置文件中。这样,/usr/local/apache/conf/conf.d/ 目录下的所有配置文件都会自动加载,无需手动添加每个文件的路径。这种方式常用于模块化管理 Apache 配置,便于扩展和维护。
3.2 创建站点配置目录
mkdir -p /usr/local/apache/conf/conf.d
3.3 生成站点配置文件
cat > /usr/local/apache/conf/conf.d/test.conf << 'EOF'
Listen *:8080
<VirtualHost *:8080>
  DocumentRoot "/usr/local/apache/htdocs"
  ServerName localhost

  <Directory "/usr/local/apache/htdocs">
    Options none
    AllowOverride none
    Require all granted
  </Directory>
  
  <FilesMatch \.php$>
        SetHandler "proxy:fcgi://127.0.0.1:9000"
        # SetHandler "proxy:unix:/usr/local/php/var/run/php-fpm.sock|fcgi://localhost/"
   </FilesMatch>
</VirtualHost>
EOF

解释说明:

该配置文件设置了一个监听在 8080 端口的虚拟主机,并为 .php 文件的请求启用了 FastCGI 代理。

  • 监听端口:
    • Listen *:8080:这行指示 Apache 在所有可用的网络接口(*)上监听 8080 端口的请求。
  • 虚拟主机配置:
    • VirtualHost *:8080:表示虚拟主机将处理来自所有接口 * 上端口 8080 的请求。
    • DocumentRoot "/usr/local/apache/htdocs":定义虚拟主机的文档根目录,这里设置为 Apache 默认的 htdocs 目录。
    • ServerName localhost:设置服务器名为 localhost,该虚拟主机会响应指向 localhost:8080 的请求。
  • **目录权限设置:**该部分用于控制对 DocumentRoot 目录(/usr/local/apache/htdocs)的访问权限。
    • Options none:禁用了目录下的所有选项(如 IndexesFollowSymLinks 等)。
    • AllowOverride none:不允许使用 .htaccess 文件覆盖配置。
    • Require all granted:允许所有客户端访问此目录。
  • 处理 .php 文件:
    • FilesMatch \.php$:匹配所有以 .php 结尾的文件。
    • SetHandler "proxy:fcgi://127.0.0.1:9000":设置 .php 文件通过 FastCGI 协议转发给运行在本地 127.0.0.1 上的 PHP-FPM 进程(监听 9000 端口)。
    • 注释掉的行(SetHandler "proxy:unix:/usr/local/php/var/run/php-fpm.sock|fcgi://localhost/")表明了另一种配置方式,可以通过 Unix 套接字 /usr/local/php/var/run/php-fpm.sock 与 PHP-FPM 进行通信,这种方式常用于提升性能。
3.4 重载apache服务
httpd -t            # 检查配置文件语法是否正确
httpd -k restart    # 重载 apache 服务
3.5 测试访问8080端口

如果 /usr/local/apache/htdocs 目录下有 index.html 文件,一般默认都有 index.html 文件,然后打开浏览器,访问地址 http://10.22.51.50:8080/,页面成功显示,说明虚拟主机配置正常:

image-20240912113119714
3.6 测试PHP解析

/usr/local/apache/htdocs 目录下,创建一个 PHP 测试文件 info.php,并添加以下内容:

echo "<?php phpinfo(); ?>" > /usr/local/apache/htdocs/info.php

然后,浏览器访问地址 http://10.22.51.50:8080/info.php,页面显示了 PHP 的配置信息,说明 PHP-FPM 和 FastCGI 代理配置成功:

image-20240912113444045

4.Nginx配置

4.1 修改nginx配置文件

进入 Nginx 安装目录下的 conf 目录,修改 Nginx 的主配置文件 nginx.conf

cd /usr/local/nginx/conf

sed -i '/http {/a \    include conf.d/*.conf;' nginx.conf

解释说明:

  • include conf.d/*.conf:将指定目录下的所有 .conf 配置文件包含到主配置文件中。这样,/usr/local/nginx/conf/conf.d/ 目录下的所有配置文件都会自动加载,无需手动添加每个文件的路径。这种方式常用于模块化管理 Nginx 配置,便于扩展和维护。
4.2 创建站点配置目录
mkdir -p /usr/local/nginx/conf/conf.d
4.3 生成站点配置文件
cat > /usr/local/nginx/conf/conf.d/test.conf << 'EOF'
server {
  listen       8082;
  server_name  localhost;

  location / {
    index index.php index.html;
    root /usr/local/nginx/html;
  }

  location ~ \.php$ {
    fastcgi_pass   127.0.0.1:9000;
    # fastcgi_pass unix:/usr/local/php/var/run/php-fpm.sock;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name;
    fastcgi_param  HTTP_PROXY  "";
    include        fastcgi_params;
  }
}
EOF

解释说明:

该配置在端口 8082 上监听并通过 FastCGI 与 PHP-FPM 交互。

  • listen 8082:Nginx 会监听 8082 端口上的 HTTP 请求。
  • server_name localhost:指定该服务器块适用于请求主机名为 localhost 的请求。
  • location /:匹配根路径的请求,将请求指向 /usr/local/nginx/html 目录,并尝试加载 index.phpindex.html 作为默认页面。
  • location ~ \.php$:匹配 .php 文件的请求,并将其通过 FastCGI 代理发送到 PHP-FPM。
    • fastcgi_pass 127.0.0.1:9000;:Nginx 会通过 127.0.0.1:9000 端口与 PHP-FPM 进行通信。如果使用 UNIX 套接字,注释掉这一行并启用 unix:/run/php-fpm.sock
    • fastcgi_param SCRIPT_FILENAME:指定 PHP 脚本的实际文件路径。$fastcgi_script_name 是 Nginx 中的一个内建变量,专门用于 FastCGI 请求时指定请求的 PHP 脚本名称。
    • fastcgi_param HTTP_PROXY "":避免 HTTP 代理头泄漏的安全措施。
    • include fastcgi_params:导入 FastCGI 参数的默认配置。
4.4 重载nginx服务
nginx -t            # 检查配置文件语法是否正确
nginx -s reload     # 重载 nginx 服务
4.5 测试访问8082端口

如果 /usr/local/nginx/html 目录下有 index.html 文件,一般默认都有 index.html 文件,然后打开浏览器,访问地址 http://10.22.51.50:8082/,页面成功显示,说明虚拟主机配置正常:

image-20240912115301899
4.5 测试PHP解析

/usr/local/nginx/html 目录下,创建一个 PHP 测试文件 info.php,并添加以下内容:

echo "<?php phpinfo(); ?>" > /usr/local/nginx/html/info.php

然后,浏览器访问地址 http://10.22.51.50:8082/info.php,页面显示了 PHP 的配置信息,说明 PHP-FPM 和 FastCGI 代理配置成功:

image-20240912125757536

九、添加模块

1.添加LDAP模块

1.1 安装依赖
yum install -y openldap-devel
1.2 进入ldap扩展目录并运行phpize

进入 PHP 源码包的LDAP模块目录 ext/ldap,执行 phpize

cd /usr/local/src/php-8.3.11/ext/ldap
phpize

phpize 用于为 PHP 扩展生成构建环境。运行后它会生成 configure 文件。

1.3 复制ldap相关库文件

/usr/lib64/ 目录下的所有以 libldap 开头的文件复制到 /usr/lib/ 目录中:

cp -frp /usr/lib64/libldap* /usr/lib/

参数解释说明:

  • -f:强制覆盖目标目录中已经存在的文件,而不提示确认。
  • -r:递归复制目录和子目录中的所有内容。如果 libldap* 是目录,此选项将递归地复制目录内容。
  • -p:保留原文件的属性,如修改时间、所有权和权限。

命令的用途:

  • 这个命令通常用于确保 64 位库文件(libldap*)也能够在 32 位库路径(/usr/lib/)中使用。
  • libldap 是 OpenLDAP 的库文件,这个命令可能是为了让程序能够在不同架构的路径中找到这些 LDAP 库文件,避免因为库文件路径问题导致的错误。
1.4 编译和安装ldap扩展
./configure --with-php-config=/usr/local/php/bin/php-config
make -j$(nproc)
make install

# 安装后输出以下信息表示编译成功
Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-zts-20230831/
1.5 启用ldap扩展

修改 PHP 的主配置文件 /usr/local/php/etc/php.ini,替换以下内容以启用 ldap 扩展:

sed -i 's@;extension_dir = "ext"@extension_dir = "/usr/local/php/lib/php/extensions/no-debug-zts-20230831"@g' /usr/local/php/etc/php.ini
sed -i 's@;extension=ldap@extension=ldap@g' /usr/local/php/etc/php.ini
1.6 重启PHP服务

配置完成后,需重启 PHP 服务方可生效:

systemctl restart php-fpm
1.7 验证ldap模块

执行以下命令,查看是否有 ldap 模块:

php -m | grep ldap

如果输出包含 ldap,说明模块已经成功安装并加载。

执行以下命令,查看 PHP 配置中的模块信息:

php -i | grep -i ldap

这将显示与 ldap 模块相关的详细信息,包括版本号和路径。如果输出中包含类似 LDAP Support => enabled 的信息,表示 LDAP 模块已成功启用。

1.8 测试PHP连接LDAP服务器

编写一个 PHP 脚本 ldap.php 测试 LDAP 连接是否正常,这里用 nginx 来配置,存放于 /usr/local/nginx/html 目录下:

cat > /usr/local/nginx/html/ldap.php <<'EOF'
<?php
// 设置 LDAP 服务器的完整 URI,包括端口号
$ldap_server = "ldap://<IP>:389";

// LDAP 管理员 DN 和密码,或者匿名绑定
$ldap_dn = "cn=xxx,cn=xxx,dc=xxx,dc=xxx,dc=xxx";
$ldap_password = "xxx";

// 连接到 LDAP 服务器
$ldapconn = ldap_connect($ldap_server);

if (!$ldapconn) {
    die("无法连接到 LDAP 服务器");
}

// 设置 LDAP 选项
ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3);  // 使用 LDAP v3 版本
ldap_set_option($ldapconn, LDAP_OPT_REFERRALS, 0);         // 禁止自动重定向

// 绑定到 LDAP 服务器(可以是匿名绑定,也可以使用管理员 DN 和密码)
$ldapbind = ldap_bind($ldapconn, $ldap_dn, $ldap_password);

if ($ldapbind) {
    echo "LDAP 绑定成功,连接正常。";
} else {
    echo "LDAP 绑定失败,无法连接到服务器。";
}

// 关闭连接
ldap_close($ldapconn);
?>
EOF

关键部分解释:

  • ldap_connect():初始化与 LDAP 服务器的连接,但不实际进行连接。
  • ldap_bind():真正执行连接和身份验证。如果提供了正确的 DN(域名)和密码,绑定成功会返回 true,否则返回 false
  • ldap_set_option():设置 LDAP 选项,例如使用 LDAP v3 版本。

浏览器访问地址 http://10.22.51.50:8082/ldap.php

image-20240912133724027

2.添加GetText模块

gettext 模块是用于处理国际化(i18n)和本地化(l10n)的 PHP 扩展。它允许您将应用程序的文本内容翻译成多种语言,从而使应用程序能够支持多语言用户界面。

2.1 安装依赖
yum install -y gettext-devel
2.2 进入gettext扩展目录并运行phpize

进入 PHP 源码包的gettext模块目录 ext/gettext,执行 phpize

cd /usr/local/src/php-8.3.11/ext/gettext
phpize
2.3 复制gettext相关库文件

/usr/lib64/ 目录下的所有以 libgettext 开头的文件复制到 /usr/lib/ 目录中:

cp -frp /usr/lib64/libgettext* /usr/lib/
2.4 编译和安装gettext扩展
./configure --with-php-config=/usr/local/php/bin/php-config
make -j$(nproc)
make install

# 安装后输出以下信息表示编译成功
Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-zts-20230831/
2.5 启用gettext扩展

修改 PHP 的主配置文件 /usr/local/php/etc/php.ini,替换以下内容以启用 gettext 扩展:

sed -i 's@;extension_dir = "ext"@extension_dir = "/usr/local/php/lib/php/extensions/no-debug-zts-20230831"@g' /usr/local/php/etc/php.ini
sed -i 's@;extension=gettext@extension=gettext@g' /usr/local/php/etc/php.ini

如果前面已启用ldap扩展,第一条命令不需要再操作。

2.6 重启PHP服务

配置完成后,需重启 PHP 服务方可生效:

systemctl restart php-fpm
2.7 验证gettext模块

执行以下命令,查看是否有 gettext 模块:

php -m | grep gettext

如果输出包含 gettext,说明模块已经成功安装并加载。

执行以下命令,查看 PHP 配置中的模块信息:

php -i | grep -i gettext

这将显示与 gettext 模块相关的详细信息,包括版本号和路径。如果输出中包含类似 GetText Support => enabled 的信息,表示 LDAP 模块已成功启用。

2.8 测试使用gettext模块的PHP脚本

zh_CN 翻译目录下创建 messages.po 文件,文件内包含原始文本和翻译文本:

cat > /usr/share/locale/zh_CN/LC_MESSAGES/messages.po <<'EOF'
msgid "Hello World"
msgstr "你好,世界"
EOF

使用 msgfmt 工具将 .po 文件编译成 .mo 文件:

msgfmt /usr/share/locale/zh_CN/LC_MESSAGES/messages.po -o /usr/share/locale/zh_CN/LC_MESSAGES/messages.mo

创建一个 PHP 脚本 gettext.php 测试不同语言环境下的 gettext 功能,这里用 nginx 来配置,存放于 /usr/local/nginx/html 目录下:

cat > /usr/local/nginx/html/gettext.php <<'EOF'
<?php
// Check if gettext is loaded
if (extension_loaded('gettext')) {
    echo "Gettext extension is loaded.\n";
} else {
    echo "Gettext extension is not loaded.\n";
}

// Set language environment
putenv('LANG=zh_CN.UTF-8');
setlocale(LC_ALL, 'zh_CN.UTF-8');

// Specify the directory where the translation files are located
bindtextdomain('messages', '/usr/share/locale');
textdomain('messages');

// Test gettext function
echo gettext('Hello World');
?>
EOF

部分解释:

  • extension_loaded('gettext'):这个函数检查 PHP 是否已加载名为 gettext 的扩展。
  • putenv('LANG=zh_CN.UTF-8'):设置环境变量 LANGzh_CN.UTF-8,指定了当前的语言环境为中文。putenv() 用于在脚本的执行环境中设置环境变量。
  • setlocale(LC_ALL, 'zh_CN.UTF-8');:设置当前的区域设置为 zh_CN.UTF-8(中文)。setlocale() 函数用于设置区域环境,LC_ALL 参数表示所有的区域类别。
  • bindtextdomain('messages', '/usr/share/locale');:指定 gettext 使用的消息目录。'messages'.mo 文件,'/usr/share/locale' 是目录路径。bindtextdomain() 函数告诉 gettext 扩展去哪个目录查找翻译文件。
  • textdomain('messages');:设置默认的消息域为 'messages'textdomain() 函数用于设置当前的文本域,gettext 会根据这个域名查找翻译文件。
  • gettext('Hello World');:这个函数会翻译 'Hello World' 这个字符串。gettext() 会根据当前的语言环境和设置的域查找对应的翻译。如果翻译文件中有这个字符串的翻译,它将输出翻译后的字符串;如果没有翻译,它将返回原始的 'Hello World' 字符串。

重启PHP服务:

systemctl restart php-fpm

浏览器访问地址 http://10.22.51.50:8082/gettext.php,显示的文本翻译为了中文,说明配置正确:

image-20240912150845862

十、其他说明

1.关于php.ini配置文件部分参数选项

vim /usr/local/php/etc/php.ini

# 隐藏PHP版本号,可以使用curl命令查看
sed -i 's@expose_php = On@expose_php = Off@g' /usr/local/php/etc/php.ini

# 开启短标签
short_open_tag = On 

# 取消强制定义变量
error_reporting = E_ALL & ~E_NOTICE

# 全局变量
register_globals = On

# 关闭错误提示
display_errors = Off

2.关于--with-fpm-user--with-fpm-group

--with-fpm-user--with-fpm-group 选项用于指定在编译 PHP 时,PHP-FPM 进程运行时的用户和用户组。具体来说:

  • --with-fpm-user:指定 PHP-FPM 进程运行时的用户为 nginxapache 。也就是说,PHP-FPM 子进程将以 nginxapache 用户的身份运行。
  • --with-fpm-group:指定 PHP-FPM 进程运行时的用户组为 nginxapache 。PHP-FPM 子进程将以 nginxapache 用户组的权限运行。

为什么需要指定用户和用户组?

  • PHP-FPM 是 PHP 的 FastCGI 进程管理器,通常与 Nginx 或 Apache 配合使用。
  • 为了安全性,PHP-FPM 进程不应该以 root 用户运行,而是应该运行在一个低权限的用户下(如 nginx)。
  • 指定 nginxapache 用户和用户组,确保 PHP-FPM 与 Nginx 或 Apache 服务器配合得当。通常,Nginx 或 Apache 服务器本身也是以 nginxapache 用户运行的,这样可以避免权限冲突和安全风险。

总结:

这两个选项的作用是确保 PHP-FPM 进程以 nginx 用户和组的权限运行,从而与 Nginx 配合使用时,权限设置更加合理、安全。同理如果是 apache 也一样。