# Nginx 教程


<!--more-->

## 一、基础回顾

Nginx 是⼀个⾼性能的HTTP和反向代理web服务器，核⼼特点是占有内存少，并发能⼒强

应用场景：

- http服务器

  性能非常高，支持50000个并发连接数，cpu和内存占用也非常的低，10000个没有活动的连接占用2.5M内存

- 反向代理服务器

  - 正向代理 

    在浏览器中配置代理服务器的相关信息，通过代理服务器访问⽬标⽹站，代理服务器收到⽬标⽹站的响应之后，会把响应信息返回给我们⾃⼰的浏览器客户端

  - 反向代理 

    浏览器客户端发送请求到反向代理服务器（⽐如Nginx），由反向代理服务器选择原始服务器提供服务获取结果响应，最终再返回给客户端浏览器。如nginx+tomcat搭配

- 负载均衡服务器

  负载均衡，当⼀个请求到来的时候（结合上图），Nginx反向代理服务器根据请求去找到⼀个原始服务器来处理当前请求，那么这叫做反向代理。那么，如果⽬标服务器有多台（⽐如上图中的tomcat1，tomcat2，tomcat3...），找哪⼀个⽬标服务器来处理当前请求呢，这样⼀个寻找确定的过程就叫做负载均衡。

- 动静分离

特点：

- 跨平台：Nginx可以在⼤多数类unix操作系统上编译运⾏，⽽且也有windows版本

- Nginx的上⼿⾮常容易，配置也⽐较简单

- ⾼并发，性能好

- 稳定性也特别好，宕机概率很低

安装：可查看上一篇文章

主要命令：./nginx 启动；./nginx -s stop 终止；./nginx -s reload 重加载；



## 二、Nginx核心配置文件

**conf/nginx.conf**

- 全局块

  ```nginx
  #user  nobody;
  #进程数量，通常设置为与cpu数量相等
  worker_processes  1;
  
  #error_log  logs/error.log;
  #error_log  logs/error.log  notice;
  #error_log  logs/error.log  info;
  
  #pid        logs/nginx.pid;
  ```

- events块

  events块主要影响nginx服务器与⽤户的⽹络连接，⽐如worker_connections 1024，标识每个workderprocess⽀持的最⼤连接数为1024

  ```nginx
  events {
      worker_connections  1024;
  }
  ```

- http块

  http块是配置最频繁的部分，虚拟主机的配置，监听端⼝的配置，请求转发、反向代理、负载均衡等



## 三、Nginx应用场景之反向代理

可自行搭配nginx+tomcat(多个)进行测试，此处不做演示

注意：多location的使⽤，这⾥的nginx中server/location就好⽐tomcat中的Host/Context

语法：`location [=|~|~*|^~] /uri/ { … }`

1. 正则匹配 location ~ /demo { }
2. 不区分⼤⼩写的正则匹配 location ~* /demo { }
3. 匹配路径的前缀 location ^~ /demo { }
4. 精确匹配 location = /demo { }
5. 普通路径前缀匹配 location /demo { }

**优先级**: 4 > 3 > 2 > 1 > 5



## 四、Nignx应用场景之负载均衡

**负载策略：**

- 轮询

  默认策略

  ```nginx
  upstream demoServer{
    server 111.229.248.243:8080;
    server 111.229.248.243:8082;
  }
  location /abc {
  	proxy_pass http://demoServer/;
  }
  ```

- weight

  weight代表权重，默认每⼀个负载的服务器都为1，权重越⾼那么被分配的请求越多（⽤于服务器性能不均衡的场景）

  ```nginx
  upstream demoServer{
    server 111.229.248.243:8080 weight=1;
    server 111.229.248.243:8082 weight=2;
  }
  ```

- Ip_hash

  每个请求按照ip的hash结果分配，每⼀个客户端的请求会固定分配到同⼀个⽬标服务器处理，可以解决session问题

  ```nginx
  upstream demoServer{
    ip_hash;
    server 111.229.248.243:8080 weight=1;
    server 111.229.248.243:8082 weight=2;
  }
  ```



## 五、Nginx应用场景之动静分离

动静分离就是讲动态资源和静态资源的请求处理分配到不同的服务器上，⽐较经典的组合就是Nginx+Tomcat架构（Nginx处理静态资源请求，Tomcat处理动态资源请求），那么其实之前的讲解中，Nginx反向代理⽬标服务器Tomcat，我们能看到⽬标服务器ROOT项⽬的index.jsp，这本身就是Tomcat在处理动态资源请求了。

![示意图](https://img.zhaojq.top/20260727091725323.png "示意图")

## 六、Nginx底层进程机制剖析

Nginx启动后，以daemon多进程⽅式在后台运⾏，包括⼀个Master进程和多个Worker进程，Master进程是领导，是⽼⼤，Worker进程是⼲活的⼩弟。

![示意图](https://img.zhaojq.top/20260727091725508.png "示意图")

- master进程

  主要是管理worker进程，⽐如：

  - 接收外界信号向各worker进程发送信号(./nginx -s reload)

  - 监控worker进程的运⾏状态，当worker进程异常退出后Master进程会⾃动重新启动新的worker进程等

- worker 进程

  worker进程具体处理⽹络请求。多个worker进程之间是对等的，他们同等竞争来⾃客户端的请求，各进程互相之间是独⽴的。⼀个请求，只可能在⼀个worker进程中处理，⼀个worker进程，不可能处理其它进程的请求。worker进程的个数是可以设置的，⼀般设置与机器cpu核数⼀致。

**以 ./nginx -s reload 来说明nginx信号处理这部分**

1）master进程对配置⽂件进⾏语法检查

2）尝试配置（⽐如修改了监听端⼝，那就尝试分配新的监听端⼝）

3）尝试成功则使⽤新的配置，新建worker进程

4）新建成功，给旧的worker进程发送关闭消息

5）旧的worker进程收到信号会继续服务，直到把当前进程接收到的请求处理完毕后关闭所以reload之后worker进程pid是发⽣了变化的

**worker进程处理请求部分的说明**

例如，我们监听9003端⼝，⼀个请求到来时，如果有多个worker进程，那么每个worker进程都有可能处理这个链接。

1）master进程创建之后，会建⽴好需要监听的的socket，然后从master进程再fork出多个worker进程。所以，所有worker进程的监听描述符listenfd在新连接到来时都变得可读。

2）nginx使⽤互斥锁来保证只有⼀个workder进程能够处理请求，拿到互斥锁的那个进程注册listenfd读事件，在读事件⾥调⽤accept接受该连接，然后解析、处理、返回客户端

**nginx多进程模型好处**

- 每个worker进程都是独⽴的，不需要加锁，节省开销

- 每个worker进程都是独⽴的，互不影响，⼀个异常结束，其他的照样能提供服务

- 多进程模型为reload热部署机制提供了⽀撑

