0%

源码编译Apache和PHP实现lamp架构

  企业中web业务最常见的架构就是lamp架构、lnmp架构或者lnmt架构。本文将详细讲解lamp架构的源码编译方式的部署实现。

  所谓LAMP架构,是指:
    L:linux
    A:apache (httpd)
    M:mysql, mariadb
    (或M:memcached)
    P:php, perl, python
  WEB资源类型:
    静态资源:原始形式与响应内容一致,在客户端浏览器执行
    动态资源:原始形式通常为程序文件,需要在服务器端执行之后,将执行结果返回给客户端

LAMP工作原理

在这里插入图片描述
  httpd:接收用户的web请求;静态资源则直接响应;动态资源为php脚本,对此类资源的请求将交由php来运行
  php:运行php程序
  MariaDB:数据管理系统

httpd与php结合的方式

1、modules (将php编译成为httpd的模块,默认方式)
MPM:
prefork: libphp5.so
event, worker: libphp5-zts.so
2、FastCGI

  本文将分别展示以模块方式以及FCGI的方式,源码编译apache、php、mariadb来实现LAMP架构。

编译部署

编译安装mariadb

  之前曾详细介绍,这里就不再赘述。

编译安装apache

  先安装依赖包yum install gcc pcre-devel openssl-devel expat-devel autoconf libtool gcc-c++
  下载apache源码包以及apr包

1
2
3
wget https://archive.apache.org/dist/httpd/httpd-2.4.39.tar.gz
wget https://www-us.apache.org/dist//apr/apr-1.7.0.tar.gz
wget https://www-us.apache.org/dist//apr/apr-util-1.6.1.tar.gz

  替换apr、apr-util文件

1
2
3
4
5
tar xf apr-1.7.0.tar.gz -C httpd-2.4.39/srclib/ 
tar xf apr-util-1.6.1.tar.gz -C httpd-2.4.39/srclib/
cd httpd-2.4.39/srclib/
mv apr-1.7.0 apr
mv apr-util-1.6.1 apr-util

  编译安装

1
2
3
4
5
6
7
8
9
10
11
./configure --prefix=/data/httpd24 \
--enable-so \
--enable-ssl \
--enable-cgi \
--enable-rewrite \
--with-zlib \
--with-pcre \
--enable-modules=most \
--enable-mpms-shared=all \
--with-mpm=prefork \
--with-included-apr

1
make -j 4 && make install

  写入PATH变量,并生效

1
vim /etc/profile.d/httpd.sh

1
2
#!/bin/bash
export PATH=/data/httpd24/bin:$PATH
1
source /etc/profile.d/httpd.sh

编译安装php

模块方式

  先安装依赖包

1
yum install -y libxml2-devel

  在官网下载php最新版php-7.3.10.tar.xz包并解压

1
2
3
wget https://www.php.net/distributions/php-7.3.10.tar.xz
tar xvf php-7.3.10.tar.xz
cd php-7.3.10.tar.xz

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
./configure --prefix=/data/php/ \
--enable-mysqlnd \
--with-mysqli=mysqlnd \
--with-openssl \
--with-pdo-mysql=mysqlnd \
--enable-mbstring \
--with-freetype-dir \
--with-jpeg-dir \
--with-png-dir \
--with-zlib \
--enable-xml \
--enable-sockets \
--with-apxs2=/data/httpd24/bin/apxs \
--with-config-file-path=/data/php/etc \
--with-config-file-scan-dir=/data/php/etc/php.d \
--enable-maintainer-zts \
--disable-fileinfo

  PS:如果apache是之前yum装的,很有可能没有apxs文件,只需要dnf install httpd-devel -y命令安装httpd-devel包,即可生成/usr/bin/apxs工具,如果是以前编译安装的,也要改为正确apxs2对应路径。
  编译安装

1
make -j 4 && make install

  复制配置文件模版至配置文件目录

1
cp php.ini-production /data/php/etc/php.ini

  修改apache配置文件,设置默认php页面,增加PHP模块

1
vim /etc/httpd/conf/httpd.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<IfModule dir_module>
DirectoryIndex index.php index.html #增加php页面
</IfModule>

----
<IfModule mime_module>

AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz

AddType application/x-httpd-php .php #增加模块
AddType application/x-httpd-php-source .phps #增加模块


</IfModule>

  添加php测试页

1
vim /data/httpd24/htdocs/index.php

1
2
3
<?php
phpinfo()
?>

  重启apache服务

1
apachectl restart

  访问php测试页进行测试,便可看到php设置已经成功

1
curl HOSTIP

FCGI方式

  也要先安装依赖包

1
yum install libxml2-devel bzip2-devel libmcrypt-devel

  同样下载tar包,解压并进入编译目录
  开始编译安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
./configure --prefix=/data/php \
--enable-mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-openssl \
--with-freetype-dir \
--with-jpeg-dir \
--with-png-dir \
--with-zlib \
--with-libxml-dir=/usr \
--with-config-file-path=/etc \
--with-config-file-scan-dir=/etc/php.d \
--enable-mbstring \
--enable-xml \
--enable-sockets \
--enable-fpm \
--enable-maintainer-zts \
--disable-fileinfo

1
make -j 4 && make install

  复制模版文件当配置文件

1
cp /data/php-7.3.10/php.ini-production  /etc/php.ini

  因为php-fpm模式相当于单独的一个服务,将服务配置文件放至/usr/lib/systemd/system/目录

1
cp /data/php-7.3.10/sapi/fpm/php-fpm.service /usr/lib/systemd/system/

  生成fpm配置文件,并修改进程属主属组为apache

1
2
3
4
cd /data/php/etc
cp php-fpm.conf.default php-fpm.conf
cd php-fpm.d/
cp www.conf.default www.conf

1
2
3
4
vim www.conf

user apache
group apache

  加载配置文件并启动进程

1
2
systemctl daemon-reload
systemctl enable --now php-fpm.service

  修改配置httpd.conf 支持php-fpm
  取消下面两行的注释

1
2
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so

  修改下面行

1
2
3
4
5
6
7
8
<IfModule dir_module>
DirectoryIndex index.php index.html
</IfModule>
加下面四行
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
ProxyRequests Off
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/data/httpd24/htdocs/$1

  也可修改php监听端口9000 为socket路径,下面代理转发命令为为

1
2
ProxyRequests Off
ProxyPassMatch ^/(.*\.php)$ unix:/var/run/php-fpm/php-fpm.sock|fcgi://localhost/data/httpd24/htdocs/$1

  重启apache服务

1
apachectl restart

至此,php页面就可以正常访问了

------------------------------- The End -------------------------------
It's very nice of you to support me.