nginx 通过两个独立 server 块分别监听 80(http)和 443(https+http/2),共享 root 和 location 配置,统一缓存策略、启用 sendfile 与 gzip,并将 http 301 跳转至 https,实现静态资源的多协议安全高效服务。

配置 Nginx 实现静态资源的多协议服务,核心是让同一组静态文件同时支持 HTTP 和 HTTPS 访问,并确保两者行为一致、安全可靠。它不是指“HTTP+FTP+RTMP”混合,而是指在 Web 层面对同一资源提供多种传输协议入口(主要是 HTTP/1.1、HTTP/2、HTTPS),且不依赖后端动态服务。
监听多个协议端口并启用 HTTP/2
Nginx 本身不原生支持 FTP 或 SMTP 等协议提供静态文件,但可通过标准 Web 协议实现“多协议体验”:HTTP(明文)、HTTPS(加密)、以及在 HTTPS 上启用 HTTP/2(提升并发与性能)。
- 在 同一个 server 块中不能同时监听 80 和 443,需用两个独立的 server 块,但可共享 location 配置逻辑
- HTTPS server 必须配置证书路径,推荐使用 Let’s Encrypt 的 fullchain.pem 和 privkey.pem
- HTTP/2 只能在 HTTPS 下启用,添加 http2 参数到 listen 指令即可
统一静态资源路径与缓存策略
无论走 HTTP 还是 HTTPS,用户请求的 URL 路径(如 /static/js/app.js)应映射到同一物理目录,且缓存规则保持一致,避免协议切换导致重复下载或缓存失效。
- 用 root 指令定义基础路径(如 root /var/www/html),所有 location 共享该根目录
- 对图片、字体、JS/CSS 等资源,统一用 expires 设置长期缓存(如 expires 1y)
- 搭配 add_header Cache-Control "public, immutable" 显式声明不可变性,提升浏览器复用率
自动跳转与协议感知优化
为保障安全与 SEO 一致性,建议将 HTTP 请求 301 重定向至 HTTPS,并在响应头中注入正确的协议标识,便于前端 JS 判断当前环境。
- HTTP server 块内配置:return 301 https://$server_name$request_uri
- HTTPS server 块中添加:add_header X-Forwarded-Proto "https",方便后端或前端识别
- 若需兼容旧链接或调试,可临时保留 HTTP,但生产环境不建议长期开启
启用 sendfile 与 gzip 提升多协议传输效率
不同协议下文件传输性能差异明显,Nginx 需启用底层优化指令,让 HTTP 和 HTTPS 同样高效。
- 全局 http 块中开启:sendfile on; tcp_nopush on; tcp_nodelay on
- Gzip 压缩对文本类静态资源(HTML/JS/CSS)仍有效,但注意不要压缩已压缩格式(如 JPEG、PNG)
- 推荐配置:gzip on; gzip_types text/css application/javascript text/html;











