CentOS 6.10 下升级 Apache 2.2 到 2.4.41
上周五突然脑子又抽抽了,想要再试一次升级 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 --version
是 8.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
是开启多处理模块 MPM,prefork
兼容旧版本,可以选择用 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 - 纵马疾驰 - 博客园