Bootstrap

CentOS管理-PHP7+Web环境

1. 基本介绍

PHP是一种服务器端脚本语言,它需要在服务器上运行并由服务器解析。当客户端发送一个请求到服务器时,Web服务会接收到这个请求并将其传递给PHP解析器,然后PHP解析器会解析并执行PHP脚本,最后将结果返回给客户端。因此,PHP需要web服务来解析和执行PHP脚本。

在之前的文章中介绍了 Nginx+Apache环境 的编译安装,也是本次安装PHP环境的前置条件,我们需要使用Web服务来解析我们安装的PHP服务。

本次选择安装的PHP版本为7.4.33,PHP官方 已经停止维护PHP7,版本7.4.33也是PHP7的最后更新的一个版本。

2.1. PHP安装步骤

2.1. 编译环境

由于之前配置Nginx+Apache环境的过程中已经安装过了gcc、pcre等编译依赖,这里就不重复安装。

但是我们仍需要手动安装oniguruma,它是一个处理正则表达式的库,本次过程中mbstring的正则表达式处理功能对这个包有依赖性,所以我们要先安装这个库。

国内yum源的安装版本过使得编译PHP的过程中出现版本过低的问题,需要手动安装。

#1.安装编译php的环境依赖
yum install libxml2-devel sqlite-devel curl-devel -y

#2.安装postgresql-devel(postgresql的lib库),否则无法安装psql的模块
yum install postgresql-devel -y

#3.下载oniguruma的tar包,并解压/opt/src目录
mkdir -p /opt/src && cd /opt/src
wget https://github.com/kkos/oniguruma/archive/v6.9.4.tar.gz -O oniguruma-6.9.4.tar.gz
tar xf oniguruma-6.9.4.tar.gz

#4.编译oniguruma程序
cd /opt/src/oniguruma-6.9.4/
./autogen.sh && ./configure --prefix=/usr

#5.构建oniguruma程序
make && make install

2.2. 编译安装

PHP7.4的扩展功能不支持动态编译添加,在PHP编译添加参数 --with-pdo-pgsql --with-pgsql--enable-mysqlnd--with-pdo-mysql--with-mysqli 来配置拓展,部分拓展编译依赖于开发工具。

Httpd通过PHP7编译参数 --with-apxs2 为Httpd服务安装 libphp7.so模块实现对PHP文件的解析,配置路径为httpd服务的bin目录下apxs脚本,如:--with-apxs2=/opt/apps/httpd/bin/apxs

#1.下载php程序的tar包,解压至/opt/src目录。
wget https://www.php.net/distributions/php-7.4.33.tar.gz -P /opt/src
cd /opt/src && tar xf php-7.4.33.tar.gz

#2.编译php-7.4程序
cd /opt/src/php-7.4.33
./configure --prefix=/opt/apps/php \				#指定默认php的home目录
--with-config-file-path=/opt/apps/php/etc/ \		#指定默认php.ini文件存放的目录
--with-config-file-scan-dir=/opt/apps/php/etc/php.d \
--with-freetype \
--with-jpeg \
--with-zlib \
--with-curl \
--with-openssl \
--with-mhash \
--with-xmlrpc \
--with-iconv \
--without-pear \
--with-gettext \
--enable-gd \
--disable-rpath \
--enable-bcmath \
--enable-shmop \
--enable-sysvsem \
--enable-mbstring \
--enable-pcntl \
--enable-sockets \
--enable-soap   \
--enable-xml \
--enable-inline-optimization \
--enable-mbregex \
--enable-fpm \
--enable-mysqlnd \
--with-mysqli \
--with-pdo-mysql \
--with-pdo-pgsql \
--with-pgsql \
--with-apxs2=/opt/apps/httpd/bin/apxs

#3.构建php-7.4程序
make -j4 && make install

#4.运行构建提示的libtool脚本,可能没有该提示
libtool --finish /opt/src/php-7.4.33/libs

2.3. 管理服务

#1.创建软链接管理PHP版本
cd /opt/apps/
mv php php-7.4.33
ln -s php-7.4.33 php

#2.拷贝php.ini文件
cp /opt/src/php-7.4.33/php.ini-production /opt/apps/php/etc/php.ini

#3.拷贝php-fpm.conf文件
cp /opt/apps/php/etc/{php-fpm.conf.default,php-fpm.conf}

