介绍HTTP/2和HTTP/1.1区别及在nginx上启用HTTP/2方法。
HTTP/2的特点
通过HTTP/1.1和HTTP/2之前的区别,了解一下HTTP/2。
HTTP/1.1一次只允许将一个请求发送到Web服务器。例如,网页需要加载的图片有2张,则只有在第1张图片的加载完成后,另一张图片才会开始加载。
而HTTP/2允许同时处理多个请求,使用前面的示例,如果网页有两个图像,则可以同时加载它们。这提高了通信效率并使网页加载速度更快。
从技术上讲HTTP/1.1允许同时向Web服务器发送多个请求。但是在服务器端请求只能按照请求的顺序一个一个处理。这样一来,当有多个请求时,如果前一个请求的处理速度很慢,那么第二个及后续请求的处理就会处于等待状态,结果网页的加载速度也会相对变慢。
简要回顾一下,从Web服务器获取页面数据的HTTP协议中的历史。自1991年发布以来,HTTP针对日益复杂的页面处理进行了改进。2015年发布的HTTP/2,可更高效地处理请求,预计显示速度会有所提升,是网页浏览更加流畅。
- 1991年:HTTP/0.9
- 1996年:HTTP/1.0
- 1999年:HTTP/1.1
- 2005年:HTTP/2
HTTP/2通过提高通信效率等提高了网页加载速度,然而HTTP/2也存在挑战。
比如谷歌浏览器和火狐等浏览器仅支持TLS加密的HTTPS通信时使用HTTP/2。而HTTP/2本身支持HTTP通信,但由于浏览器的限制,如果服务器端要启用HTTP/2的话,必须开启HTTPS通信。
并非所有网站都适合使用HTTP/2。例如,一个刚上线的网站因为内容很少即使启用HTTP/2,也很难期待可见的效果。网站内容分布在多个域,也无法充分利用HTTP/2处理对同一域中服务器的多个请求的能力(跨多个域发布内容的技术称为Domain Sharding),可能无法获得启用HTTP/2后的预期效果。
符合以下条件的网站启用HTTP/2可期待预期的效果,仅供参考。
- 网站必须是HTTPS
- 网站的内容聚合在同一个域名
- 网站内容较多
接下来介绍在nginx(版本为1.20.1)上启用HTTP/2的方法。
启用HTTP/2
nginx是通过模块启用HTTP/2,详细内容参照 The HTTP/2 Module in NGINX。
上面也介绍过启用HTTP/2的网站必须使用HTTPS通信,无需对外发布的网站可使用自签名证书,SYS-BLOG使用的是阿里云提供的免费证书,需要1年更新一次。
启用HTTP/2需要修改nginx的配置文件,默认配置文件为 /etc/nginx/nginx.conf。修改之前的配置文件如下,在这里需要关注的是,listen指令。
server {
listen 443 ssl;
## Your website name goes here.
server_name www.sys-blog.net sys-blog.net;
if ($host != "sys-blog.net") {
rewrite ^(.*)$ https://sys-blog.net/$request_uri permanent;
}
# Enable SSL
ssl_certificate certs/sys-blog.net.pem;
ssl_certificate_key certs/sys-blog.net.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
~ 省略 ~
在 listen 指令追加http2,即可启用HTTP/2。
server {
listen 443 ssl http2;
## Your website name goes here.
server_name www.sys-blog.net sys-blog.net;
if ($host != "sys-blog.net") {
rewrite ^(.*)$ https://sys-blog.net/$request_uri permanent;
}
# Enable SSL
ssl_certificate certs/sys-blog.net.pem;
ssl_certificate_key certs/sys-blog.net.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
~ 省略 ~
修改完配置文件之后使用 nginx -t 命令配置文件是否正确。
# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
重启nginx服务,激活配置。
# systemctl restart nginx
确认结果
Microsoft Edge或者Chrome等浏览器上访问网站无法判断使用了HTTP/1.1还是HTTP/2,使用Chrome的Developer Tool进行确认。
启动谷歌浏览器后,输入「Ctr + Shift + I」打开Developer Tool。默认情况下,Protocol列不会显示。
选择「Network」后,在Name的地方右击后勾选「Protocol」。
访问网站确认Protocl列显示为h2,表示HTTP/2已成功激活。
小结
介绍了HTTP/2特点及在nginx上启用HTTP/2的方法。
2021年发布了使用UDP协议的HTTP/3(HTTP/2为TCP协议),也只能感叹一下技术革新速度太快!