Httpd+PHP+MySQL服务框架搭建
  i6Pc1dnUSuxO 2023年11月13日 34 0

1.LAMP服务框架说明

  本文章将会讲解CentOS7(Minimal)部署LAMP服务平台,此次重点讲解httpd服务如何调用php模块来解析PHP页面,以及PHP7中安装mysql的扩展模块,LAMP服务应用的安装顺序非常重要。

  部署过程中使用的下载链接可能会失效或下载速度慢的情况。   本次不演示MySQL部署,数据库部署请参考:MySQL5.7数据库部署

  • ·L代表:服务器是Linux操作系统
  • ·A代表:网站服务是Apache软件基金会中的httpd应用
  • ·M代表:网站使用的数据库是MySQL数据库
  • ·P代表:网站是使用PHP/Perl/Python等语言开发

LAMP服务框架的工作示意图: LAMP.png

2.LAMP架构部署过程

LAMP服务框架安装步骤分为:

  1. 安装编译的环境
  2. 安装Httpd服务
  3. 安装PHP7.4服务
  4. 配置PHP文件解析
  5. 配置PHP拓展功能

2.1 安装编译的环境

  最小化部署的centos7缺少应用编译的环境,编译安装可定制性高,可通过优化编译参数和选项来提升性能,重要的是更深入地了解应用程序的构建过程和原理,增加对操作系统和应用的理解和学习。

#1.安装编译httpd的环境依赖
yum install -y gcc gcc-c++ pcre pcre-devel \
zlib zlib-devel openssl openssl-devel gd gd-devel

#2.安装编译php的环境依赖,httpd编译依赖也会使用,不必重复安装
yum install -y patch gd-devel libxml2-devel libmcrypt-devel \
mhash-devel curl-devel libpng-devel libjpeg-devel \
freetype-devel sqlite-devel  zlib-devel gettext-devel

2.2 安装Httpd服务

#1.在/opt下创建apps和src目录存放应用和安装包
mkdir -p /opt/{apps,src}

#2.将httpd依赖的程序包下载至/opt/src目录
wget https://archive.apache.org/dist/apr/apr-1.6.5.tar.gz  -P /opt/src
wget https://archive.apache.org/dist/apr/apr-util-1.6.0.tar.gz  -P /opt/src
wget https://archive.apache.org/dist/httpd/httpd-2.4.57.tar.gz -P /opt/src

#3.在/opt/src目录下解压并编译apr程序,请注意依赖关系的安装顺序
cd /opt/src && tar -zxf apr-1.6.5.tar.gz 
cd /opt/src/apr-1.6.5
./configure --prefix=/usr/local/apr
make -j4 && make install

#4.在/opt/src目录下解压并编译apr-util程序,请注意依赖关系的安装顺序
cd /opt/src && tar -zxf apr-util-1.6.0.tar.gz 
cd /opt/src/apr-util-1.6.0
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
make -j4 && make install

#5.在/opt/src目录下解压并编译httpd应用,需要依赖于apr和apr-util程序
cd /opt/src && tar -zxf httpd-2.4.57.tar.gz 
cd /opt/src/httpd-2.4.57
./configure --prefix=/opt/apps/httpd-2.4 \
--with-apr=/usr/local/apr \
--with-apr-util=/usr/local/apr-util/ \
--with-pcre --with-zlib --with-mpm=prefork \
--enable-modules=all --enable-mpms-shared=all \
--enable-so --enable-rewrite --enable-ssl --enable-cgi
make -j4 && make install

#6.httpd安装目录下建立软链接来管理应用的版本
cd /opt/apps && ln -s httpd-2.4 httpd

#7.创建httpd服务的启动用户
groupadd apache && useradd httpd -g apache -s /sbin/nologin -M

#8.赋权httpd应用目录权限至httpd用户
chown -R httpd:apache /opt/apps/{httpd,httpd-2.4}

#9.修改httpd.cnf文件的运行用户
sed -i -e 's/User daemon/User httpd/g' /opt/apps/httpd/conf/httpd.conf
sed -i -e 's/Group daemon/Group apache/g' /opt/apps/httpd/conf/httpd.conf

