很好,我又开看似不需要的新坑了。

主要是想启用 HTTP/2 了,虽然现在还在使用 CentOS 6.X,但是有升级到 CentOS 7.X 的打算,所以写个博客记录一下。

 

阅读这篇文章前,有些东西需要知道一下:

1. 这次不会像之前的文章一样写得那么详细了,点到为止

2. 依旧没有“一键安装”脚本,因为懒

3. 小白用户或者没有支持 HTTP/2 计划的小伙伴请移步《编译安装LAMP:Apache篇》,但只支持 CentOS 6.XApache 2.4

3. 支持 CentOS 6.X & 7.XApache 2.4HTTP/2

4. 以后 OpenSSL 出漏洞要自己编译更新(Flag 已立)

5. 不涉及 HTTPS 配置,配置参阅《Apache开启HTTPS支持并绑定(泛域名)CA证书》一文

 

一、用 root 用户连接上主机

 

二、禁用 SELinux

sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
#在 /etc/selinux/config 文件里把 SELINUX=enforcing 替换为 SELINUX=disabled,重启生效
setenforce 0
#临时把 SElinux 关闭,不需要重启

可以使用 getenforce 命令查看 SELinux 是否已经被禁用,显示 Disabled 表示已经被禁用,显示 Enforcing 表示已启用,显示 Permissive 表示被临时禁用。

虽然想用 SELinux,但是配置有点麻烦,于是就还是依旧禁用了。

 

三、安装前准备

先安装必须的库,使用 yum 包管理器安装。

rpm -e --nodeps httpd
rpm -e --nodeps mysql
rpm -e --nodeps php
#用 rpm 卸载以上3个包,-e 表示卸载,--nodeps 表示忽略检查依赖性
yum -y remove httpd
yum -y remove mysql
yum -y remove php
#用 yum 卸载以上3个包,-y 表示默认通过询问
yum -y update
#更新所有使用 yum 安装的包
 
yum -y install \
wget kernel-devel autoconf automake \
bzip2 bzip2-devel curl curl-devel cmake cpp freetype freetype-devel \
gcc gcc-c++ gd glibc glibc-devel gettext gettext-devel gmp gmp-devel \
lynx make unzip vim vim-minimal zip
#安装必须的环境

 

四、安装 PCRE

有一点必须强调,必须使用 PCRE 1,使用 PCRE 2 会导致 Apache make 时报错。

PCRE 1 下载地址:FTP

cd /usr/local/src
wget https://ftp.pcre.org/pub/pcre/pcre-8.40.tar.gz
tar -zxf pcre-8.40.tar.gz
cd pcre-8.40
./configure --prefix=/usr/local/pcre
make && make install

 

五、安装 OpenSSL

在使用 HTTP/2 前,需要了解两个概念:

ALPN(Application Layer Protocol Negotiation 应用层协议协商),在 OpenSSL 1.0.2 中开始得到支持;

NPN(Next Protocol Negotiation 下一代协议协商),在 Chrome 51 中被彻底移除。

更多姿势请参阅这里

 

无论是 CentOS 6.X 还是 CentOS 7.X,都是使用的 OpenSSL 1.0.1e, 不满足 HTTP/2 的最低版本要求。而直接升级系统 OpenSSL 版本,可能会引起更多问题,所以我们将 OpenSSL 单独编译安装,仅供 Apache 使用。

记得定时更新编译安装的 OpenSSL!!!

 

OpenSSL 下载地址:官网

cd /usr/local/src
wget https://www.openssl.org/source/openssl-1.0.2k.tar.gz
tar -zxf openssl-1.0.2k.tar.gz
cd openssl-1.0.2k
./config --openssldir=/usr/local/openssl zlib-dynamic shared
make && make test && make install
# 在 make test 全部测试通过后再执行 make install
# 如果出现问题,务必先解决所有出现的问题

之后需要将 OpenSSL 的 lib 添加到动态连接库中,防止 Apache 的 mod_ssl.somod_http2.so 模块找不到对应的 openssl.so

cat > /etc/ld.so.conf.d/openssl.conf << EOF
/usr/local/openssl/lib
EOF
ldconfig

 

六、安装 nghttp2

Apache 的 mod_http2.so 模块需要 nghttp2 的支持,而 nghttp2 是 HTTP/2 的 C 运行库。所以接下来我们要编译安装 nghttp2

 

nghttp2 下载地址:Github

