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服务框架的工作示意图:
2.LAMP架构部署过程
LAMP服务框架安装步骤分为:
- 安装编译的环境
- 安装Httpd服务
- 安装PHP7.4服务
- 配置PHP文件解析
- 配置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:
- Perl is not installed
- apxs was not found. Try to pass the path using --with-apxs2=/path/to/apxs
- 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
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