当前位置: 首页 > news >正文

nginx 代理服务时遇到的问题

一 nginx代理多个服务,且服务之间需要相互通信

多个服务运行在docker容器中,nginx同样在docker容器中

比如前端服务需要请求后端服务,用户请求服务器80或者443 ,nginx代理请求到前端服务,前端服务业务请求到后端服务

1.1 docker需要创建网络

docker network create --driver bridge --subnet 172.30.1.0/24 --gateway 172.30.1.1 my_net
# my_net 自定义网络名称
# 172.30.1.0/24 自定义网段
# geteway 定义

1.2 创建docker容器时需要指定网络到自己创建的网络,并可以分配一个ip

这里使用docker compose

创建了一个remarkbackContainer的容器,指定了端口映射,指定网络,并固定一个ip地址

version: "3"
services:remarkbackContainer:image: remarkback:v1.0container_name: remarkbackContainerrestart: alwaysports:- 9012:9012networks:my_net:ipv4_address: 172.30.1.3 #固定ip
networks:my_net:external: true

1.3 前端服务请求后端服务,通过nginx代理完成

因为前端项目如果直接请求后端服务的地址和端口,那么将后端服务直接暴露出来,使用nginx进行代理则可以隐藏后端服务

在nginx的配置文件中增加匹配

比如,前端请求直接后端接口统一用api路径,[http://demain.com/api/xxx],那么在nginx中这样配置

proxy_pass 可以直接写后端服务的容器名称,这样请确保nginx,前后端服务都在docker 同一个网络中

              location /api{proxy_pass http://remarkbackContainer:9012; # 后端服务ip接口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;#proxy_set_header access_token $http_access_token;# 添加 CORS 头信息add_header 'Access-Control-Allow-Origin' '*';add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';add_header 'Access-Control-Allow-Headers' 'Origin, X-Requested-With, Content-Type, Accept, Authorization';add_header 'Access-Control-Allow-Credentials' 'true';add_header 'Access-Control-Max-Age' '86400';}

二 nginx代理后 header信息丢失

比如使用 jwt进行验证,将token放入了一个 access_token中 ,但是登录成功后仍然需要验证权限,通过后端服务日志查看,header中并没有token信息

原因:

这是因为nginx默认会剔除掉 _ 等特殊字符的header key,需要修改nginx配置

增加 underscores_in_headers on;

http {include       mime.types;default_type  application/octet-stream;sendfile        on;underscores_in_headers on;    # 用于解决请求头中包含下划线'_'的keykeepalive_timeout  65;client_max_body_size 50m;...
}

三 使用域名、https时 前端访问出现跨域问题

1. 先确保在http协议下能正常请求

2. 再确认单独https请求后端服务是否正常

3. 如果不正常,那么是后端服务的https代理未配置好

4. 如果正常,那么可能是前端服务请求后端服务的地址不是https

情况1

        比如域名是 demain.com,用户请求 https://demain.com时访问了前端服务页面,但是点击操作时前端服务请求后端时出现跨域,如果是请求后端地址不是同一个域名,那么会出现跨域问题

        这种情况可以将请求地址改成 https://demain.com/api这种带有固定前缀的,再在nginx上进行转发到实际后端服务上【参考1.3】

情况2

        如果请求的地址也是经过nginx转发,但是仍然出现,那么就看看后端服务的https转发是否正确,

http://www.lryc.cn/news/230170.html

相关文章:

  • 利用共享台球室小程序系统提升用户体验
  • U-Mail海外邮件中继帮您解决企业邮件退信难题
  • ImageJ灰度值量化分析 实用技巧——免疫组化分析(定量分析篇)
  • 了解STM32看门狗定时器的工作原理和原则
  • 【2014年数据结构真题】
  • PostgreSQL基本操作
  • hadoop 大数据环境配置 ssh免密登录 centos配置免密登录 hadoop(四)
  • Django 的国际化与本地化详解
  • Java19新增特性
  • [文件读取]metinfo_6.0.0 任意文件读取漏洞复现
  • [量化投资-学习笔记015]Python+TDengine从零开始搭建量化分析平台-量化知识点汇总
  • VSCode 好用的插件分享
  • C++虚基类详解
  • Mac M2/M3 芯片环境配置以及常用软件安装-前端
  • Karmada更高效地实现故障转移
  • 前端AJAX入门到实战,学习前端框架前必会的(ajax+node.js+webpack+git)(四)
  • ​TechSmith Camtasia 2024破解版功能介绍及使用教程
  • 【无线网络技术】——无线传输技术基础(学习笔记)
  • 【Liunx】部署WEB服务:Apache
  • 数字媒体技术基础之:常见图片文件格式
  • 2023-2024-2 高级语言程序设计-二维数组
  • 【uniapp】确认弹出框,选择确定和取消
  • 阿里云容器镜像服务的运维总结
  • 修炼k8s+flink+hdfs+dlink(七:flinkcdc)
  • 排查问题流程
  • 【nlp】2.2 传统RNN模型
  • C/C++---------------LeetCode第49.字母异位词分组
  • spark调优案例分享
  • 阿里达摩院开源DAMO-YOLO
  • 【异常检测小集】