• nginx-编译安装-基础指令-信号


    nginx 的编译与安装

    nginx目录介绍

    如果我们需要整合第三方模块,需要自己编译然此模块编译到nginx里面。apt和yum的安装只具有常用的基础功能。

    • 下载nginx
    wget http://nginx.org/download/nginx-1.14.0.tar.gz
    
    • 1

    /auto 目录
    在这里插入图片描述
    Changes 描述了一每个版本提供了那些特性 以及修复了那些bug
    在这里插入图片描述
    /conf 配置文件的示例文件
    configure 执行编译前必须执行的脚本,用于生成中间文件,编译会使用到。
    contrib 用于显示nginx的配置语法,需要拷贝到我们的vim中

    #在profile开启配色,记得配置完成以后source一下
    TERM=linux
    #在用户下面创建目录
    mkdir ~/.vim 
    #拷贝文件
    
    • 1
    • 2
    • 3
    • 4
    • 5

    拷贝前
    在这里插入图片描述
    拷贝后,可以看到有颜色了
    在这里插入图片描述
    /html 错误500 和欢迎页面
    在这里插入图片描述
    /man 文件帮助文件

     man ./nginx.8 #注意./不能少
    
    • 1

    在这里插入图片描述
    /src 源代码

    nginx编译

    1 安装第三方库

    yum install -y pcre pcre-devel zlib zlib-devel openssl openssl-devel
    
    • 1

    1.1 第三库的介绍
    1) PCRE
    PCRE(Perl Compatible Regular Expressions)是一个 Perl 库,包括 perl 兼容的正则表达式库。nginx 的 http 模块使用 pcre 来解析正则表达式,所以需要在 linux 上安装 pcre 库。
    注:pcre-devel 是使用 pcre 开发的一个二次开发库。nginx 也需要此库。
    2) zlib
    zlib 库提供了很多种压缩和解压缩的方式,nginx 使用 zlib 对 http 包的内容进行 gzip,所以需要在 linux 上安装 zlib 库。

    3) OpenSSL

    OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。nginx 不仅支持 http 协议,还支持 https(即在 ssl 协议上传输 http),所以需要在 linux安装 openssl 库。

    • 先看看编译的时候支持那些参数

    2 编译准备
    1)在编译之前可以查看配置支持那些参数

    #查看编译的时候支持那些参数
    ./configure --help
    
    • 1
    • 2

    在这里插入图片描述

    通常只需要指定–prefix=Path 所有的文件都会在这个目录下生成
    with 和without分别对应了默认编译的时候会不会将这些模块编译进nginx中。

    #编译 如果过程中没有任何错误就编译成功了 编译过程中会生成一些中间文件 文件会放到objs文件下
    ./configure --prefix=/env/liyong/install/nginx
    
    • 1
    • 2

    比如更多的配置

    ./configure \
    --prefix=/usr/local/nginx \
    --pid-path=/usr/local/nginx/nginx.pid \
    --lock-path=/usr/local/nginx/nginx.lock \
    --error-log-path=/usr/local/nginx/log/error.log \
    --http-log-path=/usr/local/nginx/log/access.log \
    --with-http_gzip_static_module \
    --http-client-body-temp-path=/usr/local/nginx/temp/client \
    --http-proxy-temp-path=/usr/local/nginx/temp/proxy \
    --http-fastcgi-temp-path=/usr/local/nginx/temp/fastcgi \
    --http-uwsgi-temp-path=/usr/local/nginx/temp/uwsgi \
    --http-scgi-temp-path=/usr/local/nginx/temp/scgi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    可以在objs下面看到编译包含了那些模块每一个extern都是一个模块

    cat ./ngx_modules.c
    
    • 1

    在这里插入图片描述
    3 编译
    1)在nginx目录下执行make

    make #执行以后可以运行的二进制文件都在objs文件下
    
    • 1

    在这里插入图片描述

    cd objs
    
    • 1

    在这里插入图片描述
    2) make install

    make install #首次安装执行,如果升级还需要做其他操作
    
    • 1

    下面就可以到prefix文件中看到安装成功的nginx
    在这里插入图片描述
    在这里插入图片描述

    nginx快速安装
    #通过yum安装
    sudo yum install -y nginx
    #通过whereis 指令查看安装到了哪里
    whereis nginx
    
    • 1
    • 2
    • 3
    • 4
    配置命令行

    1 发送信号

    #重载配置文件
    ./nginx -s reload
    #停止服务
    ./nginx -s stop 
    #优雅的停止服务
    ./nginx -s quit
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2 热部署,比如升级服务

    #热部署
    cp nginx nginx.old #备份旧文件  在sbin目录下
    #将生产的新文件复制到sbin目录下 并给master发送一个信号
    kill -USR2 12734 #master的进程id
    kill -WINCH 12734 #优雅的关闭worker进程
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3 日志切割(可以参靠日志篇的日志切割)

    mv access.log bak.log #先备份日志文件
    ./nginx -s reopen #重新生成日志文件
    
    • 1
    • 2

    4 其它指令

    ./nginx -h #查看帮助
    ./nginx -v #查看版本
    ./nginx -g #指定配置指令
    ./nginx -p #指定运行目录
    ./nginx -t #检查配置文件是否含有错误
    
    • 1
    • 2
    • 3
    • 4
    • 5
    信号
    kill -SIGHUP 12717 #发送SIGHUP信号, 这个也是和reload一的效果 重新加载
    
    • 1
    kill -SIGTERM 15534 #发送停止信号
    
    • 1

    在这里插入图片描述
    Master:
    CHLD 当worker进程结束时,会向Master进行发送CHLD信号,从而监控worker进程。
    管理worker进程:
    TERM,INT 立刻停止
    QUIT 立刻退出
    HUP 重载配置文件
    USR1 从新打开日志文件,做日志切割
    上面这几个命令可以直接用./nginx -s 向master发送
    下面这两个命令只能通过kill发送,在热部署的时候使用
    USR2
    WINCH

    Worker:和上面的是对应的,但是通常不用,一般是向Master进程发送停止信号,因为我们希望Master来管理worker进程,当Master收到信号以后会发送到worker进程。
    TERM,INT 立刻停止
    QUIT 立刻退出
    USR1 从新打开日志文件,做日志切割
    WINCH

    Nginx命令行 -s 发送的四个命令 reload、reopen、stop、quit 分别对应于向master进程发送信号 HUP、USR1、TERM、QUIT。
    nginx命令行
    启动nginx以后,会讲pid记录到文件中,通常是安装目录下的logs/nginx.pid 记录了Master的进程pid,当我们执行命令行的时候其实就是读取这个pid然后向这个进程发送信号,也就是后面的 reload、reopen、stop、quit这四个是为了方便我们使用更直观。

    reload流程:
    1 向Master进程发送HUP信号(reload命令)
    2 Master进程校验配置语法是否正确
    3 Master进程打开新的监听端口
    4 Master 进程用新配置启动新的worker进程
    5 Master进程向老worker进程发送QUIT信号
    6 老worker进程关闭监听句柄,处理完当前连接后结束进程。
    在这里插入图片描述
    当发送reload命令的时候,Master会启动四个新的worker进程,图中用黄颜色代替。然后新的连接全部会转到新的进程,老连接会继续在老进程处理,处理完毕以后就会自动关闭。还有一种情况就是老连接报错了,倒是老进程一直被占用,比较新的nginx也提供了新的配置worker_shutdown_timeout ,这个配置项设置超时时间,如果超过了一个小时则强制结束。

    热升级流程
    1 将旧nginx替换成新的nginx文件(注意备份)
    2 向Master发送USR2信号
    3 Master进程修改pid文件名,加后缀.oldbin
    4 master 进程用新nginx文件启动新Master进程
    5 向老Master进程发送QUIT信号,关闭Master进程
    6 回滚:向老Master发送hub,向新Master发送
    在这里插入图片描述

    优雅的关闭worker进程:
    不能直接关闭连接,会导致错误,我们需要识别当nginx没有处理连接的时候来关闭。但是nginx对于websoket,tcp,udp不识别到底到那个报文才算结束,所以我们优雅的关闭一般是针对HTTP。
    1 设置定时器 worker_shutdown_timeout
    2 关闭监听句柄
    3 关闭空闲连接 连接池会有一些空闲连接
    4 在循环中等待全部连接关闭 处理完http以后,会关闭当前使用的连接。
    4 退出进程 当等待时间超过前面的配置时会强制关闭。

  • 相关阅读:
    【机器学习】评价指标 : 准确率,查准率与查全率
    衔尾法解决当无法使用空闲中断以及DMA中断时配置DMA接收串口不定长数据
    others-AppLovin广告接入
    android源码设计模式学习之单列模式
    跨越HTTP无状态边界:Cookie与Session在Django中的实战应用
    【Linux私房菜】第三期——实用指令
    shell中实用eval命令和安全问题
    时空数据挖掘一(城市计算)
    [创业之路-120] :全程图解:软件研发人员如何从企业的顶层看软件产品研发?
    Flutter 教程之 Flutter CI/CD 和自托管的 GitHub Action
  • 原文地址:https://blog.csdn.net/qq_43259860/article/details/134533311