Ngin笔记

# Nginx笔记 

>Nginx:是一款[轻量级](https://baike.baidu.com/item/轻量级/10002835)的[Web](https://baike.baidu.com/item/Web/150564) 服务器/[反向代理](https://baike.baidu.com/item/反向代理/7793488)服务器及[电子邮件](https://baike.baidu.com/item/电子邮件/111106)(IMAP/POP3)代理服务器,在BSD-like 协议下发行,由俄罗斯人为应对Ramble而研发的

## Nginx的特点:

- 稳定性强,提供了丰富的配置实例,占用内存小,并发能力强

> Nginx的配置文件

```xml
1.docker 创建Nginx的容器运行
2.
version: "3.1"
services:
 nginx:
    restart: always
  image: daocloud.io/library/nginx:latest 
  container_name:nginx
  ports:
       - 80:80
    volumes:
       -/docker_nginx/conf.d/:/etc/nginx/conf.d
```

## 正向代理

客户端通过代理服务器访问到想要访问的网站(客户端设立:客户端了解代理服务器和目标服务器,正向代理可以突破访问权限,对目标服务器隐藏ip)

```
客户端---(直接访问 ×) -->目标服务器  ×
客户端--->代理服务器---->目标服务器  √
```

## 反向代理:

- 反向代理是配置在服务器端的
- 客户端不知道访问的是哪一台服务器
- 达到负债均衡,隐藏服务器的真正地址

```
客户端----->(反向代理服务器 解析)----->目标服务器
```

>Nginx如何实现反向代理

- 启动一个目标服务器
- 编写Nginx的配置文件:通过Nginx访问到tomcat服务器

```xml
Nginx的配置文件信息解释
server{
  listen 80:
  server_name localhost:
  localtion/{
    proxy_pass http://(目标服务器端口) //动态资源转发的目标
}
}
```

## Nginx 的路径映射location

```json
1. # = 匹配
location /{
  #精准匹配,主机名后面不能带任何字符串
}
2. 通用匹配
location /xxx{
    匹配所有以/xxx开头的路径
}
3. 正则匹配 
location ~ /xxx{
  匹配所有以/xxx开头的路径  //优先级大于第二种
}
4. 匹配开头路径
location ~/images/{
  匹配所有以/images开头的路径
}
5. 匹配结尾的路径  
location ~* \.(gif|jpg|png){
    匹配以gifjpgpng结尾的路径 
}


```

## location的优先级关系

>1. 等号类型(=)的优先级最高。一旦匹配成功,则不再查找其他匹配项。
>2. ^~类型表达式。一旦匹配成功,则不再查找其他匹配项。
>3. 正则表达式类型(~ ~*)的优先级次之。如果有多个location的正则能匹配的话,则使用正则表达式最长的那个。
>4. 常规字符串匹配类型。按前缀匹配。

## Nginx的负载均衡策略

- 1.轮循方式:平均将请求发给服务器
- 2.权重方式:根据服务器的权重值不同进行分配请求
- 3.ip_hash:基于请求发起请客户端ip不同,会将请求发到指定的服务器上



## Nginx负负载均衡配置

- 1.实现轮训方式负债均衡

  ```yml
  在Nginx配置文件中声明加入
  upstream my-server{
    server ip:端口
    server 139.4.104.39:8080;  #我自己的服务器
    server 139.4.104.39:8081;
  }
  
  server{
    listen: 80 
    server_name localhost;
    
    location / {
      proxy_pass http://my-server/;
    }
  }
  加入后重启
  第一次访问 139.4.104.39:8080  第二次访问: 139.4.104.39:8081
  但是并不是 010101进行响应 而是在这两个端口随机产生
  ```

- 2.实现权重的负债均衡

  ```xml
  在轮训的配置文件中加入weight 权重比列
  upstream my-server{
    server ip:端口
    server 139.4.104.39:8080 weight=10;  #我自己的服务器
    server 139.4.104.39:8081 weight=2;
  }
  server{
    listen: 80 
    server_name localhost;
    
    location / {
      proxy_pass http://my-server/;
    }
  }
  
  权重比值为5:1
  代表每6个请求5个访问server 139.4.104.39:8080 ,一个访问server 139.4.104.39:8081
  注意:请求少可能会没有差异,请求量大时就会很明显
  ```

- 3.ip_hash负债均衡策略

  ```
  直接加入ip_hash
  upstream my-server{
    ip_hash;
    server ip:端口
    server 139.4.104.39:8080 weight=10;  #我自己的服务器
    server 139.4.104.39:8081 weight=2;
  }
  server{
    listen: 80 
    server_name localhost;
    
    location / {
      proxy_pass http://my-server/;
    }
  }
  第一次访问的就是之后一直访问的服务器地址
  ```

## Nginx并发能力强的原因

> 多进程模型

 nginx服务启动时,会自动创建一个master进程和多个worker进程,worder进程的数量依赖与nginx的配置,一般是cpu的核数,过 多的worker进程带来cpu的资源竞争和上下文切换。master进程负责创建和管理worker进程,除此之外master进程还负责nginx配 置解析、信号管理、模块注册等工作。worker进程负责接收和处理客户端的请求,worker进程才是nginx服务的主体。

 

> 异步非阻塞

 worker进程采用异步非阻塞的方式对外提供服务。具体来说就是,workder进程在处理客户端请求时会进行IO调用,如果调用不能立即 得到响应,worker进程也不会一直等待,而是转去处理其他客户端请求。当IO调用有结果时会主动通知worker进程,worker进程得到通知便会 暂停手上的工作,来处理IO调用的返回结果。

 

> 事件驱动模型

 IO调用完成后如何主动通知worker进程,靠的就是事件驱动模型,事件驱动模型提供了一种机制,使得worker进程不用关心IO调用的状态,IO调 用完全由事件驱动模型来管理,事件准备好后就通知worker进程事件已经就绪。事件驱动模型由事件收集器、事件发送器、事件处理器构成。事件发送器每发 送一个请求,目标对象就将其放入待处理的事件列表,然后使用非阻塞IO方式调用事件处理器来对该事件进行处理。 这个过程离不开事件驱动处理库,也叫多路IO复用方法,常见的有select模型、poll模型、epoll模型。

## Nginx动静分离

>Nginx的并发能力公式
>
>worker_processes*worker_connection/4 | 2  =Nginx   最终并发能力
>
>动态需要/4  静态资源在Nginx里 /2

- Nginx动态资源代理

  ```
  location / {
    proxy_pass 路径;
  }
  ```

- 静态资源代理

  ```json
  location / {
    proxy_pass 静态资源路径;
    index 默认访问路径下的什么资源;
    autoindex on:代表静态资源的全部内容,以列表的形式展开
  }
  
  #首先要修改docker ,添加一个数据卷,映射到nginx服务器的一个目录内容如下
    volumes:
         -/docker_nginx/conf.d/:/etc/nginx/conf.d
       -/docker_nginx/img/:/etc/nginx/img  映射图片
       -/docker_nginx/html/:/etc/nginx/html 映射页面
  #保存退出
  
  ```

  ```xml
  upstream my-server{
    ip_hash;
    server ip:端口
    server 139.4.104.39:8080 weight=10;  #我自己的服务器
    server 139.4.104.39:8081 weight=2;
  }
  server{
    listen 80:
    server_name localhost:
    location /html{
      root /data;
      index index.html;
  } 
    location /img{
      root /data;
      autoindex on;
  }
  }
  ```

## Nginx集群搭建

>为避免Nginx单点故障导致整个程序崩溃
>
>准备多个Nginx服务器
>
>我们需要准备keepalived监控每个Nginx的状况
>
>准备一个haproxy,提供一个虚拟的路径,统一接受用户的请求
posted @ 2020-11-11 18:34  LastFairy  阅读(168)  评论(0编辑  收藏  举报