cd /usr/local/src
wget https://github.com/nghttp2/nghttp2/releases/download/v1.22.0/nghttp2-1.22.0.tar.gz
tar -zxf nghttp2-1.22.0.tar.gz
cd nghttp2-1.22.0
./configure --prefix=/usr/local/nghttp2
make && make install

 

七、安装 Apache

Apache 2.4 需要两个依赖包:aprapr-util

这里我们将 Apache 安装在 /usr/local/apache,使用动态加载模块。

 

aprapr-util 下载地址:官网

Apache 下载地址:官网

cd /usr/local/src
wget http://mirrors.hust.edu.cn/apache/apr/apr-1.5.2.tar.gz
wget http://mirrors.hust.edu.cn/apache/apr/apr-util-1.5.4.tar.gz
wget http://mirrors.hust.edu.cn/apache/httpd/httpd-2.4.25.tar.gz
tar -zxf apr-1.5.2.tar.gz
tar -zxf apr-util-1.5.4.tar.gz
tar -zxf httpd-2.4.25.tar.gz
mv apr-1.5.2 httpd-2.4.25/srclib/apr
mv apr-util-1.5.4 httpd-2.4.25/srclib/apr-util
cd httpd-2.4.25
./configure \
--prefix=/usr/local/apache \
--with-pcre=/usr/local/pcre \
--with-mpm=prefork \
--with-included-apr \
--with-ssl=/usr/local/openssl \
--with-nghttp2=/usr/local/nghttp2 \
--enable-modules=all \
--enable-mods-shared=all \
--enable-so \
--enable-ssl \
--enable-http2
make && make install

 

八、设置 Apache

经过第五步已经把 Apache 安装完成了,接下来要把 Apache 的文件复制到 /etc/init.d/ 中注册成服务、设置开机自启动、编辑 Apache 的配置文件、设置 Apache 目录等。

本文中网站的默认目录是 /data/www/default/

cp -f /usr/local/apache/bin/apachectl /etc/init.d/httpd
# 拷贝文件到 init.d 里
sed -i '2a # chkconfig: - 85 15' /etc/init.d/httpd
sed -i '3a # description: Apache is a World Wide Web server. It is used to server' /etc/init.d/httpd
# 想要将 Apache 作为服务启动必须要这两句,不要问为什么,它就是这样的
chkconfig --add httpd
# 将 httpd 设置为服务
chkconfig httpd on
# 将 httpd 的 2、3、4、5 运行级设置为 On,即开机启动

rm -rf /etc/httpd
ln -s /usr/local/apache/ /etc/httpd
# /etc/httpd 为运行目录
cd /usr/sbin/
ln -fs /usr/local/apache/bin/httpd
ln -fs /usr/local/apache/bin/apachectl
# 将这两个文件链接过来,以适应 init.d 脚本
cd /var/log
rm -rf httpd/
ln -s /usr/local/apache/logs httpd
# 将日志链接到 log 目录

groupadd apache
useradd -g apache -s /sbin/nologin apache
# 添加 apache 组和 apache 用户

mkdir -p /data/www/default/
chmod -R 755 /data/www/default/
# 创建 apache 的默认目录,并设置权限

 

接下来就是配置 Apache 的配置文件 httpd.conf 了。

注:以下配置 shell 亲测有效,全复制下来黏贴就行,请不要多次运行

