nginx学习

参考链接: https://www.bilibili.com/video/BV1zJ411w7SV?p=4

Nginx简介:

Nginx (engine x) 是一款开源的轻量级的 Web 服务器,可以接受响应 HTTP请求,可以作为反向代理服务器,邮件代理服务器和通用 TCP/UDP 代理服务器。
Nginx 采用 epoll(Linux 2.6 内核)、kqueue(FreeBSD)、evenport(Solaris10)作为网络I/O 模型,因此具备极高的性能。在高并发连接请求的场景下,Nginx 能够支持高达 50000个并发连接数的响应,而同时对CPU,内存等系统资源的消耗却非常低,运行非常稳定,几乎可以做到 7x24 小时不间断运行。
Nginx 通常用在反向代理、负载均衡 和 HTTP 缓存。其特点是高并发,高性能和低内存。

  • nginx做为HTTP服务器,有以下几项基本特性:
  • 处理静态文件,索引文件以及自动索引;
  • 打开文件描述符缓冲.无缓存的反向代理加速,简单的负载均衡和容错.
  • FastCGI,简单的负载均衡和容错.
  • 模块化的结构。包括gzipping,byte ranges, chunked responses,以及SSI-filter等filter。如果由FastCGI或其它代理服务器处理单页中存在的多个SSI,则此项处理可以并行运行,而不需要相互等待。
  • 支持SSL和 TLSSNI.

反向代理

  • 正向代理
    正向代理:在客户端(浏览器)配置代理服务器,局域网中的客户端要访问Internet,需要通过代理服务器进行互联网访问,这种代理服务就称正向代理。
    nginx学习_第1张图片

  • 反向代理
    客户端不需要做任何配置,只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实的服务器IP地址。
    nginx学习_第2张图片

负载均衡

  • 基本的请求与响应流程:
    nginx学习_第3张图片
  • 负载均衡
    负载均衡(Load Balancing)用来在多个服务器中分配负载,原本单个服务器解决不了的请求,通过增加服务器数量,然后将原本集中在单个服务器上的请求分发到多个服务器上,以达到最佳化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。
    使用带有负载均衡的多个服务器组件,取代单一的组件,可以通过冗余提高可靠性。
  • 负载均衡原理
    系统的扩展可分为纵向(垂直)扩展和横向(水平)扩展。
    纵向扩展,是从单机的角度通过增加硬件处理能力,比如 CPU 处理能力,内存容量,磁盘等方面,实现服务器处理能力的提升,不能满足大型分布式系统(网站),大流量、高并发、海量数据的问题。
    因此需要采用横向扩展的方式,通过添加机器来满足大型网站服务的处理能力。 当一台机器不能满足,则增加两台或者多台机器,共同承担访问压力。
  • 负载均衡的作用(解决的问题):
    1.解决并发压力,提高应用处理性能(增加吞吐量,加强网络处理能力);
    2.提供故障转移,实现高可用;
    3.通过添加或减少服务器数量,提供网站伸缩性(扩展性);
    4.安全防护;(负载均衡设备上做一些过滤,黑白名单等处理)
    nginx学习_第4张图片

动静分离

  • 为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。
    nginx学习_第5张图片

Docker部署nginx

编写dockerfile

FROM registry.cn-beijing.aliyuncs.com/qianjia2018/qianjia_public:node-new as build-stage

COPY . /app
WORKDIR /app

RUN yarn config set registry http://39.106.145.141:9000/repository/node-public \
 && yarn \
 && yarn docs:build \
 && yarn build 

FROM registry.cn-beijing.aliyuncs.com/qianjia2018/qianjia_public:dist-nginx as production-stage
COPY --from=build-stage /app/docs/.vuepress/dist /usr/share/nginx/html
COPY --from=build-stage /app/dist /usr/share/nginx/html/qjsl
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

构建镜像

docker build -t nginx:qjsl-web-new /root/QJSL_web_new

