• nginx 代理服务时遇到的问题


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

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

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

    1.1 docker需要创建网络

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

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

    这里使用docker compose

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

    1. version: "3"
    2. services:
    3. remarkbackContainer:
    4. image: remarkback:v1.0
    5. container_name: remarkbackContainer
    6. restart: always
    7. ports:
    8. - 9012:9012
    9. networks:
    10. my_net:
    11. ipv4_address: 172.30.1.3 #固定ip
    12. networks:
    13. my_net:
    14. external: true

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

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

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

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

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

    1. location /api{
    2. proxy_pass http://remarkbackContainer:9012; # 后端服务ip接口
    3. proxy_set_header Host $host;
    4. proxy_set_header X-Real-IP $remote_addr;
    5. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    6. proxy_set_header X-Forwarded-Proto $scheme;
    7. #proxy_set_header access_token $http_access_token;
    8. # 添加 CORS 头信息
    9. add_header 'Access-Control-Allow-Origin' '*';
    10. add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';
    11. add_header 'Access-Control-Allow-Headers' 'Origin, X-Requested-With, Content-Type, Accept, Authorization';
    12. add_header 'Access-Control-Allow-Credentials' 'true';
    13. add_header 'Access-Control-Max-Age' '86400';
    14. }

    二 nginx代理后 header信息丢失

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

    原因:

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

    增加 underscores_in_headers on;

    1. http {
    2. include mime.types;
    3. default_type application/octet-stream;
    4. sendfile on;
    5. underscores_in_headers on; # 用于解决请求头中包含下划线'_'的key
    6. keepalive_timeout 65;
    7. client_max_body_size 50m;
    8. ...
    9. }

    三 使用域名、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转发是否正确,

  • 相关阅读:
    JavaScript 函数详解
    关键路径的分析
    【云上探索实验室】快速入门AI 编程助手 Amazon CodeWhisperer ——码上学堂领学员招募
    Centos7查看大文件(实用的)
    Sip多按键对讲分机,洁净室专用对讲终端
    2023学生近视了用什么台灯好呢?好用预防近视的护眼台灯推荐
    Python 中 Selenium 的 getAttribute() 函数
    IVIEW Table/Div 自适应高度
    双网卡多网卡时win11如何设置网卡优先级
    初等数论——素数,逆元,EXGCD有关
  • 原文地址:https://blog.csdn.net/hey_lie/article/details/134407891