# 先配置 /usr/local/apache/conf/httpd.conf 文件
cp -f /usr/local/apache/conf/httpd.conf /usr/local/apache/conf/httpd.conf.bak
sed -i 's@^#LoadModule\(.*\)mod_socache_shmcb.so@LoadModule\1mod_socache_shmcb.so@' /usr/local/apache/conf/httpd.conf
sed -i 's@^#LoadModule\(.*\)mod_deflate.so@LoadModule\1mod_deflate.so@' /usr/local/apache/conf/httpd.conf
sed -i 's@^#LoadModule\(.*\)mod_deflate.so@LoadModule\1mod_deflate.so@' /usr/local/apache/conf/httpd.conf
sed -i 's@^#LoadModule\(.*\)mod_expires.so@LoadModule\1mod_expires.so@' /usr/local/apache/conf/httpd.conf
sed -i 's@^#LoadModule\(.*\)mod_ssl.so@LoadModule\1mod_ssl.so@' /usr/local/apache/conf/httpd.conf
sed -i 's@^#LoadModule\(.*\)mod_ssl.so@LoadModule\1mod_http2.so@' /usr/local/apache/conf/httpd.conf
sed -i 's@^#LoadModule\(.*\)mod_rewrite.so@LoadModule\1mod_rewrite.so@' /usr/local/apache/conf/httpd.conf
sed -i 's@^User daemon@User apache@' /usr/local/apache/conf/httpd.conf
sed -i 's@^Group daemon@Group apache@' /usr/local/apache/conf/httpd.conf
sed -i 's/^ServerAdmin you@example.com/ServerAdmin administrator@ttionya.com/' /usr/local/apache/conf/httpd.conf
sed -i 's@^#ServerName www.example.com:80@ServerName localhost@' /usr/local/apache/conf/httpd.conf
sed -i '/^<Directory \/>/a\
    Options FollowSymLinks\
    AllowOverride None\
delttionya' /usr/local/apache/conf/httpd.conf
sed -i '/delttionya/,+2d' /usr/local/apache/conf/httpd.conf
sed -i "s@^DocumentRoot.*@DocumentRoot \"/data/www/default\"@" /usr/local/apache/conf/httpd.conf
sed -i "s@^<Directory \"/usr/local/apache/htdocs\">@<Directory \"/data/www/default\">@" /usr/local/apache/conf/httpd.conf
sed -i 's@Options Indexes FollowSymLinks@Options +Includes -Indexes@' /usr/local/apache/conf/httpd.conf
sed -i 's@DirectoryIndex index.html@DirectoryIndex index.php index.html@' /usr/local/apache/conf/httpd.conf
sed -i 's@^ErrorLog \"logs/error_log\"@ErrorLog \"| /usr/local/apache/bin/rotatelogs /usr/local/apache/logs/error_log_%Y%m%d.log 86400\"@' /usr/local/apache/conf/httpd.conf
sed -i 's@CustomLog \"logs/access_log\" common@#CustomLog \"logs/access_log\" common@' /usr/local/apache/conf/httpd.conf
sed -i 's@#CustomLog \"logs/access_log\" combined@CustomLog \"| /usr/local/apache/bin/rotatelogs /usr/local/apache/logs/access_log_%Y%m%d.log 86400\" combined@' /usr/local/apache/conf/httpd.conf
sed -i "s@AddType\(.*\)Z@AddType\1Z\n    AddType application/x-httpd-php .php .phtml\n    AddType application/x-httpd-php-source .phps@" /usr/local/apache/conf/httpd.conf
sed -i 's@^#Include conf/extra/httpd-mpm.conf@Include conf/extra/httpd-mpm.conf@' /usr/local/apache/conf/httpd.conf
sed -i 's@^#Include conf/extra/httpd-vhosts.conf@Include conf/extra/httpd-vhosts.conf@' /usr/local/apache/conf/httpd.conf
sed -i 's@^#Include conf/extra/httpd-default.conf@Include conf/extra/httpd-default.conf@' /usr/local/apache/conf/httpd.conf
cat >> /usr/local/apache/conf/httpd.conf << EOF
ServerTokens ProductOnly
ServerSignature Off
EOF

# 接下来配置 /usr/local/apache/conf/extra/httpd-vhosts.conf 文件
rm -f /usr/local/apache/conf/extra/httpd-vhosts.conf
cat > /usr/local/apache/conf/extra/httpd-vhosts.conf << EOF
<VirtualHost *:80>
    DocumentRoot "/data/www/default/"
    ServerName localhost
    DirectoryIndex index.php index.html
    <Directory "/data/www/default/">
        Options +Includes -Indexes
        Require all granted
        AllowOverride All
    </Directory>
</VirtualHost>
EOF

# 再配置 /usr/local/apache/conf/extra/httpd-default.conf 文件
sed -i 's@Timeout 60@Timeout 120@' /usr/local/apache/conf/extra/httpd-default.conf
sed -i 's@MaxKeepAliveRequests 100@MaxKeepAliveRequests 1024@' /usr/local/apache/conf/extra/httpd-default.conf

 

九、配置防火墙

CentOS 6.X 默认使用 iptables 防火墙,而 CentOS 7.X 默认使用 firewall 防火墙。所以根据使用的防火墙软件,执行不同的命令。

 

iptables:

iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
/sbin/service iptables save
/etc/init.d/iptables restart

firewall:

firewall-cmd --add-service=http
firewall-cmd --permanent --add-service=http
firewall-cmd --add-service=https
firewall-cmd --permanent --add-service=https

 

十、配置 HTTPS

详见《Apache开启HTTPS支持并绑定(泛域名)CA证书》

 

十一、启动 Apache

/etc/init.d/httpd start


原创文章,转载请以链接形式注明出处:https://blog.ttionya.com/article-1806.html