上周五突然脑子又抽抽了,想要再试一次升级 Apache 2.2 到 2.4 版本。之前试过两次都失败了,一次是走到升级 OpenSSL 发现不兼容,另一次是升级好了,php 也重新编译安装了,但访问 php 文件会源码输出。主要也是看到好多的教程文章,标题就是 Apache 2.4 ,PHP 7.3 的编译安装,这让我不禁怀疑,是不是我升级的步骤不对。

一、安装依赖包

通过 yum 安装(未测试过)

yum install openssl-devel expat-devel apr apr-devel apr-util apr-util-devel pcre

如果编译环境和下载工具也没有,可以用 yum 安装:

yum install epel-release gcc gcc-c++ make wget

通过源码包编译安装

## httpd 安装的依赖包
yum -y install openssl-devel 
yum -y install pcre-devel
## 编译工具包
yum -y install groupinstall "Development Tools"
## arp-util 安装的依赖包
yum -y install expat-devel 

对比上面的 yum 安装,主要需要编译安装三个东西,pcre、apr、apr-util。pcre 之前有编译安装过,pcre-config --version 查看到的版本是 8.12,而 /usr/local/pcre/bin/pcre-config --version8.43

如果已安装就不用管了,等编译 httpd 的时候报错提示版本低了再去找 pcre 官网 下最新版本编译安装,大小在 2M 左右。

一般的 pcre 编译安装流程

## 下载链接从 pcre 官网获取的,后面的参数是取消 https 证书验证
wget https://ftp.pcre.org/pub/pcre/pcre-8.44.tar.gz --no-check-certificate
## 解压压缩包,-C 是指定解压缩到的目录,默认是当前目录
tar zxvf pcre-8.44.tar.gz -C /usr/local/src
cd /usr/local/src/pcre-8.44
./configure --prefix=/usr/local/pcre
make && make install

apr 和 apr-util 也是一样,可以直接下载编译安装:

wget https://mirrors.tuna.tsinghua.edu.cn/apache/apr/apr-1.7.0.tar.gz
tar apr-1.7.0.tar.gz -C /usr/local/src
cd /usr/local/src/apr-1.7.0
./configure --prefix=/usr/local/apr
make && make install
wget https://mirrors.tuna.tsinghua.edu.cn/apache//apr/apr-util-1.6.1.tar.gz
tar apr-util-1.6.1 -C /usr/local/src
cd /usr/local/src/apr-util-1.6.1
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/
make && make install

也可以解压放到下载的 httpd 2.4 目录下的 srlib

tar apr-1.7.0.tar.gz -C /alidata/server/httpd-2.4.41c/srclib
mv /alidata/server/httpd-2.4.41/srclib/apr-1.7.0 /alidata/server/httpd-2.4.41/srclib/apr
tar apr-util-1.6.1 -C /usr/local/server/httpd-2.4.41c/srclib
mv /alidata/server/httpd-2.4.41/srclib/apr-util-1.6.1 /alidata/server/httpd-2.4.41/srclib/apr-util

两种方式,主要区别在于,前者是直接安装到环境中的,后者是在 httpd 编译安装过程中进行编译安装的。在 httpd 编译参数上的区别:

直接安装:--with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util
由 httpd 安装:--with-included-apr

我采用的是由 httpd 安装,具体 httpd 编译参数在下面会贴出来。

二、安装、配置 httpd

下载安装 httpd 2.4

wget http://mirror.bit.edu.cn/apache//httpd/httpd-2.4.43.tar.gz
tar zxvf httpd-2.4.43.tar.gz -C /usr/local/src
cd /usr/local/src/httpd-2.4.43
./configure --prefix=/alidata/server/httpd --with-mpm=prefork --enable-so --enable-rewrite --enable-mods-shared=all --enable-nonportable-atomics=yes --disable-dav --enable-deflate --enable-cache --enable-disk-cache --enable-mem-cache --enable-ssl --enable-file-cache --with-ssl=/usr/local/ssl --with-included-apr --with-pcre=/usr/local/pcre
make && make install

主要看 ./configure 后面的参数。--prefix 指定安装的目录。--with-mpm 是开启多处理模块 MPMprefork 兼容旧版本,可以选择用 workder 或 event--enable-so 猜测是识别 so 文件名的模块。--enable-rewrite 开启重写,就是隐藏路由中入口文件名相关的功能。disable-dav 关闭 dav 模块,dav 主要增加 PUT, DELETE, MKCOL, COPY 和 MOVE 等类型的方法。--enable-deflate 支持 gzip 压缩,通过压缩页面优化传输速度,详见 Nginx 和 Apache 设置 gzip 压缩。带有 cache 的就是开启相关类型的缓存了,如文件缓存,内存缓存等。--enable-ssl--with-ssl 是指定 OpenSSL 的位置,主要涉及到网络安全传输,比如使用 https。--with-included-apr 是在 apr 和 apr-utl 已经解压缩放到 srclib 中的情况。--with-pcre 使用兼容的正则表达式库。

每此编译成功后,httpd 和 php 都会讲编译的指令参数写入到文件 config.nice 中,可以通过 find / -name config.nice 查看服务器上所有的成功编译的编译参数。

