![使用带有 OpenSSL 1.0.1 的 Apache 在 Amazon Linux 上支持 Http2](https://linux22.com/image/687693/%E4%BD%BF%E7%94%A8%E5%B8%A6%E6%9C%89%20OpenSSL%201.0.1%20%E7%9A%84%20Apache%20%E5%9C%A8%20Amazon%20Linux%20%E4%B8%8A%E6%94%AF%E6%8C%81%20Http2.png)
我正在尝试通过 Apache 在 Amazon Linux 上运行 http2 Web 服务器。据我所知,使用 Http2 需要 OpenSSL 1.0.2。但是,我当前的发行版仅支持 OpenSSL 1.0.1。我检查了 RedHat,也是一样。
是否有捷径可寻?
答案1
首先,您需要了解,与最新版本相比,打包发行版提供了稳定性和安全性。这种权衡在大多数情况下效果很好,但却让您无法使用 HTTP/2 等最新功能。
至关重要的是,它通常不会让你落后于安全补丁,因为这些通常会移植到以前的版本只需运行更新即可轻松应用(例如在 Red Hat 上运行“sudo yum update”)。因此,我将在此答案中多次提及安全性,而不仅仅是简单地回答您的问题,以便您了解此处的顾虑。
接下来你还需要意识到 HTTP/2 仍然相当新 -规格直到 2015 年 5 月才最终确定,而 Apache(和 Nginx)的实现直到 2015 年底才开始出现,并且在官方文档中仍然标记为实验性的。例如,mod_http2 已经进行了大量更改和错误修复,尽管最近速度有所放缓,现在看起来相当稳定。因此,关键在于您不仅需要最新版本的 openssl,还应该安装最新版本的 Apache,以确保获得最新的稳定和安全版本(特别是版本 2.4.18 - 2.4.20使用客户端证书时 mod_http2 中存在安全问题例如)。
因此,回到发行版问题,如果您想要软件包的最新功能(并且 HTTP/2 相对较新,因此算在该标题下),那么您有几个选择:
- 从源代码构建。
- 查找另一个为您的操作系统打包更高版本软件的 rpm 或存储库。
- 在你的网络服务器前面放置一些支持 HTTP/2 的东西。
前两个意味着超出官方支持的打包版本,并会带来安全问题。您需要随时关注这些版本中的任何错误或问题,并在您认为必要时再次进行相同的手动升级,因为您会失去发行版支持的补丁(这些补丁更容易应用)的安全网。
从源代码构建是以前安装软件包的方式,而且并不像有些人想象的那么难。我有一篇博客文章介绍如何从源代码构建 openssl、nghttp2 和 Apache httpd,以精确允许 HTTP/2,它应该可以在大多数 Linux 系统上运行(虽然我还没有在 Amazon Linux 上试过),但确切的配置选项将取决于您如何运行 Apache。好消息是,您可以在单独的位置安装 openssl 仅供 Apache 使用,并继续在系统的其余部分使用较旧的、发行版支持的版本。但请记住,面向公众的 Web 服务器显然是一个关键的潜在漏洞,您理想情况下希望在其中运行打包版本!从源代码安装通常还需要 root 访问权限,因此可能会让恶意代码进入您的系统,所以您真的应该只从官方网站和镜像下载源代码。大多数源代码安装允许您在安装之前验证下载,这是推荐的。请参阅 Apache 关于验证下载的说明例如。
使用其他非官方软件包(例如来自http://rpmfind.net) 或者存储库理论上应该比从源代码构建更简单,但将安全方面转移到信任那些组装软件包或管理存储库的人。这不仅会影响你相信他们没有修改代码,还会让你相信他们会继续更新和维护未来更新的版本。老实说,出于这些原因,我并不是很喜欢,如果我需要更新的软件包,我更喜欢从源代码安装,但也许这只是我的想法。
最后一个选项是在你的网络服务器前面放一些东西做支持 http/2。这可以是软件或硬件,例如另一个 Web 服务器、负载均衡器或 CDN。例如,Cloudflare 是一个具有出色的 HTTP/2 支持甚至还有免费计划(请注意,我没有用过,但看到其他人推荐它)。缺点是需要更多的基础设施,而且您可能也不想失去在服务器上自己管理这些基础设施的控制权。
有点冗长但希望有帮助!
答案2
你可以从源代码编译 nginx和将其用作反向代理因此它将监听端口 443 并提供完全支持 http2 的 apache 生成的内容...
这个简单的命令将为您完成所有工作:
yum -y groupinstall "Development Tools"
yum -y install make yum install gcc gcc-c++ kernel-devel zlib-devel pcre2-devel git
mkdir nginx
cd nginx/
git clone https://github.com/FRiCKLE/ngx_cache_purge.git
git clone https://github.com/maneulyori/nginx-http-auth-digest.git
wget https://github.com/pagespeed/ngx_pagespeed/archive/release-1.11.33.2-beta.zip
unzip release-1.11.33.2-beta.zip
cd ngx_pagespeed-release-1.11.33.2-beta/
wget https://dl.google.com/dl/page-speed/psol/1.11.33.2.tar.gz
tar -xzvf 1.11.33.2.tar.gz psol/
cd ..
wget http://nginx.org/download/nginx-1.11.3.tar.gz
tar -xzvf nginx-1.11.3.tar.gz
wget https://www.openssl.org/source/openssl-1.0.2h.tar.gz
tar -xzvf openssl-1.0.2h.tar.gz
cd nginx-1.11.3/
./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-mail --with-mail_ssl_module --with-file-aio --with-ipv6 --with-http_v2_module --with-cc-opt='-march=native -O2 -pipe' --with-openssl=../openssl-1.0.2h --add-module=../ngx_pagespeed-release-1.11.33.2-beta --add-module=../nginx-http-auth-digest --add-module=../ngx_cache_purge
make -j 9
make install
上述命令已在 CentOS 7 上测试过。如果您的发行版未能为您提供最新的 GCC 版本,配置可能会失败并出现错误。请将 ./configure 行(从底部开始第三行)替换为以下内容:
./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-mail --with-mail_ssl_module --with-file-aio --with-ipv6 --with-http_v2_module --with-cc-opt='-march=native -O2 -pipe' --with-openssl=../openssl-1.0.2h --add-module=../nginx-http-auth-digest --add-module=../ngx_cache_purge
它不会给你提供很好的pagespeed_module,但可以在CentOS6+下完美构建和运行。
答案3
新版本的 Amazon Linux AMI (2017.09) 已发布。作为升级的一部分,AMI Linux 现在使用 OpenSSL 1.0.2k,并且 AMI 的 httpd24 和 nginx 现在支持 HTTP/2 协议。您可以通过运行这两个命令来升级您的实例
sudo yum clean all
sudo yum update
之后,您应该重新启动实例并更改 Web 服务器的配置以通过 HTTP/2 协议运行。