引言
Nginx是集Web服务器+反向代理+负载均衡于一体,通常作为负载均衡器暴露在外网接受用户请求,使用其反向代理的功能,将用户的请求转发到实际提供服务的内网服务器。
docker启动
docker run -p80:80 --name nginx -d nginx:1.10
将容器内的配置文件拷贝到当前目录 (注意后面有个小点)会在当前目录产生一个nginx文件夹
docker container cp nginx:/etc/nginx .
将该nginx文件中的所有配置移位置,以便映射
mv ./nginx/* /mydata/nginx/conf/
rm -rf ./nginx
终止原容器, docker stop nginx
执行命令删除容器:docker rm nginx
启动新的 nginx 执行以下命令
docker run -p 80:80 --name nginx \
-v /mydata/nginx/html:/usr/share/nginx/html \
-v /mydata/nginx/logs:/var/log/nginx \
-v /mydata/nginx/conf/:/etc/nginx \
-d nginx:1.10
docker update nginx --restart=always
这个是我构建的最终nginx目录结构
代理配置
先看下人家自带的nginx配置的部分
upstream gulimall{ #发给一组上游服务器
server 192.168.1.100:6060; #网关
}
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/conf.d/.conf;这一句表示会加载该目录下的所有.conf配置文件
原本有个default.conf,我又复制新建了个gulimall.conf,看看我整了啥
server {
listen 80;
server_name gulimall.com *.gulimall.com yfxu.ngrok2.xiaomiqiu.cn;
location /static/ {
root /usr/share/nginx/html;
}
location /payed/ {
proxy_set_header Host order.gulimall.com; #指定域名. 注:此处的$host为外网域名,不能为
proxy_pass http://gulimall; #在nginx.conf中设置的上游服务器组
}
location / {
proxy_set_header Host $host; #不让host丢失,要不网关没法根据host进行lb
proxy_pass http://gulimall; #在nginx.conf中设置的上游服务器组
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
在这里我加了个几个被监听的域名,如果这些域名的uri的请求以/static/开始,就去/usr/share/nginx/html下找静态资源。
其余都交给网关。有一点值得关注的是nginx转发请求时会丢失Host,所以得人为加上。PS:yfxu.ngrok2.xiaomiqiu.cn为外网域名
用户访问nginx ,nginx反向代理到网关,网关在转发请求给我们的微服务。在网关进行统一的鉴权认证、限流、日志收集等工作。nginx还存储静态资源(比如css、js),动态资源放在微服务里面,这就是实现了动静分离。静态资源放在nginx,所有要经过服务器处理的页面放在对应的微服务中。动静分离的好处减轻微服务的压力。
走,看下网关的路由配置去,了解下怎么分配到不同服务请求动态资源的
spring:
cloud:
gateway:
routes:
- id: coupon_route
uri: lb://gulimall-coupon # lb(load balance)代表从注册中心获取服务
predicates:
- Path=/api/coupon/**
filters:
- RewritePath=/api/(?<segment>.*),/$\{segment}
- id: ware_route
uri: lb://gulimall-ware # lb(load balance)代表从注册中心获取服务
predicates:
- Path=/api/ware/**
filters:
- RewritePath=/api/(?<segment>.*),/$\{segment}
- id: member_route
uri: lb://gulimall-member # lb(load balance)代表从注册中心获取服务
predicates:
- Path=/api/member/**
filters:
- RewritePath=/api/(?<segment>.*),/$\{segment}
- id: thirdparty_route
uri: lb://gulimall-third-party # lb(load balance)代表从注册中心获取服务
predicates:
- Path=/api/thirdparty/**
filters:
- RewritePath=/api/thirdparty/(?<segment>.*),/$\{segment}
- id: product_route
uri: lb://gulimall-product # lb(load balance)代表从注册中心获取服务
predicates:
- Path=/api/product/**
filters:
- RewritePath=/api/(?<segment>.*),/$\{segment}
- id: admin_route
uri: lb://renren-fast # lb(load balance)代表从注册中心获取服务
predicates:
- Path=/api/**
filters:
- RewritePath=/api/(?<segment>.*),/renren-fast/$\{segment}
- id: product_host_route
uri: lb://gulimall-product # lb(load balance)代表从注册中心获取服务
predicates:
- Host=gulimall.com, item.gulimall.com #根据目标服务主机host判断,所以需要放在后面
- id: search_host_route
uri: lb://gulimall-search # lb(load balance)代表从注册中心获取服务
predicates:
- Host=search.gulimall.com #根据目标服务主机host判断,所以需要放在后面
- id: auth_host_route
uri: lb://gulimall-auth # lb(load balance)代表从注册中心获取服务
predicates:
- Host=auth.gulimall.com #根据目标服务主机host判断,所以需要放在后面
- id: cart_host_route
uri: lb://gulimall-cart # lb(load balance)代表从注册中心获取服务
predicates:
- Host=cart.gulimall.com #根据目标服务主机host判断,所以需要放在后面
- id: order_host_route
uri: lb://gulimall-order # lb(load balance)代表从注册中心获取服务
predicates:
- Host=order.gulimall.com #根据目标服务主机host判断,所以需要放在后面
- id: member_host_route
uri: lb://gulimall-member # lb(load balance)代表从注册中心获取服务
predicates:
- Host=member.gulimall.com #根据目标服务主机host判断,所以需要放在后面
- id: seckill_host_route
uri: lb://gulimall-seckill # lb(load balance)代表从注册中心获取服务
predicates:
- Host=seckill.gulimall.com #根据目标服务主机host判断,所以需要放在后面
nginx直接代理给网关,网关判断:
- 如果/api/,转交给对应的服务器(本项目后台系统的前端请求是/api/)
- 如果是 满足域名,转交给对应的服务(本项目的前台系统的前端请求是直接用域名请求的)
设置本地域名
sudo vim /etc/hosts
sudo /etc/init.d/networking restart 或者 service network-manager restart