#4.拷贝www.conf文件
cp /opt/apps/php/etc/php-fpm.d/{www.conf.default,www.conf}

#5.将php服务注册为系统服务
cat <<EOF > /usr/lib/systemd/system/php-fpm.service
[Unit]
Description=The PHP FastCGI Process Manager
After=syslog.target network.target

[Service]
Type=simple
PIDFile=/opt/apps/php/var/run/php-fpm.pid
ExecStart=/opt/apps/php/sbin/php-fpm --nodaemonize --fpm-config /opt/apps/php/etc/php-fpm.conf
ExecReload=/bin/kill -USR2 \$MAINPID
ExecStop=/bin/kill -SIGINT \$MAINPID

[Install]
WantedBy=multi-user.target
EOF

#6.重新加载系统服务
systemctl daemon-reload

3.4. 配置文件

#1.修改php.ini文件
sed -i -e 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g' /opt/apps/php/etc/php.ini

#2.修改php-fpm.conf文件,调整日志级别
sed -i -e 's/;log_level = notice/log_level = warning/g' /opt/apps/php/etc/php-fpm.conf

#4.修改www.conf文件,注意根据配置解析WEB的用户(这里配置用户是httpd解析)
tee > /opt/apps/php/etc/php-fpm.d/www.conf <<EOF
[www]
;user = nginx
;group = nginx
;listen.owner = nginx
;listen.group = nginx

user = httpd
group = apache
listen.owner = httpd
listen.group = apache

listen = var/run/php.cgi.sock
listen.backlog = -1
listen = 127.0.0.1:9000
listen.mode = 0660
listen.allowed_clients = 127.0.0.1

pm = dynamic
pm.max_children = 20
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 20

slowlog = log/\$pool.log.slow

request_slowlog_timeout = 0
request_terminate_timeout = 100
EOF

3. Web服务配置

3.1. Nginx配置文件

