很好,我又开看似不需要的新坑了。
主要是想启用 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
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.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/
。
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