华为云 ECS 上 Nginx 开启 HTTP/2 与安全响应头:从配置、验证到回滚的实操笔记
背景:不是流量变大了,是协议和响应头拖了后腿
这台 ECS 上本来已经跑着一个 Nginx 静态站,页面本身不大,但打开时总感觉“卡一下”:首屏要拉十几个小文件,浏览器一个个排队;用在线安全头扫描一测,又提示缺少 X-Content-Type-Options、Referrer-Policy 等响应头。这次不动业务代码,只改 Nginx 配置,目标很明确:开启 HTTP/2、补齐常用安全响应头,并且全程可回滚。
前提与备份:先做这两件事再改配置
- 确认 Nginx 已编译 HTTP/2 支持,并确认当前配置能通过语法检查:
nginx -V 2>&1 | grep -o http_v2_module
nginx -t
cp /etc/nginx/conf.d/site.conf /etc/nginx/conf.d/site.conf.bak
- 确认站点已经走 HTTPS。HTTP/2 在浏览器里几乎只在 HTTPS 下可用,没有证书先解决证书问题,不要指望纯 HTTP 也能生效。
关键配置:一个 server 块改到位
核心改动只有三处:监听端口加 http2,收紧 TLS 版本,补安全响应头。
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Cross-Origin-Opener-Policy "same-origin" always;
location / {
root /usr/share/nginx/html;
index index.html;
}
}
关于 HSTS 要单独说一句:它一旦被浏览器记住,在有效期内很难“临时关掉”。我这次先不上长有效期,等下面验证全部通过后,才单独加下面这一行,并且先用较短时间观察:
add_header Strict-Transport-Security "max-age=86400; includeSubDomains" always;
容易踩的三个坑
第一,add_header 的继承规则很反直觉:只要某个 location 里自己写了 add_header,它就会覆盖而不是继承 server 层的同类配置。我的做法是:安全头只写在 server 层,location 里不再重复写,除非确实需要差异化。
第二,不要一上来就把内容安全策略 CSP 写成强制模式。先用 Content-Security-Policy-Report-Only 跑一段时间,看浏览器控制台有没有误拦的资源,确认无误再收紧,否则页面图片、脚本可能突然加载不出来。
第三,HTTP/2 不是“开了就一定更快”。如果页面只有一个大文件,或者服务器本身 CPU 已经吃满,收益有限;它的收益主要来自多路复用、头部压缩和多文件并发,对小文件多的首屏最明显。
验证:用四条命令代替“感觉快了”
改完先检查语法再重载,不要直接重启:
nginx -t && systemctl reload nginx
curl -I --http2 https://example.com/
curl -I https://example.com/ | grep -i -E "x-content-type-options|x-frame-options|referrer-policy|strict-transport"
我当时的验证结果是:第一条命令返回 HTTP/2 200,第二组命令能看到补齐的响应头;浏览器开发者工具 Network 里,Protocol 列也从 http/1.1 变成了 h2。如果 curl 仍返回 http/1.1,先查 Nginx 版本和 listen 行有没有真的写 http2,再查前面是不是还有一层反代把协议降级了。
回滚:30 秒就能回到改动前
一旦发现页面异常,不用纠结是哪一行的问题,先整体回滚,再逐项排查:
cp /etc/nginx/conf.d/site.conf.bak /etc/nginx/conf.d/site.conf
nginx -t && systemctl reload nginx
回滚后同样用 curl -I 确认一次。能快速回滚,才敢在生产边缘做这类“看起来很小”的改动。
上线检查清单
- 备份文件已生成,
nginx -t通过后再reload,而不是直接restart。 curl --http2返回HTTP/2 200,响应头齐全。- 浏览器 Network 确认
h2,页面图片、脚本无误拦。 - HSTS 先短有效期观察,确认无误再延长。
- 回滚命令已验证可用,不依赖临场现写。
这次改动没有换服务器、没有改业务代码,收益来自协议和响应头两个层面:首屏小文件并发更好,常见的安全头扫描项也补齐了。对个人站点和小业务来说,这是一次成本低、风险可控的优化。
- 点赞
- 收藏
- 关注作者
评论(0)