Nginx 配置与反向代理常见问题总结

1. Nginx.conf 配置解析

问题:解释提供的 nginx.conf 文件的作用。

总结

  • 全局部分
    • worker_processes 1;:工作进程数量,生产环境通常设置为 CPU 核心数或 auto
    • user nobody;(注释):指定 Nginx 进程运行的系统用户
    • pid logs/nginx.pid;(注释):进程 ID 文件位置
  • events 块
    • worker_connections 1024;:每个 worker 允许的最大并发连接数
  • http 块
    • include mime.types;:加载 MIME 类型映射
    • default_type application/octet-stream;:默认 Content-Type
    • sendfile on;:启用高效静态文件传输
    • keepalive_timeout 65;:长连接超时
    • map $http_upgrade $connection_upgrade {...}:用于 WebSocket 升级连接
  • upstream 块
    • 定义后端服务池 webservers
    • 支持权重负载均衡
  • server 块(监听 80)
    • 静态站点:location /html/sky
    • 错误页:error_page 500 502 503 504 /50x.html
    • 反向代理:
      • /api/proxy_pass http://localhost:8080/admin/;
      • /user/proxy_pass http://webservers/user/;
      • /ws/ → WebSocket 配置,支持长连接和 Upgrade

2. Nginx 静态页面 + 接口代理原理

问题:访问 localhost:80 时,页面发起的请求会被代理到其他地方吗?

答案

  • 浏览器访问 http://localhost:80 → 打开静态页面
  • 页面内部请求 /api/.../user/.../ws/... → Nginx 反向代理到后端
  • 浏览器只和 Nginx 通信,不知道后端地址

3. 后端可以是远程服务器吗?

问题:被代理的后端地址可以是线上服务器吗?是否仍然不会跨域?

答案

  • proxy_pass 可以指向任何可访问的 HTTP/HTTPS 地址,包括远程服务器
  • 浏览器仍访问 http://localhost:80 → 请求发送到 Nginx
  • Nginx 再转发到线上后端 → 返回结果给浏览器
  • 因为浏览器看到的请求都是同源(localhost:80),不会产生跨域问题

注意事项

  • 确保本机 Nginx 能访问远程服务器 IP/域名和端口
  • 注意 proxy_pass 尾部 / 的路径重写规则
  • HTTPS 后端需要写 proxy_pass https://...,可配置证书验证

4. 浏览器与 Nginx 的关系

问题:浏览器是否一直访问 Nginx?接口请求也是?

答案

  • 浏览器始终访问 Nginx(本机 localhost:80)
  • 前端发起的接口请求 /api/.../user/.../ws/... 也都是发给 Nginx
  • Nginx 再代理到本地或远程后端
  • 浏览器看不到后端地址 → 跨域问题不会发生

5. 相对地址与跨域

问题:如果前端使用相对地址请求接口,会带上 Nginx 的服务地址,这样是否就不会跨域?

答案

  • 前端请求相对地址 /api/login → 浏览器自动使用当前页面的域名和端口(本机 Nginx)
  • 请求被 Nginx 转发到后端(本地或远程)
  • 浏览器看到的请求始终是同源 → 不会触发跨域限制

✅ 总结结论

  1. 浏览器始终访问 Nginx:页面和接口请求都发给 Nginx
  2. Nginx 负责代理:可代理本地或远程后端
  3. 跨域问题由 Nginx 消除:浏览器只看到同源请求
  4. proxy_pass 配置注意
    • 尾部 / 会影响路径重写
    • 远程 HTTPS 需要使用 https://
  5. WebSocket 代理:需配置 UpgradeConnection 头以及长超时
Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