在日常项目开发,设计项目架构的过程中,常常会使用到代理的设计模式,而nginx这一重要的分布式中间件在项目应用中尤为广泛
目前nginx在传统的项目中作用较为常见的是
- 将静态资源与动态数据进行动静分离,提升页面响应速度
- 对外屏蔽真实服务端地址,避免恶意攻击
- 微服务架构模式下,进行负载均衡至各个网关
正向代理与反向代理?
情景假设:你与店主
正向代理:
通俗版: 店主把你拉入黑名单不让你买东西了,但是你非要买,于是你找了个在白名单的人交朋友,让他帮你买东西,这就是正向代理
专业版:C-S架构模式下,正向代理伪造的就是C端,客户端,通过改变不同的C端直接与S端交互
反向代理:
通俗版: 很多人来店里买各种各样的东西,店里的东西都是由工厂低价进货过来的,店主不想让你们知道工厂的位置以免被抢生意,工厂也需要一个代理商给他们带货做推广,这就是反向代理
专业版:C-S架构模式下,反向代理伪造的就是S端,服务端,客户端直接访问伪造的S端,伪造的S端与真正的S端进行交互
更通俗的理解: 正向代理:我找人办事,我是老板 。 反向代理: 我直播带货,我是打工人
负载均衡
增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的 情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负 载均衡
Windows下安装nginx
下载解压即可:
目录结构分析:
核心文件nginx.conf剖析:
整体配置
全局配置: 常用于性能配置
负载均衡配置: (负载代理到的地址。上游服务器,一般是网关)
upstream 表示反向代理的上游服务器,一般和proxy_pass搭配使用
upstream test {
server 127.0.0.1 : 8080 weight=1;
server 127.0.0.1 : 8081 weight=1;
}
server中的反向代理配置:
location /admin{ # admin的请求代理到
//
proxy_pass http://test; # 配置代理映射 (携带上http请求)
}
主从服务配置
nginx中的include属性,可以实现多个服务的动态扩展,负载均衡
nginx代理的核心即为http中的server端,过多的server配置堆积在conf文件里面将不好维护,便可以使用include形式,将多个从配置引入主配置中
nginx常用命令:
- 进入目录: start nginx 开启服务,此时会在logs文件夹中生成pid,关闭时会通过创建时的pid进行杀死进程
- 停止 nginx -s stop/quit
- 重新加载配置 nginx -s reload
- 手动删除pid文件将导致nginx服务无法停止,此时需要taskkill /f /t /im nginx.exe删除相关的所有进程
- 主从配置时,使用include导入其他路径的conf,但注意server 必须要有不然报错(很坑)
动静结合,负载均衡实战
项目架构图:
- 当我们访问gulimall.com时,nginx对代理至各个微服务集群的网关,由网关去映射服务
涉及到的子server配置
server {
listen 80;
server_name gulimall.com *.gulimall.com 124.223.7.41;
#location /static/ {
# root /usr/share/nginx/html;
#}
location /payed/ {
proxy_set_header Host order.gulimall.com;
proxy_pass http://gulimall;
}
location / {
proxy_set_header Host $host;
## 转给上层服务器进行负载进行处理
proxy_pass http://gulimall;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
主配置设置负载均衡的网关层
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
#gzip on;
## 负载均衡映射
upstream gulimall {
server 127.0.0.1:88;
}
include conf.d/*.conf;
}
网关层核心配置:(使用Host配对方式而不是url)
- id: gulimall_product_route
uri: lb://gulimall-product
predicates:
- Host=gulimall.com,item.gulimall.com
注意事项:
- nginx在转发给网关时,会丢失掉host主机地址,需要通过proxy_set_header Host 设置
转发流程:
对http://gulimall服务端 进行代理到 上层服务器网关层,再由网关进行映射到各个微服务
动静分离:
我们在请求页面静态资源时,一般是通过映射服务器下的某个目录的资源,这样响应就会十分慢且占资源,我们可以对静态资源的访问,映射到我们的nginx服务器当中
(这里我们可以将 /static/ 的请求映射到我们nginx 的根目录)
在我们的子conf文件中添加映射配置
server {
listen 80;
server_name gulimall.com *.gulimall.com 124.223.7.41;
location /static/ { // 添加的映射配置
root html;
}
location /payed/ {
proxy_set_header Host order.gulimall.com;
proxy_pass http://gulimall;
}
location / {
proxy_set_header Host $host;
## 转给上层服务器进行负载进行处理
proxy_pass http://gulimall;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
注意:
- 这里观察下面的error.log 观察到 若以root 为key 进行配置,映射的路径前缀将会以nginx的根路径进行拼接!!
至此,就完成了nginx的负载均衡和动静分离实战