本文介绍在Ubuntu 16.04操作系统中启用HTTP/2协议并在Apache服务器上,及启用服务器推送的方法。
先决条件 HTTP/2规范允许纯文本HTTP,但实际上所有主流Web浏览器都以需要HTTPS的方式实现HTTP/2,可参考网站从HTTP升级成HTTPS完全配置教程。 从版本2.4.26开始,Apache中的HTTP/2是生产就绪的,因此,你将需要使用Apache HTTP/2模块mod_http2构建的Apache 2.4.26或更高版本,Ubuntu 16.04中的Apache软件包没有HTTP/2模块,可以使用mod_http2从ondrej的PPA安装最新版本的Apache,开发者是Certbot PPA的维护者: sudo apt install software-properties-common sudo add-apt-repository ppa:ondrej/apache2 sudo apt update sudo apt install apache2
在Apache Virtual Host上启用HTTP/2协议 满足上述两个要求后,即可启用HTTP/2模块: sudo a2enmod http2 然后编辑Apache主机文件,如果你使用Let's Encrypt启用HTTPS,则SSL主机将定义为以le-ssl.conf结尾的单独文件,请更改your-site: 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不支持prefork,可以使用事件MPM模块来支持HTTP/2,并且需要你使用FastCGI运行PHP,因为事件MPM与mod_php不兼容,按照以下步骤从prefork切换到事件MPM,请注意,在以下命令中,在Ubuntu 16.04上使用PHP7.1、php7.0: 禁用PHP7模块: sudo a2dismod php7.0 sudo a2dismod php7.1 禁用prefork MPM模块: sudo a2dismod mpm_prefork 启用事件MPM,Fast_CGI和setenvif模块: sudo a2enmod mpm_event proxy_fcgi setenvif 安装PHP-FPM: sudo apt install php7.0-fpm sudo apt install php7.1-fpm 启动PHP-FPM: sudo systemctl start php7.0-fpm sudo systemctl start php7.1-fpm 启用PHP-FPM以在启动时启动: sudo systemctl enable php7.0-fpm sudo systemctl enable php7.1-fpm 使用以下命令将PHP-FPM设置为Apache的PHP处理程序,该命令将启用/etc/apache2/conf-available/php7.x-fpm .conf文件: sudo a2enconf php7.0-fpm sudo a2enconf php7.1-fpm 重新启动Apache以使更改生效: sudo systemctl restart apache2
如何启用服务器推送 HTTP/2附带了一个名为“服务器推送”的功能,它允许Web服务器发送Web浏览器不需要的资源,但是需要加载网页,例如,如果Web浏览器请求HTML文档,则Web服务器知道客户端将需要关联的CSS文件并将其与HTML文档一起发送,从而消除了Web浏览器发送CSS请求的需要。 在这里,我以WordPress为例(参考:在Ubuntu 18.04系统下搭建WordPress全过程),WordPress站点通常需要以下资源: style.css:主样式表,位于主题目录的根目录下。 jquery.js:JQuery库。 jquery-migrate.min.js:旧的JQuery。 wp-embed.min.js:用于嵌入视频。 要将这些资源推送到客户端,请在<VirtualHost>块中添加以下指令,用你自己的WordPress主题名称替换twentyseventeen: 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重新加载,正如你在下面的屏幕截图中看到的那样,服务器推送正在我的一个网站上运行,如果看到“来自内存缓存”,则右键单击它,清除浏览器缓存并重新加载:
相关主题 |