如何在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协议。

http2 apache ubuntu

如何启用服务器推送

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 16.04 Apache http2

而已! 我希望本教程可以帮助您在Ubuntu 20.04上的Apache中启用HTTP / 2并使用服务器推送。 与往常一样,如果您发现此帖子有用,请订阅我们的免费新闻通讯。

Sidebar