NGINX相关知识

# BUG修复 ## 未期待的右括号异常 > 这是由于配置的时候忘记写分号了, 添加即可 ## 负载均衡的BUG处理 > 1. 反向代理的目的地是本机, 如果不写本机会报错 > 2. `upstream`不能作为`server`子标签, 是同级标签, 因此声明在主配置文件 ## 配置反向代理后404问题 > 当我们配置了反向代理, 发现访问`192.168.10.131`首页无法访问, **404页面找不到** > 问题分析: 刚开始的页面是spring异常页面, 初步考虑被错误反向代理到了网关服务器 > 原因分析: 是因为default.html的server_name为localhost, ip无法匹配, 根据NGINX知识, 全都无法匹配, 默认匹配最上面那个, 这里最上面那个我猜是反向代理, 所以404 > 问题分析: 404, 但是长相不一样, 是NGINX报的 > 原因分析: default.conf配置文件中的root写成了容器卷挂载的目录(本地目录), 本质上, 需要在容器卷里面去查找对应的目录, 但是我们写的是本地路径, 所以根本找不出 # NGINX相关知识 ## 正向代理和反向代理深化理解 ![image.png](https://cos.easydoc.net/13568421/files/lkmlhwsw) - 概念 > 无论是正向代理还是反向代理, 本质上都是一样的, 都是让客户端或服务器端能够实现远程通信, 是一个非常重要的概念 - 为什么需要正向代理? > 1. 我们不能直接访问外网, 此刻需要正向代理的网关, 帮助我们转发请求, 访问外网, 因此, **可以让客户端正常连接互联网** > 2. 当我们访问外网的时候, 我们不想别人知道自己的IP以及其他隐私信息, 因此需要正向代理服务器帮我们转发请求, 外网只知道是正向代理服务器发的请求, 因此, **保护了客户端的隐私, 保障了本机的安全(做了坏事别人也不会立刻知道)** - 为什么需要反向代理 > 1. 如果微服务的地址直接暴露给客户端, 很容易被一些恶意客户端攻击, 微服务的安全性得不到保障, 可能使整个集群瘫痪, 如果有了反向代理服务器, 若检测攻击, 可以结束反向代理, 保护集群服务器 > 2. 服务器集群部署在内网环境中, 本身它们是可以相互访问的, 但是对外不暴露, 为了让外部客户端可以访问, 因此, 反向代理提供外部访问的通道 - 域名解析的流程 1. 查询本机hosts是否有对应的映射, 若有返回IP 2. 若没有, 请求DNS服务器, 进行域名解析, 是否有对应的映射, 若有返回IP 3. 若没有, 真的没有了! - 为什么反向代理到网关微服务? > 有一个很明显的问题, 即如果直接反向代理到某个具体的微服务, 当这个微服务的集群改动的时候, 需要把NGINX的`upstream`也给改了, 如果集群频繁的改动, NGINX的配置文件也频繁改动, NGINX频繁重启, 非常的不好 > 若反向代理到网关微服务, 无论其他微服务怎么改, 只要注册到`NACOS`, 都可以动态服务发现, 所以一次配置, 永不更改, 非常推荐 - 配置文件的介绍 ![image.png](https://cos.easydoc.net/13568421/files/lknbe4o6.png) ```shell [root@192 conf]# pwd /bitmail/nginx/conf [root@192 conf]# ls conf.d fastcgi_params koi-utf koi-win mime.types modules nginx.conf scgi_params uwsgi_params win-utf ``` `nginx.conf`核心配置文件 `conf.d`核心配置文件引入的文件, 目的是为了让文件更加美观和有层级 - 反向代理的原理 ![image.png](https://cos.easydoc.net/13568421/files/lknbqq4n.png) 1. 发送请求的时候, 请求头会有host, 标明哪个域名 2. NGINX监听80端口号, 当被请求到80端口号时, 会比较请求头中的host和配置文件中的location, 如果匹配则根据规则反向代理到对应的主机上 ## 配置反向代理 ```conf // bitmall.conf server { listen 80; server_name www.bitmall.com; #charset koi8-r; #access_log /var/log/nginx/log/host.access.log main; location / { proxy_pass http://bitmall; proxy_set_header Host $host; } ``` ```conf // nginx.conf upstream bitmall { server 192.168.0.102:88; } include /etc/nginx/conf.d/*.conf; ``` 相当于访问虚拟机的网关, 网关再反向代理到本机 ```yml - id: nginx-product # 必须声明在后面 uri: lb://bitmall-product predicates: - Host=**.bitmall.com ``` ### 坑 1. NGINX反向代理的时候会把请求头的信息删除掉, 因此需要在反向代理配置的时候添加上`proxy_set_header Host $host;` 2. 对应的必须写在最后面, 否则其他请求会被这个断言吞掉, 别写错断言 # 实操 ## 动静分离 ### 为什么要有动静分离? > 动静分离解决了一个请求实际上会占用大量线程的问题, 使得一个请求只会占用一个线程, 可以提高吞吐量 > 动静分离后, 静态资源统一在NGINX网关服务器获取, 不需要发请求到微服务中, 因此, 不需要用额外的线程来获取静态资源, 解决了浪费大量线程的问题! ![image.png](https://cos.easydoc.net/13568421/files/lkqo2chx.png) **约定: 静态资源的请求路径都以/`static`靠头** ## 实操 1. NGINX的html目录创建一个static目录, 将模块中的index静态资源全部转移过来 2. 修改前端页面, 修改成符合规则的请求路径 3. 修改配置文件 ```nginx location /static { root /usr/share/nginx/html; } ``` <font color="red">**这个配置写在哪个位置都无所谓, 因为通用匹配以最精确的为准**</font> # NGINX逆天大坑 ## 从A点到B点, 为什么反向代理不管用了, 为什么出现了502? > 因为当我们发生移动的时候, 我们可能接入不同的互联网, 接入的互联网一旦发生改变, 内网IP就会发生改变, 所以反向代理是失败 ## 尝试修改了, 为什么还是502 > 因为没有关闭防火墙, 所以, 反向代理失败(这里的防火墙是虚拟机的防火墙) > 也可以添加白名单来解决 ## 关闭防火墙, 为什么出现了504 > 出现了504, 说明我们可以连接上本机了, 但是无法访问, 原因是配置上游服务器, 反向代理的时候没有指明端口号