在 Ubuntu VPS 上配置 Nginx 以支持 HTTP/2

作者:海云青飞

什么是 HTTP/2 协议

HTTP/2 是超文本传输协议 (HTTP) 的最新版本,它是万维网上数据通信的基础。它是对其前身 HTTP/1.1 的重大改进,并提供了多项性能增强

HTTP/2 的一个关键功能是它能够通过单个 TCP 连接多路复用多个请求。与 HTTP/1.1 不同,HTTP/1.1 需要为每个请求提供单独的连接,而 HTTP/2 允许同时发送和接收多个请求。这减少了延迟并缩短了总体页面加载时间

HTTP/2 还引入了服务器推送,该功能允许服务器在请求资源之前主动将资源发送到客户端。这可以通过减少加载网页所需的往返次数来进一步提高性能

服务器开启 HTTP/2 的好处

在 Nginx 服务器上启用 HTTP/2 可以带来以下几个好处

  • 改进的性能

    HTTP/2 的多路复用和服务器推送功能可以显著缩短页面加载时间,从而使网站更快、响应速度更快。

  • 更好的安全性

    HTTP/2 需要使用 HTTPS,HTTPS 对服务器和客户端之间传输的数据进行加密。这有助于保护敏感信息并增强整体安全性

  • SEO优势

    网站速度是搜索引擎排名的关键因素。通过启用 HTTP/2,您可以提高网站的性能,并可能提高其在搜索引擎结果中的可见度

Ubuntu VPS Nginx 开启 HTTP/2 的前提条件

  • 域名绑定 IPv6 地址,即 域名 DNS 增加 AAAA 记录
  • VPS 已经安装了 Nginx。如果没有,请参考 DigitalOcean 的教程: 如何安装 Nginx
  • 已经配置了 SSL 证书。如果没有,请参考 DigitalOcean 的教程: 如何使用 Certbot 和 Let's Encrypt 证书启用 HTTPS

步骤 1:Nginx 启用 HTTP/2 支持

  1. 打开你的域名对应的 Nginx 配置文件,例如 /etc/nginx/sites-enabled/tuenhai.com

  2. listen 指令中添加 http2 参数,以启用 HTTP/2 支持。例如:

    listen [::]:443 ssl http2;
    listen 443 ssl http2;
    

    海云青飞 提请大家注意,不要写成:

    listen [::]:443 ssl http2 ipv6only=on;
    

    否则 sudo nginx -t 时会报错:

    nginx: [emerg] duplicate listen options for [::]:443 in /etc/nginx/sites-enabled/tuenhai.com:205

  3. 保存并关闭配置文件

步骤 2:Nginx 移除旧的和不安全的密码套件

  1. 禁用 certbot options-ssl-nginx.conf

    HTTP/2 有一个旧的和不安全的密码套件的黑名单,这些密码套件应该避免使用。密码套件是描述如何加密传输数据的加密算法

    定义密码套件的方法取决于您如何配置 Nginx 的 TLS/SSL 证书

    如果您使用 Certbot 获取证书,它还会创建文件 /etc/letsencrypt/options-ssl-nginx.conf,其中包含不够安全的 HTTP/2 密码套件。但是,修改此文件将阻止 Certbot 在未来应用更新,因此我们只需告诉 Nginx 不使用此文件,并指定我们自己的密码套件列表

    打开您的域的服务器块配置文件:

    sudo vi /etc/nginx/sites-enabled/tuenhai.com
    

    找到包含 options-ssl-nginx.conf 文件的行,并通过在行的开头添加 # 字符将其注释掉:

    /etc/nginx/sites-enabled/tuenhai.com
    
    # include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    
  2. 打开 Nginx 的主配置文件 /etc/nginx/nginx.conf

  3. http 块中添加以下行,以移除旧的和不安全的密码套件:

    ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    

    海云青飞 注:你也可以改成把上述语句添加到某网站配置文件中,如加到 /etc/nginx/sites-enabled/tuenhai.com 中,这样的话此项设置只对 tuenhai.com 这个网站起作用。我个人嫌这样做太麻烦了

  4. 保存并关闭配置文件

    海云青飞 建议先把相关修改应用在本机的备份文件中,然后 SSH 登录 VPS:

    • 用 VI 编辑器打开待修改的文件:sudo vi file_name
    • 删除原文:ggdG
    • i 进入插入模式
    • 右键粘贴修改后的内容。注意,末尾不能增加空白符或其他无关字符
    • ESC 键退出插入模式
    • 保存修改:ZZ

步骤 3:验证 HTTP/2 是否启用

  1. 使用以下命令测试 Nginx 配置:

    sudo nginx -t
    

    如果配置没有错误,则会输出以下信息:

    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
    
  2. 重启 Nginx:

    sudo systemctl restart nginx
    
  3. 验证网站是否成功启用 HTTP/2

    让我们确保服务器正在运行并使用 HTTP/2

    使用 curl 命令向您的站点发出请求并查看头信息:

    curl -I -L --http2 https://tuenhai.com
    

    您将收到如下输出:

    HTTP/2 200
    server: nginx/1.18.0 (Ubuntu)
    date: Wed, 10 Nov 2021 17:53:10 GMT
    content-type: text/html
    content-length: 612
    last-modified: Tue, 09 Nov 2021 23:18:37 GMT
    etag: "618b01cd-264"
    accept-ranges: bytes
    

    海云青飞 注:我一开始测试得到的结果是:

    curl: (92) HTTP/2 stream 0 was not closed cleanly: PROTOCOL_ERROR (err 1)

    检查 /etc/nginx/sites-enabled/tuenhai.com 的设置,把 root 配置项移到 location / 里面后就正常了:

    location / {
        root /home/tuenhai.com/public
    }
    

    您还可以在 Google Chrome 中验证 HTTP/2 是否在使用。打开 Chrome 并导航到 https://tuenhai.com

    按 F12 打开 Chrome 开发者工具

    按 F5 重新加载页

    导航到网络选项卡,右键单击以 Name 开头的表头行,并从弹出菜单中选择 Protocol 选项

    您将看到一个新的 Protocol 列,其中包含 h2(代表 HTTP/2),表明 HTTP/2 正在工作

    此时,您已准备好通过 HTTP/2 协议提供内容。让我们通过启用 HSTS 来提高安全性和性能

步骤 4:启用 HTTP Strict Transport Security (HSTS)

HSTS 是一种安全机制,它强制浏览器始终使用 HTTPS 连接到你的网站。为了启用 HSTS,请在你的 Nginx 主配置文件 /etc/nginx/nginx.conf 中添加以下行:

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

这将告诉浏览器在接下来的 1 年内始终使用 HTTPS 连接到你的网站

注意:

  • 启用 HSTS 后,你将无法通过 HTTP 访问你的网站。因此,在启用 HSTS 之前,请确保你的网站已经完全迁移到 HTTPS
  • 如果你想将你的网站加入 HSTS 预加载列表,你需要提交一个预加载申请

海云青飞 测试把网站配置文件中的 http 跳转到 https 的语句注释掉,再在浏览器中输入 http://www.tuenhai.com ,浏览器确实会强制跳转到 https://www.tuenhai.com

通过完成以上步骤,你就可以在你的 Ubuntu 20.04 服务器上配置 Nginx 以支持 HTTP/2,从而提高你的网站性能和安全性

相关内容

  • https://www.digitalocean.com/community/tutorials/how-to-set-up-nginx-with-http-2-support-on-ubuntu-20-04

  • https://www.rosehosting.com/blog/how-to-speed-up-your-nginx-website/ 2024-09-03


独立思考最难得,赞赏支持是美德!(微信扫描下图)