news 2026/8/24 15:04:12

Nginx 容器化部署实战:SPA 路由、Cookie 透传与 WebSocket 全配置详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Nginx 容器化部署实战:SPA 路由、Cookie 透传与 WebSocket 全配置详解

场景:容器内同时跑 Nginx 和 Go 后端。Nginx 负责:前端 Vue SPA 静态资源(7777 端口)、/api反向代理到 Go(8888)、/static静态资源代理(上传的图片/文件)并带 30 天强缓存。同时解决四个经典问题:SPA 路由 404、Cookie 丢失、WebSocket 握手失败、非 root 用户运行权限。

1. 完整配置nginx.conf

# Nginx 配置文件 # 容器以非 root 用户 (1000) 运行,不切换用户 worker_processes auto; # 自动匹配 CPU 核数 pid /run/nginx/nginx.pid; # PID 文件位置(非 root 可写) error_log /var/log/nginx/error.log warn; events { worker_connections 1024; # 单 worker 最大连接数 } http { # 非 root 用户临时目录(覆盖 Alpine 默认的 /var/lib/nginx/tmp,否则 403 权限错误) client_body_temp_path /tmp/nginx_client_body; proxy_temp_path /tmp/nginx_proxy; fastcgi_temp_path /tmp/nginx_fastcgi; uwsgi_temp_path /tmp/nginx_uwsgi; scgi_temp_path /tmp/nginx_scgi; # MIME 类型 include /etc/nginx/mime.types; default_type application/octet-stream; access_log /var/log/nginx/access.log; server { listen 7777; # 前端入口端口 server_name _; client_max_body_size 30M; # 上传文件大小限制(壁纸/图片/头像) # ───────────────────────────── # 前端静态文件 + SPA 路由 # ───────────────────────────── location / { root /usr/share/nginx/html; index index.html; # SPA 路由核心:所有未匹配的路径都返回 index.html # 由前端 vue-router 接管路由(history 模式) try_files $uri $uri/ /index.html; } # ───────────────────────────── # 后端 API 反向代理 # ───────────────────────────── location /api/ { proxy_pass http://127.0.0.1:8888; # 注意:无尾斜杠 = 保留原始 URI proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 确保 cookie 透传(解决 session/JWT 丢失问题) proxy_set_header Cookie $http_cookie; proxy_pass_header Set-Cookie; # 禁止 nginx 修改重定向(解决 307 二次请求问题) proxy_redirect off; # WebSocket 支持 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; # 代理超时(聊天/SSE 流式接口需要) proxy_connect_timeout 90; proxy_read_timeout 90; } # ───────────────────────────── # 静态文件代理(壁纸、聊天文件、头像等) # ───────────────────────────── location /static/ { proxy_pass http://127.0.0.1:8888; # Go 后端 r.Static("/static", "./static") proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 静态资源强缓存 30 天 expires 30d; add_header Cache-Control "public, immutable"; } } }

2. 逐段讲解:每个配置解决什么问题

2.1 SPA 路由 ——try_files

location / { root /usr/share/nginx/html; index index.html; try_files $uri $uri/ /index.html; }

问题:Vue Router 用 history 模式时,URL 是/blog/article/123而不是/#/blog/article/123。用户刷新页面时,Nginx 找不到对应的真实文件,返回 404。