准备映射目录,COPY nginx配置文件到宿主机目录

mkdir -p /usr/local/docker/nginx/conf
docker run -d --rm --name nginx nginx:qjsl-web-new
docker cp nginx:/etc/nginx/nginx.conf . && docker cp nginx:/etc/nginx/conf.d . && docker cp nginx:/usr/share/nginx/html/ .
docker stop nginxls

docker部署nginx

docker run -d --name nginx --restart=unless-stopped \
 -v /usr/local/docker/nginx/html:/usr/share/nginx/html \
 -v /usr/local/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
 -v /usr/local/docker/nginx/conf/conf.d:/etc/nginx/conf.d \
 -v /usr/local/docker/nginx/logs:/var/log/nginx \
 nginx:qjsl-web-new

Linux部署nginx

安装pcre依赖

  • 解压压缩文件
    tar -xvf pcre-8.44.tar.gz
  • 进入解压目录
    执行./configure
  • 编译安装
    make && make install
    查看安装版本
    pcre-config --version
  • 安装openssl、zlib
    yum install -y gcc zlib zlib-devel pcre-devel openssl openssl-devel

安装nginx

  • 解压安装压缩文件
    tar -xvf nginx-1.19.6.tar.gz
    进入解压目录
    执行./configure
  • 编译安装
    make && make install
    安装完成,在/usr/local/nginx/sbin中生成nginx启动脚本,在目录下启动nginx
    ./nginx
    查看nginx进程
    ps -ef | grep nginx

部署完成

  • 查看nginx端口
    cat /usr/local/nginx/conf/nginx.conf
    在这里插入图片描述
  • 设置开放端口
    sudo firewall-cmd --add-port=80/tcp --permanent
  • 查看开放的端口
    firewall-cmd --list-all
    nginx学习_第6张图片
    重载防火墙
    firewall-cmd --reload
  • 访问nginx
    192.168.10.186:80
    nginx学习_第7张图片

nginx常用命令

使用操做命令的前提条件:必须进入nginx的/usr/local/nginx/sbin目录

  • 查看nginx版本号
    ./nginx -v
  • 启动nginx
    ./nginx
  • 停止nginx
    ./nginx -s stop
  • 重新加载nginx(重新加载nginx配置文件 生效)
    ./nginx -s reload

nginx配置文件

  • 路径
    cd /usr/local/nginx/conf
    cat nginx.conf

  • 构成
    大致分为3部分
    1.全局配置
    从配置文件开始到events之间的内容,主要会设置一些影响nginx服务器整体运行的配置指令,主要包括配置运行nginx服务器的用户(组)、允许生成的worker process数,进程PID存放路径、日志存放路径和类型以及配文件的引入等。
    在这里插入图片描述
    worker process,nginx服务器并发处理的值,数值越大表示支持的并发处理量越多,会受到硬件、软件等设备的制约。
    2.events块
    主要影响nginx服务器与用户的网络连接,常用的设置包括是否开启对多 worker process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 worker process 可以同时支持的最大连接数等。
    在这里插入图片描述
    指定nginx中每个worker process支持的最大连接数是多少,此配置对nginx性能影响较大,需根据实际情况灵活配置。
    3.http块
    配置最为频繁部分,主要是代理、缓存和日志等绝大部分功能以及第三方配置模块所在,其中还包括http全局块server块
    http全局块
    表示指令包含文件引入、MIME-TYPE定义、日志自定义、连接超时时间、单链接请求数上限等。
    nginx学习_第8张图片
    server块
    与虚拟主机关系密切,等同于完全独立的硬件主机,节省互联网硬件成本。
    每个http块可以包括多个server块,每个Server块相当于一个虚拟主机。
    每个Server块分为全局Server块,以及可以同时包含多个location块
    — 全局Server块
    最常见的配置是本虚拟主机的监听配置以及本虚拟主机的名称或IP配置。
    — location块
    一个Server块可配置多个location块。
    主要基于nginx服务器收到的请求字符串,对虚拟主机名称或IP别名之外的字符串进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能, 还有许多第三方模块的配置。
    nginx学习_第9张图片
    location指令说明:
    用于配置URL
    语法:

     location [= ~ ~* ^~] uri {
    
     }
    
  • 如果uri包含正则表达式,则必须要有~~*标识
    =:用于不含正则表达式的uri前,表示要求请求字符串与uri严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。
    ~:表示uri包含正则表达式,并且区分大小写。
    ~*:表示uri包含正则表达式,并且不区分大小写。
    ^~:用于不含正则表达式的uri前,要求nginx服务器找到标识uri和请求字符串匹配度最高的location后,立即使用此location处理请求,而不再使用location块中的正则uri和请求字符串做匹配。


