Nginx配置负载均衡到网关
1.需求图示
前置准备工作 https://blog.csdn.net/qq_44981526/article/details/128599898
2.配置实现
1.在C:\Windows\System32\drivers\etc目录下修改hosts文件
shell
#配置llpliving.com nginx虚拟机
192.168.56.100 www.llpliving.com
2.配置nginx负载均衡,这里网关服务只有一个因此只配置了一个,如果由多个可以添加多个,默认轮询方式
shell
#修改配置文件,配置负载均衡
vi /mydata/nginx/conf/nginx.conf
#1.配置要进行负载均衡的服务器ip和端口 llpliving由可以根据实际情况命名
#2.注意upstream上游服务器配置在http全局块中
upstream llpliving{
server 192.168.79.1:5050;
#...
}
3.配置反向代理
shell
# 1.拷贝default.conf 到 llpliving.conf文件
cp default.conf llpliving.conf
# 2.修改 llpliving.conf配置文件
vi llpliving.conf
或者
vi /mydata/nginx/conf/conf.d/llpliving.conf
#重启 nginx
sudo docker restart nginx
在前面配置了本机hosts解析www.llpliving.com
对应的ip 192.168.56.100
(虚拟机nginx的ip)
当浏览器访问http://www.llpliving.com/
时,请求到nginx,nginx通过反向代理转发给192.168.1.79:5050网关服务,网关服务在根据路由访问对应的服务。
这里为什么会失败?
1.浏览器携带hosts信息对nginx服务发起请求,nginx进行请求转发时会丢失hosts信息,需要配置nginx让其携带hosts信息
2.浏览器以域名的方式访问nginx,nginx进行转发给网关,网关需匹配域名方式访问,让其匹配到对应的服务
4.配置网关
yaml
server:
port: 5050
spring:
application:
name: llpliving-gateway
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
gateway:
routes:
#比如请求地址为 http://localhost:5050/api/service/** 则对请求路径进行重写,去掉api --> http://localhost:7070/**
#http://localhost:5050/api/service/oss/policy 去掉/api/service--> http://localhost:7070/oss/policy
- id: llpliving-serviceutil_route
uri: lb://llpliving-serviceutil
predicates:
- Path=/api/service/**
filters:
- RewritePath=/api/(?<segment>.*),/$\{segment}
#比如请求地址为 http://localhost:5050/api/commodity/** 则对请求路径进行重写,去掉api --> http://localhost:5050/**
#因为/api/commodity/**是一个更加精确的路径,必须将这组路由放到/api/**路由前面,否则会报错
- id: llpliving-commodity_route
uri: lb://llpliving-commodity
predicates:
- Path=/api/commodity/**
filters:
- RewritePath=/api/(?<segment>.*),/$\{segment}
#配置人人fast路由, lb 是协议名如果renren-fast服务有多个支持负载均衡
# 下面的配置表示前端请求gateway服务 localhost:5050/api开头则将请求转发到renren-fast服务对应的 /renren-fast/**
- id: llpliving_renren-fast_route
uri: lb://renren-fast
predicates:
- Path=/api/**
# 路径重写, 将表示 api 拿到,才能找到真正的请求地址,segment表示路径后的参数名字可自定义,但需前后保持一致
filters:
- RewritePath=/api/(?<segment>.*),/renren-fast/$\{segment}
# for nginx 增加一组路由
- id: llpliving_host_route
uri: lb://llpliving-commodity
predicates:
- Host=**.llpliving.com
5.重启网关, 再访问,会依然错误, 因为 nginx 在转发请求到网关会丢掉一些信息,比如host,因此需要重新配置
6.再次修改 vi /mydata/nginx/conf/conf.d/llpliving.conf
proxt_set_header Host $host
让nginx进行请求转发时携带host信息
7.重启nginx
shell
sudo docker restart nginx
3.访问测试
4.注意事项和细节
1、!!网关配置不要把 Host 路由配置到前面, 否则按照域名+api 方式的路由就不会成功了, 因为会优先匹配到 Host
2、将路由配置放在其它路由配置后面, 再测试就 OK 了
yaml
# for nginx 增加一组路由
- id: llpliving_host_route
uri: lb://llpliving-commodity
predicates:
- Host=**.llpliving.com