vim /opt/apps/nginx/conf/conf.d/nginx.conf
server {
    listen       80;
    server_name  localhost;

    location / {
        root   html;
        index  index.html index.htm index.php;
    }

    location ~ \.php$ {
        root           html;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}

3.2. Nginx功能验证

#1.在httpd默认web目录下创建.php文件
tee > /opt/apps/nginx/html/phpinfo.php <<EOF
<?php 
    phpinfo(); 
?>
EOF

#2.关闭所有服务
systemctl stop php-fpm httpd nginx

#3.编辑php启动用户为nginx
vim /opt/apps/php/etc/php-fpm.d/www.conf
user = nginx
group = nginx

listen.owner = nginx
listen.group = nginx

#4.重新启动nginx和php服务
systemctl start php-fpm nginx

#5.访问phpinfo文件后,查看环境配置
访问链接:https://host-ip/phpinfo.php

在这里插入图片描述

3.3. Httpd配置文件

#1.在httpd.conf文件中添加PHP解析
vim /opt/apps/httpd/conf/httpd.conf

#检查内容1:检查libphp7.so模块是否被注释
</IfModule>
LoadModule php7_module        modules/libphp7.so
<IfModule unixd_module>

#修改内容2:修改默认目录的权限
<Directory />
    AllowOverride none
    Require all granted
</Directory>

#修改内容3:添加.php文件的识别
<IfModule dir_module>
    DirectoryIndex index.html index.php
</IfModule>

#修改内容4:添加应用类型x-httpd-php
    #AddType application/x-compress .Z
    #AddType application/x-gzip .gz .tgz
    AddType application/x-httpd-php .php

3.4. Httpd功能验证

#1.在httpd默认web目录下创建.php文件
tee > /opt/apps/httpd/htdocs/phpinfo.php <<EOF
<?php 
    phpinfo(); 
?>
EOF

#2.关闭所有服务
systemctl stop php-fpm httpd nginx

#3.编辑php启动用户为nginx
vim /opt/apps/php/etc/php-fpm.d/www.conf
user = httpd
group = apache

listen.owner = httpd
listen.group = apache

#4.重新启动httpd和php服务
systemctl start php-fpm httpd

#5.访问phpinfo文件后,查看环境配置
访问链接:https://host-ip/phpinfo.php

在这里插入图片描述

4. PHP拓展模块

4.1. 模块安装-mysqli

#1.安装mysqli.so扩展
cd /opt/src/php-7.4.33/ext/mysqli/
/opt/apps/php/bin/phpize

./configure --with-php-config=/opt/apps/php/bin/php-config --with-mysqli=mysqlnd
make -j4 && make install

#2.安装pdo_mysql.so扩展(可选)
cd /opt/src/php-7.4.33/ext/pdo_mysql/
/opt/apps/php/bin/phpize

./configure --with-php-config=/opt/apps/php/bin/php-config --with-pdo-mysql=mysqlnd
make -j4 && make install

#3.修改php.ini配置文件,取消mysqli.so扩展的注释
sed -i -e 's/;extension=mysqli/extension=mysqli/g' /opt/apps/php/etc/php.ini
sed -i -e 's/;extension=pdo_mysql/extension=pdo_mysql/g' /opt/apps/php/etc/php.ini

#4.修改php.ini配置文件,配置拓展模块的目录路径
extension_dir = "/opt/apps/php-7.4/lib/php/extensions/no-debug-non-zts-20190902/"

4.2. 模块安装-pgsql

#1.安装pgsql.so扩展
cd /opt/src/php-7.4.33/ext/pgsql/
/opt/apps/php/bin/phpize

./configure --with-php-config=/opt/apps/php/bin/php-config --with-pgsql
make -j4 && make install

#2.安装pdo_pgsql.so扩展(可选)
cd /opt/src/php-7.4.33/ext/pdo_pgsql/
/opt/apps/php/bin/phpize

./configure --with-php-config=/opt/apps/php/bin/php-config --with-pdo-pgsql
make -j4 && make install

#3.修改php.ini配置文件,取消pgsql和pdo_pgsql扩展的注释
sed -i -e 's/;extension=pgsql/extension=pgsql/g' /opt/apps/php/etc/php.ini
sed -i -e 's/;extension=pdo_pgsql/extension=pdo_pgsql/g' /opt/apps/php/etc/php.ini

#4.修改php.ini配置文件,配置拓展模块的目录路径
extension_dir = "/opt/apps/php/lib/php/extensions/no-debug-non-zts-20190902/"

4.3. 模块安装-ldap

该模块安装时可能会出现的报错信息。

#编译错误1:configure: error: Cannot find ldap.h
#解决方法1:
yum install openldap-devel  -y

#编译错误2:configure: error: Cannot find ldap libraries in /usr/lib
#解决方法2:
cp -frp /usr/lib64/libldap* /usr/lib/

若出现上述的报错信息,处理完后重新进行编译。

#1.生成ldap目录的编译环境
cd /opt/src/php-7.4.33/ext/ldap/
/opt/apps/php/bin/phpize

#2.编译并构建ldap模块
./configure --with-php-config=/opt/apps/php/bin/php-config --with-ldap
make -j4 && make install

#3.修改php.ini配置文件,取消ldap.so扩展的注释
sed -i -e 's/;extension=ldap/extension=ldap.so/g' /opt/apps/php/etc/php.ini

#4.修改php.ini配置文件,配置拓展模块的目录路径
extension_dir = "/opt/apps/php/lib/php/extensions/no-debug-non-zts-20190902/"

5. PHP模块验证

5.1. 验证mysqli模块

在web目录下创建一个php文件用于测试mysqli功能(mysql.php),写入下方的内容:

<?php
$host="192.168.233.10";
$user="user01";
$password="1234,abcd";
$port="3308";
$dbname="testdb";

//创建连接
@$conn=new mysqli($host,$user,$password,$dbname,$port);

//检测连接
if($conn->connect_errno){
    die("数据库连接失败!提示:".$conn->connect_error);
}
echo "数据库连接成功!"
?>

测试结果:
在这里插入图片描述

5.2. 验证pgsql模块

在web目录下创建一个php文件用于测试pgsql功能(pgsql.php),写入下方的内容:

<?php
$host="192.168.233.10";
$user="postgres";
$password="1234,abcd";
$port="8432";
$dbname="postgres";

//创建连接
@$dbtest = pg_connect("host={$host} port={$port} dbname={$dbname} user={$user} password={$password}");

//检测连接
if (!$dbtest) {
    echo "连接 PostgreSQL 数据库失败!";
} else {
    echo "连接 PostgreSQL 数据库成功!";
    pg_close($dbtest);
}
?>

测试结果:
在这里插入图片描述

;