上面的编译参数就是根据这个文件进行还原的,可能有些参数不一样,但也能编译成功。

"./configure" \
"--prefix=/alidata/server/httpd" \
"--with-mpm=prefork" \
"--enable-so" \
"--enable-rewrite" \
"--enable-mods-shared=all" \
"--enable-nonportable-atomics=yes" \
"--disable-dav" \
"--enable-deflate" \
"--enable-cache" \
"--enable-disk-cache" \
"--enable-mem-cache" \
"--enable-ssl" \
"--enable-file-cache" \
"--with-ssl=/usr/local/ssl" \
"--with-included-apr" \
"--with-pcre=/usr/local/pcre/" \
"$@"

配置

因为是升级,所以需要把之前的目录下的域名证书、虚拟主机设置全都搬到新版 httpd 安装目录下。

然后就是修改 httpd.conf 文件了。可以对照旧版本的设置,将 LoadModule 部分需要开启的模块开启一下,还有之前配置的 gzip 压缩的配置内容也要转移过来。

...
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
...
LoadModule deflate_module modules/mod_deflate.so
...
LoadModule ssl_module modules/mod_ssl.so
...
LoadModule rewrite_module modules/mod_rewrite.so
#LoadModule php7_module modules/libphp7.so

最后的 php7_module 可以在后面 php 重新编译安装后开启。

对于执行 httpd 的用户和用户组需要配置一下

## 创建 httpd 脚本执行者的用户和用户组
useradd -U apache
vim httpd/conf/httpd.conf
## 修改配置文件
User apache
Group apache

这里配置的用户和用户组在 ps aux | grep httpd 时可以出来,除了主进程用户为 root,其余子进程所属用户都是 apache。

[notice]在开启了 httpd 服务之后,针对配置文件 httpd.conf 的每一次修改都需要重启服务才能生效。[/notice]

文档更目录修改

DocumentRoot "/alidata/www"
<Directory "/alidata/www">

修改成之前的根目录地址。

添加 php 支持

这个之前没遇到过,应该是 httpd 新版本才需要配置的特性,不配置不行,会 403 报错,比较奇葩。

<IfModule mime_module>
...
    AddType application/x-httpd-php .php
    AddType application/x-httpd-php-source .phps
</IfModule>

添加目录索引

<IfModule dir_module>
    DirectoryIndex index.html index.htm index.php
</IfModule>

引入 mpm 和虚拟主机配置

Include conf/extra/httpd-mpm.conf
Include conf/extra/httpd-vhosts.conf
Include conf/extra/httpd-ssl.conf

重新编译 php

参考之前 php 7.3.5 安装httpd 2.2(Apache) 下安装和配置 php 7.3.3

config.nice 内容:

'./configure' \
'--prefix=/alidata/server/php-7.3.5' \
'--with-openssl' \
'--with-config-file-path=/alidata/server/php-7.3.5/etc' \
'--with-mysqli' \
'--with-pdo-mysql' \
'--with-gd' \
'--with-iconv=/usr/local/libiconv' \
'--with-zlib' \
'--enable-zip' \
'--enable-inline-optimization' \
'--enable-xml' \
'--enable-bcmath' \
'--enable-shmop' \
'--enable-sysvsem' \
'--enable-mbregex' \
'--enable-mbstring' \
'--enable-ftp' \
'--enable-pcntl' \
'--enable-sockets' \
'--with-xmlrpc' \
'--enable-soap' \
'--without-pear' \
'--with-gettext' \
'--enable-session' \
'--with-curl' \
'--with-jpeg-dir' \
'--with-freetype-dir' \
'--enable-opcache' \
'--enable-fpm' \
'--with-fpm-user=nginx' \
'--with-fpm-group=nginx' \
'--without-gdbm' \
'--with-pcre-regex' \
'--with-png-dir' \
'--enable-fileinfo' \
'--with-apxs2=/alidata/server/httpd/bin/apxs' \

直接用 ./config.nice 完成配置工作(主要是怕参数不对)。

--with-fpm-user=nginx--with-fpm-group=nginx 应该是默认生成的参数,可以自定这个参数,也可以后续修改 php-fpm 配置文件,重启 php-fpm 服务使之生效。

编译安装会自动将 libphp7.so 添加到 httpd/modules 目录下,权限为 755。后续还需要针对 php.ini 和 php-fpm 的配置文件做修改,具体参考 httpd 2.2(Apache) 下安装和配置 php 7.3.3

错误分析

访问 php 出现源码

未添加目录索引,可以参看上面的添加目录索引。
未添加 php 支持,参考上面的添加 php 支持。

访问 403

使用 httpd -t 检查一下配置是否正确,检查引入的虚拟主机配置是否正常引入。

我出现这种情况的原因是修改了 httpd-ssl.conf 中的默认虚拟主机配置 <VirtualHost _default_:443>
记住:不要修改 ServerName www.example.com:443,保持原样就好,或者干脆不要引入 httpd-ssl.conf 文件。

参考教程:
CentOS 7 源代码安装 Apache2.4 和 PHP7.3 - CSDN
CentOS7编译安装httpd-2.4.41 php7.3 - 纵马疾驰 - 博客园