如何在Ubuntu 20.04上使用Apache启用HTTP / 2协议
本教程将向您展示如何在Ubuntu 20.04上启用HTTP / 2协议以及在Apache上使用服务器推送。 您可能知道,HTTP / 2比HTTP / 1.1协议快得多,这主要是因为前者使Web浏览器可以在单个TCP连接(多路复用)上同时向Web服务器发送多个请求并接收乱序的响应。
如今,互联网用户的平均带宽已经大大高于以前,这有助于更快地加载网页。 但是,带宽达到5Mbps后,对页面加载时间几乎没有影响。 无论您使用的是5Mbps还是10Mbps,网页加载的时间几乎都是相同的。 这些天来,可以极大地影响页面加载时间的是延迟和往返次数。 这是HTTP / 2复用解决的问题之一。
先决条件
HTTP / 2规范允许使用纯文本HTTP,但是实际上,所有主流Web浏览器都以需要HTTPS的方式实现HTTP / 2。 因此,在启用HTTP / 2协议之前,您需要在网站上启用HTTPS。 您可以阅读以下详细指南以启用HTTPS
- 如何在Ubuntu上使用Let’s Encrypt在Apache上正确启用HTTPS。
从版本2.4.26开始,Apache中的HTTP / 2可以投入生产。 因此,您将需要使用的Apache 2.4.26或更高版本 mod_http2
,Apache HTTP / 2模块。 Ubuntu 20.04随附Apache 2.4.41,可以使用以下命令进行检查:
apache2 -v
样本输出:
Server version: Apache/2.4.41 (Ubuntu) Server built: 2020-04-13T17:19:17
满足以上两个要求后,请按照以下说明在Apache中启用HTTP / 2。
在Apache虚拟主机上启用HTTP / 2协议
首先,您需要启用HTTP / 2模块。
sudo a2enmod http2
然后编辑您的Apache虚拟主机文件。 如果通过“加密”启用了HTTPS,则SSL虚拟主机将创建为一个单独的文件,结尾为 le-ssl.conf
。
sudo nano /etc/apache2/sites-enabled/your-site-le-ssl.conf
在打开后放置以下指令 <VirtualHost *:443>
标签。
Protocols h2 http/1.1
保存并关闭文件。 然后重新启动Apache,以使更改生效。
sudo systemctl restart apache2
如果您使用的是mod_php
如果您使用 mod_php
与Apache一起使用,则您正在使用prefork MPM模块。 不幸 Mod_http2
不支持前叉。 您可以使用事件MPM模块来支持HTTP / 2,这需要您使用FastCGI运行PHP,因为事件MPM与 mod_php
。 请按照以下步骤从前叉切换到事件MPM。
禁用PHP7模块。
sudo a2dismod php7.4
禁用前叉MPM模块。
sudo a2dismod mpm_prefork
启用事件MPM,Fast_CGI和setenvif模块。
sudo a2enmod mpm_event proxy_fcgi setenvif
安装PHP-FPM
sudo apt install php7.4-fpm
启动PHP-FPM
sudo systemctl start php7.4-fpm
启用PHP-FPM在启动时启动。
sudo systemctl enable php7.4-fpm
使用以下命令将PHP-FPM设置为Apache的PHP处理程序,这将启用 /etc/apache2/conf-available/php7.4-fpm .conf
文件。
sudo a2enconf php7.4-fpm
重新启动Apache,以使更改生效。
sudo systemctl restart apache2
测试
您如何知道您的站点实际上正在使用HTTP2协议?
- 在Firefox或Google Chrome浏览器中,加载您的网站页面,然后按
Ctrl+Shift+I
打开 开发者工具, 点击 网络 标签。 您可以看到您的域使用的协议。 - 您也可以在Google Chrome浏览器中安装HTTP / 2和SPDY Indicator扩展。
- 在Firefox中安装HTTP / 2 Indicator扩展。
- KeyCDN的在线HTTP / 2测试工具可以告诉您您的站点是否支持HTTP / 2和ALPN。
请注意,您可能需要清除浏览器的缓存,因为缓存的对象可能被错误地标记为HTTP / 1.1协议。
如何启用服务器推送
HTTP / 2带有一个称为“服务器推送”的功能,该功能允许Web服务器发送Web浏览器不需要的资源,但该资源是加载Web页面所必需的。 例如,如果Web浏览器请求HTML文档,则Web服务器知道客户端将需要关联的CSS文件并将其与HTML文档一起发送,从而消除了Web浏览器发送CSS请求的需要,因此行程减少。
在这里,我以WordPress为例。 WordPress网站通常需要以下资源。
- style.css:主样式表,位于主题目录的根目录中。
- jquery.js:jQuery库
- jquery-migrate.min.js:旧的JQuery
- wp-embed.min.js:用于嵌入视频
要将这些资源推送给客户端,请在中添加以下指令 <VirtualHost>
块。 用您自己的WordPress主题名称替换“ 17”。
Header add Link "</wp-content/themes/twentyseventeen/style.css>;rel=preload" Header add Link "</wp-includes/js/jquery/jquery.js>;rel=preload" Header add Link "</wp-includes/js/jquery/jquery-migrate.min.js>;rel=preload" Header add Link "</wp-includes/js/wp-embed.min.js>;rel=preload"
保存并关闭文件。 然后重新启动Apache,以使更改生效。
sudo systemctl restart apache2
请注意,您需要在以下代码中添加以下代码 functions.php
文件以从WordPress CSS和JavaScript文件中删除版本号。 WordPress更新时,如果将版本号添加到这些文件中,则服务器推送将不起作用。
// Remove WP Version From Styles add_filter( 'style_loader_src', 'sdt_remove_ver_css_js', 9999 ); // Remove WP Version From Scripts add_filter( 'script_loader_src', 'sdt_remove_ver_css_js', 9999 ); // Function to remove version numbers function sdt_remove_ver_css_js( $src ) { if ( strpos( $src, 'ver=" ) ) $src = remove_query_arg( "ver', $src ); return $src; }
测试服务器推送
在Google Chrome浏览器中,加载页面,然后按 Ctrl+Shift+I
打开开发人员工具,然后单击“网络”选项卡。 按F5重新加载。 从下面的屏幕快照中可以看到,服务器推送正在我的一个网站上进行。 如果看到“来自内存缓存”,请右键单击它,清除浏览器缓存并重新加载。
而已! 我希望本教程可以帮助您在Ubuntu 20.04上的Apache中启用HTTP / 2并使用服务器推送。 与往常一样,如果您发现此帖子有用,请订阅我们的免费新闻通讯。