nginx配置实例

反向代理①

浏览器地址栏输入地址www.sss.com,跳转到Linux系统tomcat主页面
nginx学习_第10张图片

安装tomcat

Linux系统中安装tomcat,使用默认端口8080

  • 解压安装文件
    tar -xvf apache-tomcat-9.0.41

  • 进入解压后的目录,启动tomcat
    cd apache-tomcat-9.0.41/bin
    执行./startup.sh
    在这里插入图片描述

  • 查看日志
    cd … && cd logs
    tail -f catalina.out
    nginx学习_第11张图片

  • 对外开放访问的端口
    sudo firewall-cmd --add-port=8080/tcp --permanent
    重载防火墙
    firewall-cmd --reload
    查看开放的端口
    firewall-cmd --list-all

  • 查看tomcat主页面
    nginx学习_第12张图片

反向代理配置
  • 配置IP地址到域名的映射(域名映射)
    vim /etc/hosts
    192.168.10.186 www.sss.com

  • nginx中配置请求转发(配置反向代理)
    vim /usr/local/nginx/conf/nginx.conf
    nginx学习_第13张图片

  • 启动nginx
    cd /usr/local/nginx/sbin
    ./nginx
    nginx需处于停止状态,否则直接启动nginx会因端口占用而报错,启动后配置文件生效。或使用./nginx -s reload命令直接使配置文件生效。

  • 测试
    nginx学习_第14张图片

反向代理②

安装tomcat

部署两个tomcat,使用端口:8080 & 8081
访问 http:192.168.10.186:9001/edu/ 跳转到192.168.10.186:8080
访问 http:192.168.10.186:9001/vod/ 跳转到192.168.10.186:8081

  • 增加一个tomcat,端口8081
    解压安装文件
    tar -xvf apache-tomcat-9.0.41
  • 修改端口
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 进入解压后的目录,启动tomcat
    cd … && cd bin
    执行./startup.sh
    nginx学习_第15张图片
    nginx学习_第16张图片
新建测试页面

新建文件夹和测试页面

  • 8080
    cd /root/tests/tomcat/apache-tomcat-9.0.41/webapps
    mkdir edu
    vim a.html
<h1>8080</h1>

nginx学习_第17张图片

  • 8081
    cd /root/tests/tomcat/tomcat8081/apache-tomcat-9.0.41/webapps
    mkdir vod
    vim a.html
<h1>8081</h1>

nginx学习_第18张图片

反向代理配置
  • 编辑nginx配置文件
    cd /usr/local/nginx/conf/
    vim nginx.conf
    nginx学习_第19张图片

  • 开放对外访问端口号
    sudo firewall-cmd --add-port=8080/tcp --permanent
    重载防火墙
    firewall-cmd --reload
    查看开放的端口
    firewall-cmd --list-all

  • 加载配置文件
    cd /usr/local/nginx/sbin
    加载nginx配置文件使配置生效
    ./nginx -s reload

  • 测试
    nginx学习_第20张图片
    nginx学习_第21张图片

负载均衡