解决try_files依次尝试:

  1. $uri— 命中真实文件(如/assets/index-xxx.js
  2. $uri/— 命中目录(自动找 index.html)
  3. /index.html— 兜底,交给前端路由处理

注意:后端要有对应的 API 接口或返回 404 页面,避免 SEO 无效页面被索引。

2.2 Cookie 透传 —— 解决登录态丢失

proxy_set_header Cookie $http_cookie; proxy_pass_header Set-Cookie;

问题:默认 Nginx 会透传 Cookie,但某些场景(跨域、代理到不同端口)会导致 Session 丢失。显式声明后:

  • Cookie:把客户端 Cookie 原样传给后端
  • Set-Cookie:后端设置的 Cookie 原样返回给客户端

2.3 307 重定向问题 ——proxy_redirect off

问题:Go 后端某些接口返回 307(如 HTTP→HTTPS 跳转),Nginx 默认会改写 Location 头,导致客户端跳转到错误地址,出现"二次请求"或死循环。

解决proxy_redirect off;让 Location 头原样透传。

2.4 WebSocket —— 协议升级

proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade";

问题:WebSocket 握手时客户端发Upgrade: websocket头,HTTP/1.0 不支持长连接,Nginx 必须用 HTTP/1.1 转发并带上 Upgrade/Connection 头,否则握手失败。

2.5 非 root 用户运行 —— 临时目录

client_body_temp_path /tmp/nginx_client_body; proxy_temp_path /tmp/nginx_proxy;

问题:容器以USER 1000:1000运行时,Nginx 默认的/var/lib/nginx/tmp没有写权限,上传文件或代理大响应时直接 403/500。

解决:把临时目录全部指到/tmp下,并在 Dockerfile 里chown给用户 1000。

2.6 上传大小限制

client_max_body_size 30M;

不设置默认只有 1M,上传壁纸/图片会报413 Request Entity Too Large

3. 验证与排查命令

# 检查配置语法nginx-t-c/etc/nginx/nginx.conf# 容器内实时日志dockerlogs-fledger-service# 手动验证各路由curl-Ihttp://localhost:7777/# 前端页面curl-Ihttp://localhost:7777/api/v1/user/info# API 代理curl-Ihttp://localhost:7777/static/wallpapers/xxx.jpg# 静态资源(看 Cache-Control)

4. 常见问题排查表

现象原因解决
刷新页面 404没配try_filestry_files $uri $uri/ /index.html;
登录后刷新掉登录态Cookie 没透传proxy_set_header Cookie+proxy_pass_header Set-Cookie
WebSocket 连不上缺 Upgrade 头proxy_http_version 1.1+ Upgrade/Connection 头
上传 413体积超限client_max_body_size 30M;
上传 403非 root 无写权限临时目录指到/tmp+ chown
图片不更新强缓存 30 天文件名带 hash 或改用no-cache
接口 502后端没启动/端口不对检查proxy_pass地址与后端监听端口

5. 与 Dockerfile 的配合

# 非 root 运行所需:创建目录并授权 RUN mkdir -p /var/log/nginx /run/nginx /var/lib/nginx/logs /tmp/nginx_client_body /tmp/nginx_proxy && \ chown -R 1000:1000 /app /usr/share/nginx/html /var/log/nginx /run/nginx /var/lib/nginx /tmp/nginx_client_body /tmp/nginx_proxy USER 1000:1000

总结

这份配置的核心价值:

  1. 一个 7777 端口搞定前后端:静态资源 + API + WebSocket + 静态文件,外部只暴露一个入口
  2. 四个经典坑全部规避:SPA 404、Cookie 丢失、WS 握手失败、非 root 权限
  3. 性能:静态资源 30 天强缓存,后端只处理动态请求
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/24 15:02:42

React + Zustand + JWT:从零实现登录鉴权与请求拦截

引言你有没有遇到过这样的场景:用户登录成功后,刷新页面就丢了登录态?或者每个请求都要手动写一遍 Authorization 头,代码又臭又长?说白了,登录鉴权的本质,就是在无状态的 HTTP 协议上&#xff…

作者头像 李华
网站建设 2026/8/24 15:01:36

3步完成QQ空间说说全量备份:GetQzonehistory历史备份完整指南

3步完成QQ空间说说全量备份:GetQzonehistory历史备份完整指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 如果你的QQ空间攒了多年说说和旧照片,别等哪天找不…

作者头像 李华
网站建设 2026/8/24 15:01:02

字节阿里腾讯校招AI岗位超多?7个真相揭示AI行业反直觉机会

2026年校招中,字节、阿里、腾讯等大厂AI岗位激增,但行业呈现反直觉趋势:开放岗位门槛极高,本科生或胜过硕士生,底层系统工程师薪资追平研究员,CV/NLP岗位被大模型整合,游戏公司AI投入激进&#…

作者头像 李华
网站建设 2026/8/24 14:57:17

Landsat数据—6s大气校正

Landsat数据认识—以及6s大气校正处理1. Landsat卫星介绍2. Landsat数据介绍2.1 数据级别介绍2.2 数据名称命名格式3. Landsat数据波段信息介绍3.1 Landsat 4-5 Thematic Mapper ( TM )3.2 Landsat 7 Enhanced Thematic Mapper Plus (ETM)3.3 Landsat 8-9 Operational Land Ima…

作者头像 李华
网站建设 2026/8/24 14:57:04

利用Anaconda和Mamba创建深度学习常用三大环境

文章目录深度学习常用研发项目及所需依赖包准备工作环境一:大模型训练/推理 Web后端环境二:视觉检测 姿态识别 标注环境三:autogluon自动化学习环境部署深度学习常用研发项目及所需依赖包 (1)autogluon自动化学习需…

作者头像 李华
网站建设 2026/8/24 14:56:23

讯飞输入法重磅发布11.0版本 懂输入更懂你

2010年, 中国互联网借助全球移动互联网的浪潮, 诞生了一批又一批所谓“新生力量”。在输入法的历史进程中, 讯飞输入法为行业开创中文语音输入, 一个里程碑就此出现。正是因为这一创新性举措, 人机交互方式得以翻开全新篇章。日前, 讯飞输入法将前沿AI技术全面进行赋能, 重磅推…

作者头像 李华