建设厅执业注册中心网站,个人网站域名后缀,上海微信网站建设价格,长沙企业建一 nginx代理多个服务#xff0c;且服务之间需要相互通信
多个服务运行在docker容器中#xff0c;nginx同样在docker容器中
比如前端服务需要请求后端服务#xff0c;用户请求服务器80或者443 #xff0c;nginx代理请求到前端服务#xff0c;前端服务业务请求到后端服务…一 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转发是否正确