将访问http://192.168.10.186/edu/a.html的请求,平均分配在8080和8081端口,达到负载均衡效果。
使用两台tomcat服务器,8080和8081
分别在两台tomcat的webapps目录中,创建名称为edu的文件夹,并分别在文件夹中创建页面a.html用于测试访问效果。

  • 配置8081访问页面
    /root/tests/tomcat/tomcat8081/apache-tomcat-9.0.41/webapps
    mkdir edu
    cd vod && cp a.html …/edu
  • 启动8081
    /root/tests/tomcat/tomcat8081/apache-tomcat-9.0.41/bin
    ./startup.sh
负载均衡配置
  • 编辑nginx配置文件
    cd /usr/local/nginx/conf
    vim nginx.conf
    在这里插入图片描述
    nginx学习_第22张图片
  • 启动nginx
    cd /usr/local/nginx/sbin
    加载nginx配置文件使配置生效
    ./nginx -s reload
  • 测试
    nginx学习_第23张图片
    nginx学习_第24张图片
nginx服务器分配策略
  • 轮询(默认)
    每个请求按时间顺序逐一分配到不同的后端服务器,如果服务器宕机,会自动剔除。

  • weight
    weight代表权重,默认为1,权重越高被分配的客户端越多。
    在这里插入图片描述

  • ip_hash(哈希)
    每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session共享的问题。
    在这里插入图片描述

  • fair(第三方)
    按后端服务器的响应时间来分配请求,响应时间短的优先分配。
    在这里插入图片描述

动静分离

概述:

将动态请求和静态请求分离,使用nginx处理静态页面tomcat处理动态页面,提高访问效率,减少不必要的请求消耗,同时能减少请求的延时。

  • 动静分离的实现方式:
    1、目前较推崇的主流方案,把静态文件独立成单独的域名,放在独立服务器上。
    nginx学习_第25张图片

2、动态和静态文件混合在一起发布,通过nginx来分离。

3、通过location指定不同的后缀名实现不同的请求转发。通过配置expires参数设置,可以设置浏览器缓存过期时间,减少与服务器之间的请求和流量。
设置expires参数之后(3d),表示三天内访问此地址,不需要再去请求服务器,直接通过浏览器的缓存处理。期间会比对服务器的文件是否发生变化,根据变化会重新下载,无变化返回304(浏览器的缓存),有变化返回200,Expires浏览器缓存不适于经常变化更新的资源。

动静分离配置
  • 准备访问使用的静态资源
    cd /
    mkdir data && cd data
    mkdir www image
    cd www
    vim a.html
     <h1>test</h1>
    
    cd … && cd image/
    scp -r [email protected]:/home/sbw/1.jpg .
    1.jpg                                              100%  304KB  68.0MB/s   00:00 
    
  • 修改nginx配置文件
    cd cd /usr/local/nginx/conf/
    vim nginx.conf
    nginx学习_第26张图片
    autoindex on; #列出当前文件夹内容
  • 启动nginx
    cd /usr/local/nginx/sbin
    加载nginx配置文件使配置生效
    ./nginx -s reload
  • 测试
    访问静态资源
    nginx学习_第27张图片
    nginx学习_第28张图片

nginx配置高可用集群

高可用的负载均衡服务

目前,比较主流的Nginx高可用方案就是:keepalived+nginx实现主备方案。

1、什么是keepalived
keepalived是集群管理中保证集群高可用的一个服务软件,用来防止单点故障。

Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。

2、keepalived工作原理
keepalived是以VRRP协议为实现基础的,VRRP全称 Virtual Router Redundancy Protocol,即虚拟路由冗余协议。

虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(VIP = Virtual IP Address,虚拟IP地址,该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到VRRP包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。

keepalived主要有三个模块,分别是core、check和VRRP。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。VRRP模块是来实现VRRP协议的。

keepalived+nginx实现主备过程:
nginx学习_第29张图片

nginx高可用配置

  • 准备主、备nginx服务器,192.168.10.186 和 192.168.10.232

  • 主、备服务器安装keepalived

  • 配置虚拟ip

  • 主nginx安装

  • 备nginx安装
    // 更新包
    apt-get update
    // 下载安装nginx
    apt-get install nginx

  • 主nginx服务器上安装keepalived(186)
    yum install keepalived -y
    查看安装
    rpm -q -a keepalived

    keepalived-1.3.5-19.el7.x86_64
    

    cd /etc/keepalived/
    keepalived配置文件
    keepalived.conf

  • 备nginx服务器上安装keepalived(232)
    安装依赖
    apt-get install libssl-dev openssl libpopt-dev
    安装keepalived
    apt-get install keepalived
    查看版本
    keepalived -version

    Keepalived v2.0.19 (10/19,2019)
    

    新建keepalived配置文件
    vim /etc/keepalived/keepalived.conf

  • 添加检测脚本( 主、备,文件位置,脚本内容相同,nginx存活性检测。)
    cd /usr/local/src/
    vim nginx_ckeck.sh

    #!/bin/sh
    
    A='ps -C nginx -no-header |wc -l'
    if [$A -eq 0];then
            /usr/local/nginx/sbin/nginx     # nginx启动脚本位置(检测存活性)
            sleep 2
            if [ 'ps -C nginx --no-header |wc -l' -eq 0 ];then
                    killall keepalived      # 主服务器宕机就将全部配置杀掉,以启用备服务器
            fi      
    fi 
    
  • 配置主、备模式
    修改nginx主,keepalived配置文件
    vim /etc/keepalived/keepalived.conf

    global_defs {                      //全局配置
       notification_email {
         acassen@firewall.loc
         failover@firewall.loc
         sysadmin@firewall.loc
       }
       notification_email_from Alexandre.Cassen@firewall.loc
       smtp_server 192.168.10.186
       smtp_connect_timeout 30
       router_id LVS_DEVEL               # 定义一个主机ID,使能访问到主机
    }
    
    vrrp_script chk_service_ok {       //脚本配置
           script "/usr/local/src/nginx_ckeck.sh"   # 检查nginx是否存在
           interval 2                    # 每两秒钟检查一次
           weight 2                      # 设置当前服务器的权重,服务器宕机后让其权重发生改变
    }
    
    vrrp_instance VI_1 {              //虚拟ip配置
        state MASTER                     # 角色,主机为MASTER,备机为BACKUP
        interface enp0s3                 # 指定网卡,表示虚拟IP绑定到哪张网卡
        virtual_router_id 51             # 虚拟路由id,相同的ID表示在相同的组
        priority 100                     # 优先级,MASTER的优先级要比BACKUP的大
        advert_int 1                     # 检测心跳,主从服务器同步检查的时间间隔,以秒为单位
        authentication {                 # 权限校验的方式
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.10.141               # 虚拟IP地址,即VIP(可绑定多个)
        }
    }
    

    修改nginx备,keepalived配置文件
    vim /etc/keepalived/keepalived.conf

    global_defs {
       notification_email {
         acassen@firewall.loc
         failover@firewall.loc
         sysadmin@firewall.loc
       }
       notification_email_from Alexandre.Cassen@firewall.loc
       smtp_server 192.168.10.232
       smtp_connect_timeout 30
       router_id LVS_DEVEL
    }
    
    vrrp_script chk_service_ok {
           script "/usr/local/src/nginx_ckeck.sh"   # nginx存活性检测
           interval 2                    # 每两秒钟检查一次
           weight 2
    }
    
    vrrp_instance VI_1 {
        state BACKUP                     # 角色,主机为MASTER,备机为BACKUP
        interface enp0s3                 # 指定网卡
        virtual_router_id 51             # 虚拟路由id,相同的ID表示在相同的组
        priority 90                      # 优先级,MASTER的优先级要比BACKUP的大
        advert_int 1                     # 主从服务器同步检查的时间间隔,以秒为单位
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.10.141               # 虚拟IP地址,即VIP
        }
    }
    
  • 启动主、备nginx,keepalived

    主nginx、keepalived
    cd /usr/local/nginx/sbin/
    ./nginx(如果nginx正在运行,先停掉nginx)
    systemctl start keepalived.service
    查看进程
    $ ps -ef | grep keepalived
    root 5603 1 0 04:33 ? 00:00:00 /usr/sbin/keepalived -D
    root 5607 3995 0 04:33 pts/0 00:00:00 grep --color=auto keepalived

    备nginx、keepalived
    service nginx start
    service keepalived start
    查看进程
    $ ps -ef | grep keepalived
    root 187980 1 0 17:02 ? 00:00:00 /usr/sbin/keepalived --dont-fork
    root 187999 187980 0 17:02 ? 00:00:00 /usr/sbin/keepalived --dont-fork
    root 188201 163300 0 17:29 pts/0 00:00:00 grep --color=auto keepalived

  • 测试
    使用虚拟ip进行访问nginx学习_第30张图片

    $ ip a
    

    nginx学习_第31张图片
    停止主nginx服务器和keepalived
    ./nginx -s stop && systemctl stop keepalived
    nginx学习_第32张图片

    $ ip a
    

    nginx学习_第33张图片


