nginx上激活HTTP2

2022.09.17 27 view

介绍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可期待预期的效果,仅供参考。

  1. 网站必须是HTTPS
  2. 网站的内容聚合在同一个域名
  3. 网站内容较多

接下来介绍在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协议),也只能感叹一下技术革新速度太快!