在 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 支持
-
打开你的域名对应的 Nginx 配置文件,例如
/etc/nginx/sites-enabled/tuenhai.com
-
在
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
-
保存并关闭配置文件
步骤 2:Nginx 移除旧的和不安全的密码套件
-
禁用 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
-
打开 Nginx 的主配置文件
/etc/nginx/nginx.conf
-
在
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 这个网站起作用。我个人嫌这样做太麻烦了 -
保存并关闭配置文件
海云青飞 建议先把相关修改应用在本机的备份文件中,然后 SSH 登录 VPS:
- 用 VI 编辑器打开待修改的文件:
sudo vi file_name
- 删除原文:
ggdG
- 按
i
进入插入模式 - 右键粘贴修改后的内容。注意,末尾不能增加空白符或其他无关字符
- 按
ESC
键退出插入模式 - 保存修改:
ZZ
- 用 VI 编辑器打开待修改的文件:
步骤 3:验证 HTTP/2 是否启用
-
使用以下命令测试 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
-
重启 Nginx:
sudo systemctl restart nginx
-
验证网站是否成功启用 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
独立思考最难得,赞赏支持是美德!(微信扫描下图)