如何在 Ubuntu 上安装支持 HTTP/2 的 Nginx(完整指南)
Nginx 是世界上部署最广泛的网络服务器之一,以其卓越的性能、低内存占用和处理数千个并发连接的能力而闻名。与 HTTP/2 结合使用时,Nginx 成为一个更加强大的平台——支持多路复用请求、报头压缩、服务器推送,并显著减少页面加载时间。
本综合指南将逐步引导您在 Ubuntu 20.04 和 Ubuntu 22.04 LTS 上安装具有完整 HTTP/2 支持的 Nginx,从初始设置到 SSL 配置、服务器块优化和实时验证。
> 本指南适合谁? 系统管理员、开发人员和网站所有者,他们希望在 Linux 服务器上最大化网络性能。如果您在 VPS 托管计划或 专用服务器上运行您的网站,本教程直接适用于您的环境。
目录
- 什么是 HTTP/2 及其重要性?
- 前置条件
- 步骤 1 — 更新系统软件包索引
- 步骤 2 — 安装 Nginx
- 步骤 3 — 安装 OpenSSL
- 步骤 4 — 使用 Let’s Encrypt 获取免费 SSL 证书
- 步骤 5 — 配置 Nginx 以支持 HTTP/2
- 步骤 6 — 优化您的 Nginx HTTP/2 配置
- 步骤 7 — 测试 Nginx 配置
- 步骤 8 — 重启 Nginx 并应用更改
- 步骤 9 — 验证 HTTP/2 是否活跃
- 故障排除常见问题
- 结论
什么是 HTTP/2 及其重要性?
HTTP/2 是超文本传输协议的第二个主要版本,在 RFC 7540 中标准化。它旨在解决自 1997 年以来一直在使用的 HTTP/1.1 的性能限制。
HTTP/2 相比 HTTP/1.1 的主要优势:
| 功能 | HTTP/1.1 | HTTP/2 |
|---|---|---|
| 多路复用 | 每个连接一个请求 | 多个同时请求 |
| 报头压缩 | 纯文本报头 | HPACK 压缩 |
| 服务器推送 | 不支持 | 支持 |
| 二进制协议 | 基于文本 | 二进制分帧 |
| 连接重用 | 有限 | 完全持久 |
| 延迟 | 更高 | 显著降低 |
对于网站所有者来说,启用 HTTP/2 直接转化为 更快的页面加载、更好的 Core Web Vitals 分数和改进的 SEO 排名——因为 Google 将页面速度作为排名信号。
> 重要提示: HTTP/2 需要 HTTPS(TLS/SSL)。您不能在任何现代浏览器上通过未加密的连接运行 HTTP/2。这就是为什么获取 SSL 证书是本指南中的强制步骤。如果您需要为您的域获取受信任的证书,AlexHost 为所有用例提供 SSL 证书。
前置条件
在开始之前,请确保您已准备好以下内容:
- 运行 Ubuntu 20.04 LTS 或 Ubuntu 22.04 LTS 的服务器(两者的步骤几乎相同)
- 具有 sudo 权限的非 root 用户或直接 root 访问权限
- 已注册的域名通过 A 记录指向您的服务器 IP 地址
- 端口 80 和 443 在防火墙中开放(UFW 或 iptables)
- 对 Linux 命令行的基本熟悉
如果您还没有域名,可以直接通过 AlexHost 域名注册注册一个,并在几分钟内将其指向您的服务器。
步骤 1 — 更新系统软件包索引
始终从刷新您的软件包索引开始,以确保您安装的是所有软件的最新可用版本:
sudo apt update && sudo apt upgrade -y此命令更新本地软件包列表并升级系统上已安装的任何过时软件包。
步骤 2 — 安装 Nginx
安装 Nginx 软件包
Ubuntu 的默认存储库包含 Nginx 的稳定版本。使用以下命令安装它:
sudo apt install nginx -y启动 Nginx 服务
安装后,立即启动 Nginx 服务:
sudo systemctl start nginx启用 Nginx 在启动时自动启动
确保 Nginx 在每次服务器重启时自动启动:
sudo systemctl enable nginx验证 Nginx 正在运行
确认服务处于活跃状态并正在运行:
sudo systemctl status nginx您应该看到类似的输出:
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since ...允许 Nginx 通过防火墙
如果您的服务器上启用了 UFW,请允许 HTTP 和 HTTPS 流量:
sudo ufw allow 'Nginx Full'
sudo ufw statusNginx Full 打开端口 80(HTTP)和端口 443(HTTPS),两者都是此设置所需的。
步骤 3 — 安装 OpenSSL
HTTP/2 依赖于 TLS,而 TLS 又依赖于 OpenSSL。安装它以确保所有加密依赖项都可用:
sudo apt install openssl -y验证已安装的版本:
openssl version您应该看到类似 OpenSSL 3.0.x 的输出。任何高于 1.0.2 的版本都完全支持 HTTP/2 所需的密码套件。
步骤 4 — 使用 Let’s Encrypt 获取免费 SSL 证书
Let’s Encrypt 提供免费、自动可续期的 SSL/TLS 证书,受所有主要浏览器信任。Certbot 客户端使整个过程变得简单直接。
安装 Certbot 和 Nginx 插件
sudo apt install certbot python3-certbot-nginx -y请求您的 SSL 证书
将 your_domain.com 替换为您实际注册的域名:
sudo certbot --nginx -d your_domain.com -d www.your_domain.comCertbot 将:
- 通过 HTTP 质询验证域所有权
- 从 Let’s Encrypt 颁发证书
- 自动修改您的 Nginx 配置以使用证书
- 设置从 HTTP 到 HTTPS 的重定向
按照交互式提示进行操作。当被问及是否将 HTTP 流量重定向到 HTTPS 时,选择 选项 2(重定向)——这是推荐的选择。
验证自动证书续期
Let’s Encrypt 证书在 90 天后过期。Certbot 安装 cron 作业或 systemd 计时器以自动续期。使用试运行测试续期过程:
sudo certbot renew --dry-run如果没有出现错误,自动续期配置正确。
> 提示: 对于具有多个域或通配符证书的生产环境,请考虑使用 专用服务器以完全控制您的 SSL 基础设施。
步骤 5 — 配置 Nginx 以支持 HTTP/2
现在 SSL 已就位,您需要在 Nginx 服务器块配置中显式启用 HTTP/2。
打开 Nginx 配置文件
默认网站配置位于:
sudo nano /etc/nginx/sites-available/default如果您为您的域创建了自定义服务器块(推荐),请改为打开该文件:
sudo nano /etc/nginx/sites-available/your_domain.com更新服务器块以启用 HTTP/2
找到 listen 443 ssl; 指令。Certbot 会自动添加此指令。修改它以包含 http2:
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name your_domain.com www.your_domain.com;
# SSL Certificate paths (set by Certbot)
ssl_certificate /etc/letsencrypt/live/your_domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your_domain.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
root /var/www/your_domain.com/html;
index index.html index.htm index.php;
location / {
try_files $uri $uri/ =404;
}
}
# HTTP to HTTPS redirect block
server {
listen 80;
listen [::]:80;
server_name your_domain.com www.your_domain.com;
return 301 https://$host$request_uri;
}关键变化在 listen 行:在 ssl 后添加 http2 为该虚拟主机激活 HTTP/2 协议。
保存并退出
按 CTRL + X,然后 Y,然后 Enter 以保存文件并退出 nano 编辑器。
步骤 6 — 优化您的 Nginx HTTP/2 配置
仅启用 HTTP/2 是一个好的开始,但应用额外的优化可确保您从设置中获得最大性能。
推荐的 SSL 和性能设置
在您的 server 块内添加或验证以下指令:
# Modern TLS protocols only
ssl_protocols TLSv1.2 TLSv1.3;
# Strong cipher suites compatible with HTTP/2
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers off;
# SSL session caching for performance
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# HTTP Strict Transport Security (HSTS)
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
# Additional security headers
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
# Gzip compression (complements HTTP/2)
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css text/xml application/json application/javascript application/rss+xml application/atom+xml image/svg+xml;> 关于 HTTP/2 和 Gzip 的注意: HTTP/2 使用自己的 HPACK 报头压缩,但为响应体启用 Gzip 仍然为基于文本的资产提供显著的带宽节省。
步骤 7 — 测试 Nginx 配置
在重启 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如果您看到任何错误,请仔细查看输出。错误消息将包含检测到问题的文件名和行号。
步骤 8 — 重启 Nginx 并应用更改
配置测试通过后,重启 Nginx 以应用所有更改:
sudo systemctl restart nginx或者,如果您更喜欢零停机重新加载(应用配置更改而不中断活跃连接):
sudo systemctl reload nginx对于 HTTP/2 启用,特别推荐完整 重启以确保新协议设置完全初始化。
步骤 9 — 验证 HTTP/2 是否活跃
重启 Nginx 后,使用以下方法之一确认 HTTP/2 实际上正在为客户端提供服务。
方法 1:使用 curl
curl 命令行工具可以报告所使用的协议版本:
curl -I --http2 https://your_domain.com查找响应报头:
HTTP/2 200如果您看到 HTTP/2 200,HTTP/2 正在正常工作。
方法 2:使用 OpenSSL 命令
openssl s_client -connect your_domain.com:443 -alpn h2在输出中,查找:
ALPN protocol: h2h2 是 HTTP/2 的 ALPN 标识符。如果您看到这个,您的服务器在 TLS 握手期间正确地宣传 HTTP/2 支持。
方法 3:使用浏览器开发者工具
- 在 Google Chrome 或 Mozilla Firefox 中打开您的网站
- 按
F12打开开发者工具 - 导航到 Network 选项卡
- 重新加载页面(
F5或Ctrl+R) - 右键单击请求列表中的任何列标题并启用 Protocol 列
- 您应该看到
h2列为您的域请求的协议
方法 4:使用在线 HTTP/2 测试工具
访问 https://tools.keycdn.com/http2-test 并输入您的域。该工具将确认 HTTP/2 是否活跃,并提供有关您的服务器 TLS 配置的其他详细信息。
故障排除常见问题
尽管配置了 HTTP/2,但浏览器中未显示
- 原因: 浏览器缓存了较旧的 HTTP/1.1 连接。
- 解决方案: 清除浏览器缓存和 Cookie,或在隐私/无痕窗口中测试。
nginx -t 返回 SSL 证书错误
- 原因: 配置文件中的证书路径不正确。
- 解决方案: 使用
sudo ls /etc/letsencrypt/live/your_domain.com/验证确切的路径,并相应地更新ssl_certificate和ssl_certificate_key指令。
端口 443 无法访问
- 原因: 防火墙阻止 HTTPS 流量。
- 解决方案: 运行
sudo ufw allow 443/tcp并使用sudo ufw status验证。
Certbot 域验证失败
- 原因: DNS A 记录尚未传播,或端口 80 被阻止。
- 解决方案:
