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相关知识
## 正向代理和反向代理深化理解

- 概念
> 无论是正向代理还是反向代理, 本质上都是一样的, 都是让客户端或服务器端能够实现远程通信, 是一个非常重要的概念
- 为什么需要正向代理?
> 1. 我们不能直接访问外网, 此刻需要正向代理的网关, 帮助我们转发请求, 访问外网, 因此, **可以让客户端正常连接互联网**
> 2. 当我们访问外网的时候, 我们不想别人知道自己的IP以及其他隐私信息, 因此需要正向代理服务器帮我们转发请求, 外网只知道是正向代理服务器发的请求, 因此, **保护了客户端的隐私, 保障了本机的安全(做了坏事别人也不会立刻知道)**
- 为什么需要反向代理
> 1. 如果微服务的地址直接暴露给客户端, 很容易被一些恶意客户端攻击, 微服务的安全性得不到保障, 可能使整个集群瘫痪, 如果有了反向代理服务器, 若检测攻击, 可以结束反向代理, 保护集群服务器
> 2. 服务器集群部署在内网环境中, 本身它们是可以相互访问的, 但是对外不暴露, 为了让外部客户端可以访问, 因此, 反向代理提供外部访问的通道
- 域名解析的流程
1. 查询本机hosts是否有对应的映射, 若有返回IP
2. 若没有, 请求DNS服务器, 进行域名解析, 是否有对应的映射, 若有返回IP
3. 若没有, 真的没有了!
- 为什么反向代理到网关微服务?
> 有一个很明显的问题, 即如果直接反向代理到某个具体的微服务, 当这个微服务的集群改动的时候, 需要把NGINX的`upstream`也给改了, 如果集群频繁的改动, NGINX的配置文件也频繁改动, NGINX频繁重启, 非常的不好
> 若反向代理到网关微服务, 无论其他微服务怎么改, 只要注册到`NACOS`, 都可以动态服务发现, 所以一次配置, 永不更改, 非常推荐
- 配置文件的介绍

```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`核心配置文件引入的文件, 目的是为了让文件更加美观和有层级
- 反向代理的原理

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网关服务器获取, 不需要发请求到微服务中, 因此, 不需要用额外的线程来获取静态资源, 解决了浪费大量线程的问题!

**约定: 静态资源的请求路径都以/`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, 说明我们可以连接上本机了, 但是无法访问, 原因是配置上游服务器, 反向代理的时候没有指明端口号