#10.centos7配置systemctl进行httpd服务的管理
cat > /lib/systemd/system/httpd.service <<EOF
[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target
Documentation=man:httpd(8)
Documentation=man:apachectl(8)

[Service]
Type=forking
ExecStart=/opt/apps/httpd/bin/apachectl start
ExecReload=/opt/apps/httpd/bin/apachectl graceful
ExecStop=/opt/apps/httpd/bin/apachectl stop
KillSignal=SIGCONT
PrivateTmp=true

[Install]
WantedBy=multi-user.target
EOF

#11.centos7重新加载系统管理项
systemctl daemon-reload

#12.开启httpd服务并测试访问,若返回"HTTP/1.1 200 OK"属于正常
systemctl start httpd
curl -Is localhost| head -n 1  

2.3 安装PHP7.4服务

2.3.1 手动安装依赖

  oniguruma是一个处理正则表达式的库,我们之所以需要安装它,本次编译安装php7.4的过程中,mbstring的正则表达式处理功能对这个包有依赖性,所以我们要先安装这个库,国内yum源的安装版本过使得编译PHP的过程中出现版本过低的问题,因此需要从第三方下载新版本并安装。

#1.下载oniguruma的RPM安装包
cd /opt/src
wget https://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/o/oniguruma-6.8.2-2.el7.x86_64.rpm
wget https://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/o/oniguruma-devel-6.8.2-2.el7.x86_64.rpm

#4.在/opt/src目录下安装oniguruma库,需注意安装依赖的前后关系
# oniguruma-devel依赖于oniguruma程序,devel后缀才是编译时需要使用的。
rpm -ivh oniguruma-6.8.2-2.el7.x86_64.rpm
rpm -ivh oniguruma-devel-6.8.2-2.el7.x86_64.rpm

2.3.2 编译和构建

  通过php7.4编译参数--with-apxs2为httpd服务安装libphp7.so模块,httpd通过这个模块实现对php服务的调用,编译时配置httpd服务的bin目录下apxs脚本,具参数:--with-apxs2=/opt/apps/httpd/bin/apxs

  若在编译php7.4的时候没有添加mysqlnd和pdo_mysql扩展,而这两个扩展又不支持动态编译添加,会导致需要重新编译安装php7.4,因此在php7.4编译的过程中添加--enable-mysqlnd--with-pdo-mysql--with-mysqli 拓展的参数。

#1.检查/opt下的两个目录是否存在,先前安装Httpd已创建过
mkdir -p /opt/{apps,src}

#2.将PHP的安装包下载至/opt/src目录
wget https://www.php.net/distributions/php-7.4.29.tar.gz -P /opt/src
# 若提示签发证书已过期:Issued certificate has expired.
wget https://www.php.net/distributions/php-7.4.29.tar.gz -P /opt/src --no-check-certificate

#3.在/opt/src目录下解压PHP安装包
cd /opt/src && tar -zxf php-7.4.29.tar.gz

#4.编译安装PHP7.4
cd /opt/src/php-7.4.29
./configure --prefix=/opt/apps/php-7.4 \
--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-apxs2=/opt/apps/httpd/bin/apxs


#5.验证通过后,构建PHP7.4服务
make -j4 && make install

#6.php安装目录下建立软链接来管理应用的版本
cd /opt/apps && ln -s php-7.4 php

#7.验证PHP的版本信息
/opt/apps/php/bin/php -v
#PHP 7.4.29 (cli) (built: Jun 30 2023 16:07:31) ( NTS )
#Copyright (c) The PHP Group
#Zend Engine v3.4.0, Copyright (c) Zend Technologies

2.3.3 编译错误处理

错误的提示信息:

checking for Apache 2 handler module support via DSO through APXS...

Sorry, I cannot run apxs. Possible reasons follow:

  1. Perl is not installed
  2. apxs was not found. Try to pass the path using --with-apxs2=/path/to/apxs
  3. Apache was not built using --enable-so (the apxs usage page is displayed)

The output of /opt/apps/httpd/bin/apxs follows: ./configure: /opt/apps/httpd/bin/apxs: /replace/with/path/to/perl/interpreter: bad interpreter: No such file or directory configure: error: Aborting

  编译时可能遇到错误以及处理过程,编译过程中发现遇到apxs无法调用prel程序而中断,此时检查软件情况,发现运行Perl程序是正常的,编译参数--with-apxs2配置的路径也是存在的,当运行apxs脚本时出现了错误,检查首行的配置发现perl程序的路径没有配置。

#1.首先直接运行Httpd的apxs程序看看结果
/opt/apps/httpd/bin/apxs
-bash: /opt/apps/httpd/bin/apxs: /replace/with/path/to/perl/interpreter: bad interpreter: No such file or directory

#2.再查看一下apxs脚本的内容
head -1 /opt/apps/httpd/bin/apxs
#!/replace/with/path/to/perl/interpreter -w

#3.这里发现perl程序路径位置是不正确的,第一行修改为“#!/usr/bin/perl -w”
sed -i -e '1s#/replace/with/path/to/perl/interpreter#/usr/bin/perl#g' /opt/apps/httpd/bin/apxs

#4.重新执行编译操作

2.3.4 配置PHP服务

#1.拷贝PHP安装包目录下的php.ini文件至PHP安装目录etc/下
cd /opt/src/php-7.4.29/
cp php.ini-production /opt/apps/php/etc/php.ini

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

#3.拷贝php-fpm.conf文件至etc/目录下
cd /opt/apps/php/etc/
cp php-fpm.conf.default php-fpm.conf

#4.修改php-fpm.conf文件中log_level日志输出级别
sed -i -e 's/;log_level = notice/log_level = warning/g' /opt/apps/php/etc/php-fpm.conf

#5.拷贝www.conf文件至etc/php-fpm.d/目录下
cd /opt/apps/php/etc/php-fpm.d/
cp www.conf.default www.conf

#6.修改www.conf配置文件内容,这里删除注释部分,配置用户和组为httpd服务的用户。
tee > www.conf <<EOF
[www]
user = httpd
group = apache

listen = var/run/php.cgi.sock
listen.backlog = -1
listen = 127.0.0.1:9000
listen.owner = httpd
listen.group = apache
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

#7.centos7配置systemctl进行httpd服务的管理
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

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

#9.启动php服务
systemctl start php-fpm

2.4 配置PHP文件解析

2.4.1 配置httpd.conf

#1.在httpd.conf文件中添加PHP解析
vi /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

#2.重启httpd服务使配置生效
systemctl restart httpd

2.4.2 测试phpinfo界面

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

#2.Centos7防火墙上允许访问80端口
firewall-cmd --zone=public --add-port=80/tcp --permanent 
firewall-cmd --reload

浏览器访问服务地址,如果httpd能够正常解析phpinfo.php文件则会输入关于php服务的配置信息。 访问地址:http://localhost/phpinfo.php 测试具体地址:http://192.168.233.10/phpinfo.php

image.png

2.5配置PHP扩展功能

2.5.1 安装Mysqli模块

  相对与PHP5,PHP7的最大变化是移除了mysql扩展,推荐使用mysqli或者pdo_mysql。运行phpize初始化mysql拓展进行编译安装。编译安装 mysqli和 pdo-mysql拓展,推荐 PHP的mysqli扩展连接MySQL数据库。

 原文参考:PHP: 概述 - Manual

#1.安装mysqli.so扩展
cd /opt/src/php-7.4.29/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.29/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

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

2.5.2 运行phpize错误处理

#1.运行phpize提示未找到autoconf,yum安装即可。
/opt/apps/php/bin/phpize
#Cannot find autoconf. Please check your autoconf installation and the
#$PHP_AUTOCONF environment variable. Then, rerun this script.

#2.yum安装m4和autoconf
yum install -y m4 autoconf

2.5.3 测试mysql拓展功能

#从SSH控制台以root身份到登录MySQL服务
#1.创建测试的数据库和用户
create database testdb;
create user 'user01'@'%' IDENTIFIED BY '1234,abcd';

#2.配置用户能够远程登录MySQL服务
grant all privileges on testdb.* to 'user01'@'%' identified by '1234,abcd'; 

  在httpd的web目录下创建mysqli扩展连接数据库的测试php文件,我这边将文件命名为:mysql.php ,具体文件路径:/opt/apps/httpd/htdocs/mysql.php ,复制下方的测试连接mysql的代码进行测试:

<?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 "数据库连接成功!"
?>

浏览器访问服务地址,如果php成功调用mysqli模块,无论连接是否成功都会返回信息。 测试具体地址:http://192.168.233.10/mysql.php

image.png image.png

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月13日 0

暂无评论

推荐阅读
  iFlC2TQwmEmX   2023年12月11日   34   0   0 phpthinkPHP框架
  iFlC2TQwmEmX   2023年12月09日   30   0   0 php
i6Pc1dnUSuxO
作者其他文章 更多