很好,我又开看似不需要的新坑了。
主要是想启用 HTTP/2
了,虽然现在还在使用 CentOS 6.X
,但是有升级到 CentOS 7.X
的打算,所以写个博客记录一下。
阅读这篇文章前,有些东西需要知道一下:
1. 这次不会像之前的文章一样写得那么详细了,点到为止
2. 依旧没有“一键安装”脚本,因为懒
3. 小白用户或者没有支持 HTTP/2
计划的小伙伴请移步《编译安装 LAMP:Apache 篇》,但只支持 CentOS 6.X
和 Apache 2.4
3. 支持 CentOS 6.X & 7.X
、Apache 2.4
、HTTP/2
4. 以后 OpenSSL
出漏洞要自己编译更新(Flag 已立)
5. 不涉及 HTTPS 配置,配置参阅《Apache 开启 HTTPS 支持并绑定(泛域名) CA 证书》一文
一、用 root 用户连接上主机
二、禁用 SELinux
# 在 /etc/selinux/config 文件里把 SELINUX=enforcing 替换为 SELINUX=disabled,重启生效
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
# 临时把 SElinux 关闭,不需要重启
setenforce 0
可以使用 getenforce
命令查看 SELinux
是否已经被禁用,显示 Disabled
表示已经被禁用,显示 Enforcing
表示已启用,显示 Permissive
表示被临时禁用。
虽然想用 SELinux
,但是配置有点麻烦,于是就还是依旧禁用了。
三、安装前准备
先安装必须的库,使用 yum
包管理器安装。
# 用 rpm 卸载以下 3 个包,-e 表示卸载,--nodeps 表示忽略检查依赖性
rpm -e --nodeps httpd
rpm -e --nodeps mysql
rpm -e --nodeps php
# 用 yum 卸载以下 3 个包,-y 表示默认通过询问
yum -y remove httpd
yum -y remove mysql
yum -y remove php
# 更新所有使用 yum 安装的包
yum -y update
# 安装必须的环境
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 下载地址:SourceForge
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 test 全部测试通过后再执行 make install
# 如果出现问题,务必先解决所有出现的问题
make && make test && make install
之后需要将 OpenSSL 的 lib
添加到动态连接库中,防止 Apache 的 mod_ssl.so
和 mod_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 需要两个依赖包:apr
和 apr-util
。
这里我们将 Apache 安装在 /usr/local/apache
,使用动态加载模块。
apr
和 apr-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/
。
# 拷贝文件到 init.d 里
cp -f /usr/local/apache/bin/apachectl /etc/init.d/httpd
# 想要将 Apache 作为服务启动必须要这两句,不要问为什么,它就是这样的
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
# 将 httpd 设置为服务
chkconfig --add httpd
# 将 httpd 的 2、3、4、5 运行级设置为 On,即开机启动
chkconfig httpd on
# /etc/httpd 为运行目录
rm -rf /etc/httpd
ln -s /usr/local/apache/ /etc/httpd
# 将这两个文件链接过来,以适应 init.d 脚本
cd /usr/sbin/
ln -fs /usr/local/apache/bin/httpd
ln -fs /usr/local/apache/bin/apachectl
# 将日志链接到 log 目录
cd /var/log
rm -rf httpd/
ln -s /usr/local/apache/logs httpd
# 添加 apache 组和 apache 用户
groupadd apache
useradd -g apache -s /sbin/nologin apache
# 创建 apache 的默认目录,并设置权限
mkdir -p /data/www/default/
chmod -R 755 /data/www/default/
接下来就是配置 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