nginx原理

nginx最基本的工作流程

nginx学习_第34张图片

nginx启动之后在Linux系统中是有两个进程的,master 和 worker(管理员和工人),master相当于领导进程,一般master将任务分配到领导的各个worker,worker来执行具体的任务。

worker的工作原理:

nginx学习_第35张图片
当客户端发送一个请求,请求到nginx中首先要经由master,master得到请求后把请求分发给worker,由worker来执行具体的工作。master下可能worker众多,worker获取任务的机制并非平均分配或轮询的方式,而是通过争抢的方式瓜分客户端发送的请求来进行具体的操作。nginx本身是不直接支持java的,所以对java的操作还需要依赖于tomcat,所以worker还要进行一些类似于请求转发或者是反向代理,通过tomcat查询数据库来得到最终的结果。

单master多worker机制:

  • master-worker机制的好处:
    1、可以使用nginx -s reload 热部署,不需要对nginx进行启停操作就可以使修改好的配置生效。单master多worker机制更有利于热部署方式的使用,在线上运行的项目中nginx是不能被停止的,单master多worker机制中当nginx已经运行在某个worker之上,那么当nginx -s reload 热部署时,新的nginx请求发布时已经运行了nginx任务的worker便不再参加争抢,而是由其他worker争抢 运行新的任务,从而保证nginx不间断运行。
    2、每个worker都是独立占用一个进程,不需要加锁,方便操作节省资源。当一个worker进程退出时,其他worker进程可以保持正常工作参与争抢,服务不会中断。
  • worker数目设置:
    nginx同Redis类似,同样采用了io多路复用机制,使每个worker都是一个独立进程,每个进程中只有一个主线程,通过异步非阻塞的方式可以处理成千上万请求,每个worker线程可以把一个cpu性能发挥到最佳的限度。
    worker数和服务器的CPU数相等是最为适宜的。
  • 连接数worker_connection:
    1、处理一个请求,会占用worker的2个或4个连接数。
    ①处理一个普通的静态资源访问请求时,访问的请求和响应会分别占用一个连接数。
    ②worker除了处理请求时,请求的链接与响应会占两个连接数,由于worker本身不支持java,涉及到数据库查询时要依赖于tomcat,与tomcat间的请求与响应仍会占用两个连接数。
    2、nginx中单个master与多个worker之间,每个worker支持最大连接数1024,那worker支持的最大并发数是(worker能承受多少个请求计算):
    ①普通的静态访问:worker数×1024(单个worker支持最大连接数)/2
    ②作为HTTP或反向代理时:worker数×1024(单个worker支持最大连接数) /4

你可能感兴趣的:(nginx,linux,nginx,docker)