nginx笔记粗整

1. 什么是nginx

​ Nginx(engine x)是一个高性能的HTTP和方向代理web服务器 , 特点是占用内存少 , 并发能力强 , 事实上nginx的并发能力在同类型的网页服务器中表现较好

​ Nginx专为性能优化而开发 , 性能是其重要的考量 , 实现上非常注重效率 , 能经受高负载的校验 , 能支持高达50000个并发连接数

2. Nginx的作用

  1. 静态服务器

    在前后端分离的项目中 , 前端项目开发完毕后 , 也是需要发布到一个服务器上 , 供用户访问 , 此时就需要使用到nginx

  2. 虚拟主机

    一个nginx可以模拟多个虚拟主机 , 虽然访问的链接不同 , 但是都表示一个主机 , 所以访问的内容是一致的

  3. 方向代理

    nginx可以作为反向代理服务器 , 客户端发送http请求 , 访问nginx这个反向代理服务器 , 反向代理服务器nginx会选择目标服务器 , 最终完成请求获取数据

  4. 负载均衡

    部署应用时 , 项目运行在tomcat上 , 一个tomcat的并发访问默认200 , 手动调整tomcat并发量最多600-700的并发 , 当用户量比较大的时候 , 项目要占用不同的端口部署多个 , 目的起到请求分流的效果 , 减轻服务器压力 , 此时就需要用到负载均衡

3.静态资源服务器

nginx做静态资源服务器配置的方式有很多

3.1. 静态资源放到nginx中

当访问http://localhost时 , 浏览器会出现一个页面 , 这个页面就是nginx解压目录中的html文件夹中的index.html

既然能够显示自带的index.html , 自然也可以把项目前端页面页面放到这个目录下 , 此时就能够访问

3.1.1. 部署流程

  • 将静态资源放入/nginx解压文件夹/html文件夹中
  • 使用cmd重启nginx , 命令 : nginx -s reload
  • 浏览器访问

3.1.2. 修改首页

