如何在Ubuntu上安装支持HTTP/2的Nginx(完整指南)
Nginx 是世界上部署最广泛的网络服务器之一,以其卓越的性能、低内存占用和处理数千个并发连接的能力而闻名。当与 HTTP/2 结合使用时,Nginx 成为一个更加强大的平台——支持多路复用请求、头部压缩、服务器推送和显著降低页面加载时间。
本综合指南将逐步指导您在 Ubuntu 20.04 和 Ubuntu 22.04 LTS 上安装具有完整 HTTP/2 支持的 Nginx,从初始设置到 SSL 配置、服务器块优化和实时验证。
> 本指南适合谁? 系统管理员、开发人员和网站所有者,他们希望在 Linux 服务器上最大化网络性能。如果您在 VPS Hosting 计划或 Dedicated Server 上运行您的网站,本教程直接适用于您的环境。
什么是 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 被阻止。
- 解决方案:使用
dig your_domain.com A验证您的域名是否解析到正确的 IP。确保端口 80 对 ACME HTTP 质询开放。
Nginx 中的 unknown directive "http2" 错误
- 原因:Nginx 版本过旧(1.9.5 之前)或编译时不支持 HTTP/2。
- 解决方案:升级 Nginx。在 Ubuntu 20.04+ 上,默认存储库版本支持 HTTP/2。您也可以添加官方 Nginx PPA:
sudo add-apt-repository ppa:nginx/stable && sudo apt update && sudo apt upgrade nginx。
结论
您已成功在 Ubuntu 上安装了具有完整 HTTP/2 支持的 Nginx。以下是所有完成工作的总结:
- ✅ 安装并启用 Nginx 作为系统服务
- ✅ 通过 Let's Encrypt 和 Certbot 获得免费的自动续期 SSL 证书
- ✅ 使用
http2指令配置 Nginx 服务器块 - ✅ 应用 TLS 加固、OCSP 装订、HSTS 和 Gzip 压缩
- ✅ 测试配置并验证 HTTP/2 处于活动状态
启用 HTTP/2 是您可以对 Web 服务器进行的最高影响、最低工作量的优化之一。结合强大的 TLS 设置和适当的缓存标头,它可以显著改善页面加载时间、Core Web Vitals 分数,最终改善您网站的搜索引擎排名。
保持堆栈最新:定期运行 sudo apt update && sudo apt upgrade 以使 Nginx、OpenSSL 和 Certbot 保持最新的安全补丁。
进一步提升服务器性能
HTTP/2 带来的性能提升在快速、可靠的基础设施上最为明显。如果您目前使用共享主机并遇到资源限制,请考虑升级到 VPS 主机计划以获得专用资源和完整的 root 访问权限。对于高流量应用,专用服务器提供无与伦比的原始性能。如果您更喜欢图形界面而不是命令行,您也可以使用 带 cPanel 的 VPS 轻松管理您的服务器环境。
无论您的基础设施需求如何,AlexHost 都提供了以最高效率运行 Nginx、HTTP/2 和整个 Web 堆栈的平台。