问题描述 :

  1. nginx默认加载index.html , 为什么默认加载nginx.html
  2. 修改默认加载的页面 , 或进入的首页不叫index.html
  • 修改配置文件

    nginx的配置文件在/nginx解压文件夹/conf/nginx.conf

    相关配置如下 :

    server {
        listen   80; #监听80端口
        server_name  localhost;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        location / { # 当访问 / 时
    		root   html; # 去解压目录中找到html目录
    		index  index.html index.htm; # 默认首页是index.html
    	}
    
  • 重启测试

3.2. 静态资源放在nginx外

部署静态资源除了放在nginx解压目录中 , 还可以放到电脑任意地方 , 然后通过配置访问静态资源位置

3.2.1. 部署流程

  • 修改配置文件

    server {
        listen   80; # 监听80端口
        server_name  localhost;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        location / { # 当访问 "/" 时
    		root   静态资源所在文件夹地址 ; # 去静态资源文件夹中找
    		index  index.html index.htm; # 默认首页是index.html
    	}
    
  • 重启测试

4. nginx配置文件

nginx的配置文件是 nginx.conf 在解压目录下config目录

4.1. 配置文件组成部分

  • 第一部分 :全局块
    • 主要设置一些影响nginx服务器整体运行的配置指令
  • 第二部分 : Events块
    • worker_connections 1024; 表示每个 worker process支持的最大连接数
  • 第三部分 : http块
    • 注释Nginx服务配置最频繁的部分 , 代理 缓存 日志定义等绝大多数的功能和第三模块的配置都在这里
    • 注意 : http块也包括http全局块 , server块 , server块又包括全局server块和localtion块

4.2. 配置文件的结构

main:	# 全局配置 , 对全局生效
	events:	# 配置影响Nginx服务器或与用户的网络连接
	http:	# 配置代理 , 缓存 , 日志定义等绝大多数功能和第三模块的配置
    	upstream:	# 配置后端服务器具体地址 , 负载均衡配置不可或缺的部分
    	server:		# 配置虚拟机的相关参数 , 一个http块中可以有多个server块
    		location:	# server块可以含有多个location块 , location指令用于匹配url

5. 虚拟主机

一个服务器可以模拟多个虚拟机 , 虽然访问的链接不同 , 但是都表示同一个主机 , 所以访问的内容是一致的 , nginx的一个server标签就是一个虚拟主机 , 配置多个server标签就可以代表多个主机

5.1. 域名解析流程

  1. 浏览器访问网址
  2. 在本地host文件中查找是否有对应的域名映射
    1. 有域名映射
      1. 直接访问对应ip地址
      2. 浏览器显示对应网站
    2. 没有域名映射
      1. 找到DNS服务器
        1. 直接访问对应的ip地址
          1. 浏览器显示对应页面
        2. 找不到对应ip地址
          1. 浏览器提示找不到 , 无法访问(404)

5.2. 配置虚拟主机

  • 配置多个server

    server {
        listen   80; 
        # 设置访问的地址
        server_name  www.aaa.com;
        location / { 
    		root   静态资源所在文件夹地址 ;
    		index  index.html index.htm; 
    	}
    server {
        listen   80;
        # 设置访问的地址
        server_name  www.bbb.com;
        location / { 
    		root   静态资源所在文件夹地址 ;
    		index  index.html index.htm;
    	}
    
  • 添加域名映射

    C:\Windows\System32\drivers\etc\hosts文件
    
    # 修改host文件设置域名映射
    172.0.0.1 www.aaa.com
    172.0.0.1 www.bbb.com
    
  • 重启测试

6. 反向代理服务器

6.1. 正向代理

  • 概念 : Nginx代理客户端来访问互联网 , 典型代表 : FQ
  • 特点 : 客户端非常明确要访问服务器地址 ; 服务器只清楚请求来自哪个代理服务器 , 而不清楚来自哪个具体的客户端 ; 正向代理模式隐藏了正式客户端信息

6.2. 反向代理

  • 概念 : Ngin作为反向代理服务器接收来自客户端的请求 , 并将请求转发给后端的真是服务器集群中的一台
  • 典型代表 : 负载均衡
  • 特点 : 主要用于服务器集群分布式部署情况下 , 隐藏了服务器的真实信息

6.3. 反向代理配置

  • 新建springboot工程

  • 启动工程

  • 配置反向代理

    server {
    	# 监听端口
        listen   80;
        # 客户浏览器输入的域名
        server_name  www.aaa.com;
        location / { 
        	# 真实转发的地址
    		proxy_pass http://localhost:8080
    		index  index.html index.htm; 
    	}
    

7. 负载均衡

  • 使用场景 : 当一个应用占用不同的端口启动多次的情况下 , 每个端口的应用都包含所有的功能 , 在高并发的情况下做到分流效果 , 此时客户端的一个请求 , 就面临了一个请求多个服务器的情况 , 此时需要负载均衡算法

7.1. 配置负载均衡

  • 启动过个springboot工程

  • 配置负载均衡

    # test内为多个服务器地址
    upstream test{
        server 127.0.0.1:8080;
        server 127.0.0.1:8081;
        server 127.0.0.1:8082;
    }
    server {
        listen   80;
        server_name  www.bbb.com;
        location / { 
            # test 为设置的负载均衡地址
    		proxy_pass http://test;
    		index  index.html index.htm;
    	}
    
  • 负载均衡策略

    默认的负载均衡策略为轮循
    除了轮循还有其他的负载均衡策略
    比如 :
    	权重
    	随机
    	根据ip分配
    	等...
    

7.2. 轮询策略演示

7.2.1. 加权轮询

upstream test{
    # 被分配的权重高 , 被分配的几率高
    server 127.0.0.1:8080 weight=8;
    server 127.0.0.1:8081 weight=1;
    server 127.0.0.1:8082 weight=1;
}

7.2.2. ip_hase策略

每个请求按照ip的hash结果分配 , 同一个ip客户端访问一个固定的后端服务器

优点 : 可以保证来自同一个ip的请求 , 被打到固定的机器上 , 可以解决session问题

  • 配置

    upstream test{
        ip_hash; # 根据ip_hash策略分配
        server 127.0.0.1:8080;
        server 127.0.0.1:8081;
        server 127.0.0.1:8082;
    }
    

7.2.3. url_hash策略

按访问url的hash结果分配请求 , 相同url固定转发到同一个后端服务器进行处理

  • 配置

    upstream test{
        hash $request_url;
        server 127.0.0.1:8080;
        server 127.0.0.1:8081;
        server 127.0.0.1:8082;
    }
    

7.2.4. fair策略

按后端服务器的响应时间来分配请求 , 响应时间短的有限分配

需要安装插件

7.3. 参数了解

任何负载均衡策略都可以携带参数

  1. down : 当前服务器不参与负载
  2. weight : 权重 , 值越大 , 服务器的负载量越大
  3. max_fails : 允许请求失败的次数 , 默认值为1
  4. fail_timeout : max_fails次失败后暂停的时间
  5. backup : 备份机 , 只有其他所有的非buckup机器down或者忙时才会请求buckup机器
upstream test{
    server 127.0.0.1:8080 down; # down不参与负载均衡
    server 127.0.0.1:8081 buckup; # 备份机
    server 127.0.0.1:8082;
}

8. Linux安装nginx

第一步 :

安装需要的插件 :

yum -y install gcc-c++

yum -y install zlib zlib-devel openssl openssl-devel

yum -y install patch

第二步 :

新建目录
mkdir /opt/nginx

进入目录
cd /opt/nginx

第三步 :

上传nginx的包

第四步 :

解压
tar -zxvf nginx-1.14.2.tar.gz 

第五步 :

进入解压目录
cd nginx-1.14.2

执行命令
./configure (注意 : 这个命令可以携带参数)

第六步 :

执行make指令
make

执行安装指令
make install

第七步 :

默认的安装的目录 : /usr/local 目录下的nginx

进入安装目录
cd /usr/local/nginx

第八步 :

进入sbin目录
cd sbin

启动nginx
./nginx

第九步 :

测试 , 略

9. 拓展内容

9.1. 面试题一

nginx能够并发处理5万请求 , 请问nginx请求处理机制是如何的

9.1.1. 相关知识储备

  • 一个nginx可以并发处理多个请求 , 就证明了nginx和客户端是一对多的关系 , 也就是说nginx服务器有能力同时给多个服务器提供服务 , 一般来说能够完成并行处理的方式大概有几种 :
    • 多进程的方式
    • 多线程的方式
    • 异步的方式
9.1.1.1. 多进程的方式
  • 理解 :
    • 服务器就收到一个客户端请求时 , 服务器的主进程会产生一个子进程 , 这个子进程会和客户端连接并进行交互 , 交互完毕之后连接断开 , 这个子进程就结束了
  • 优缺点 :
    • 多进程的方式有点在于 , 设计和实现相对简单 , 各个子进程之间相互独立 , 处理客户端请求的进程彼此不受干扰 , 并且当一个子进程产生问题时 , 不容易将影响蔓延到其他进程中 , 这保证了提供服务的稳定性 , 当子进程退出时 , 其占用资源会被系统回收 , 在资源和时间上会产生一定的额外开销, 因此 , 如果服务器接受大量并发请求 , 就会对系统资源造成压力 , 导致性能下降
9.1.1.2. 多线程的方式
  • 理解 :
    • 服务器每当接收到一个客户端请求时 , 会由服务器主进程派生出一个线程和客户端进行交互
  • 优缺点 :
    • 由于操作系统产生一个线程的开销远远小于产生一个进程的开销 , 所以多线程方式在很大程度上减轻了web服务器对系统资源的要求 , 该方法使用线程进行任务调度 , 开发方面可以遵循一定的标准 , 这相对来说比较规范和有利于协作 , 但在线程管理方面 , 该方式有一定不足, 每个线程位于同一个进程内 , 可以访问同样的内存空间 , 彼此之间相互影响
9.1.1.3. 异步的方式
  • 同步 : 发送方发出一个请求后 , 需要等待接受方接发回响应后 , 才能接着发送下一个请求

  • 异步 : 发送方发出一个请求后 , 不等待接收响应这个请求 , 就继续发送下一个请求

  • 异步的方式也分为2种 :

    • 异步阻塞
    • 异步非阻塞
  • 异步阻塞 :

    发送方向接收方发送请求后 , 不用等待响应 , 可以继续其他工作 ; 接收方处理请求时进行操作如果不能马上得到结果 , 就一直等待返回结果后 , 才响应发送方 , 期间不能进行其他工作 , 这种方法在实际中不实用

  • 异步非阻塞 :

    发送方向接收方发送请求后 , 不用等待响应 , 可以继续其他工作 ; 接收方处理请求时进行操作如果不能马上得到结果 , 也不等待 , 而是马上返回做其他事情 , 当操作完成后 , 将完成状态和结果通知接收方 , 接收方再响应发送方

  • 异步非阻塞举例 :

    在超时排队付账 , 客户(发送方)向收款员(接收方)付款?(发送请求)后等待收款员找零的过程中 , 还可以做其他事情 , 比如打电话 聊天等 ; 而收款员在等待收款机处理交易(操作)的过程中可以帮助客户将商品打包 , 当收款机产生结果后 , 收款员给客户结账(响应请求) , 这种方式是发送方和就收方通信效率最高的一种

9.1.2. 面试题回答

nginx之所以能够处理高并发情况 , 主要是nginx采用多线程 + 异步中(异步非阻塞的方式)处理web请求

流程 :

​ nginx服务器启动后 , 会产生一个主线程(master process)和多个工作线程(worker process)(工作进程个数可以指定 , 例如 worker_processes 5) , nginx服务器的所有工作进程动用于接收和处理客户端请求

​ 每个工作进程使用了异步非阻塞方式 , 可以处理多个客户端请求 , 当某个工作进程接收到客户端的请求以后 , 进行处理 , 如果不能立即得到结果 , 就取处理其他请求而非阻塞 ; 而客户端在此期间也无需等待处理 , 可以去处理其他的事情 ; 当返回结果时 , 就会通知此工作进程 ; 该进程得到通知 , 暂时挂起当前处理的事务 , 去响应客户端请求

9.2. 面试题二

nginx的工作模式(或者问nginx的工作原理)

9.2.1. 面试题回答

  1. nginx在启动后 , 会有一个master进程和多个独立的worker进程
  2. master进程接收来自外界的信号 , 向各个worker进程发布信号 , 每个worker进程都有可能来处理这个连接
  3. master进程能监控worker进程的运行状态 , 当worker进程退出后(异常情况下) , 会自动启动新的worker进程 , 不会造成业务的中断

9.2.2. nginx的原理图

posted @ 2021-07-11 20:31  小_Leo  阅读(36)  评论(0编辑  收藏  举报