nginx学习记录

基础架构

  基础架构-w50

1.请求流程

请求流程

优点

  1. 高并发,高性能
  2. 可扩展性良好
  3. 高可靠性
  4. 热部署
  5. BSD许可证

–32核64G,可支持千万并发

组成

(1)Nginx二进制可执行文件
(2)Nginx。conf配置文件
(3)access.log访问日志
(4)error.log错误日志

历史版本

第三方模块框架

OpenResty

编译nginx

下载安装nginx

  1. 源码目录

  2. 目录说明
    ① auto 用于编译,其中包含了四个主要目录,分别是cc(用于编译)、lib、os(对编译操作系统的判断)、types
    ② CHANGES: nginx的版本变化
    ③ CHANGES.ru: 俄罗斯版本
    ④ conf: 一些示例文件,nginx安装好后为了方便运维去配置,会把conf的示例文件拷贝到安装目录
    ⑤ configure: 该文件用于生成中间文件,执行编译前的必备动作
    ⑥ contrib: 提供2个perl脚本和vim的工具,改变配置nginx.conf的vim语法配色

    1
    cp -r contrib/vim/* ~/.vim/

    ⑦ man: nginx帮助文件
    ⑧ src: 源代码

  3. 编译

    1
    ./configure --help | more


      如果不需要变动,编译时只需要指定–prefix参数即可,所有的文件会在prefix目录下建相应的文件夹
      –with前缀的模块默认不加入编译
      –without前缀的模块默认加入编译,执行该命令表示移除编译

    1
    2
    3
    4
    5
    6
    7
    8
    9
    //安装依赖
    //解决zlib error依赖错误
    sudo apt install zlib1g-dev

    //解决openssl error依赖错误
    sudo apt install openssl libssl-dev

    //解决pcre error依赖错误
    sudo apt install libpcre3 libpcre3-dev

      执行configure,会生成中间文件在objs文件夹下,其中最重要的是ngx_modules.c,它决定了哪些模块将参与编译

    1
    ./configure --prefix = ~/home/app/nginx


      接下来是执行make编译,目标文件在objs目录“nginx”,c编译的中间文件在src目录

    1
    make


      最后执行安装命令,安装在prefix执行的目录中

    1
    make install

nginx命令行

1
2
3
4
5
6
7
8
9
10
//使用指定配置文件 -c
//使用配置指令 -g
//指定运行目录 -p
//发送信号 -s
////stop:立即停止服务 (kill -TERM)
////quit:优雅的停止服务 (kill -QUIT)
////reload:重载配置文件 (kill -SIGHUP)
////reopen:重新开始记录日志文件 (kill -USR1)
//测试配置文件是否有语法错误 -t -T
//打印nginx的版本信息、编译信息:-v -V

  修改配置后,直接nginx -s reload即可,会自动加载新的配置,在这个过程中,会重新启动一个worker进行,并将之前的worker进程优雅的退出

优雅关闭

  优雅的关闭只针对http协议层

热部署


  1. 部署最新版本的nginx,只需替换nginx二进制文件,首先用ps -ef | grep nginx,观察进程的状态。(注意在编译新版本的nginx时,不需要执行make install命令,否则会覆盖之前的配置文件)
  2. 然后将安装目录下sbin/nginx,修改为nginx.old
    1
    mv nginx nginx.old
  3. 然后将其他版本的nginx移到该目录下
    1
    cp ../openresty/nginx/sbin/nginx ./
  4. 然后像nginx发送信号(kill -USR2 79637),其会启动新版本nginx进程
    1
    kill -USR2 79637
  5. 然后向老的nginx进程发送一个信号(kill -WINCH 79637),让其优雅的关闭work进程
    1
    kill -WINCH 79637
  6. 在这之后可以看到老版本的nginx的worker进程已经关闭,还剩下master进程,master进程是为了防止新部署的版本出现问题,可以做版本回退的作用

    版本回退

  7. 首先通过信号,kill -HUP 79637重新拉起旧版本的master进程
    1
    kill -HUP 79637
  8. 然后像新版本的nginx,发送kill -WINCH 112586信号使其优雅的关闭worker进程
    1
    kill -WINCH 112586
  9. 最后关闭新版本的nginx master进程即可
    1
    kill -9 112586

    日志切割

  10. 首先到log目录下,将之前日志转移到另一个文件
    1
    mv access.log pre_access.log
  11. 然后在nginx目录下,执行reopen命令即可生成新的日志文件
    1
    sudo nginx -s reopen

    Nginx信号


      其中master进程会检测worker进程,当worker异常终止时,master进程会接收到一个CHLD信号。然后master进程会重新将worker进程拉起。

    reload流程



    (注意配置worker_shutdown_timeout)

使用Goaccess分析日志

  1. 使用apt安装goaccess
    1
    sudo apt install goaccess
    然后执行一下命令即可。-o 分析日志网页的生成路径,其余参数查看官网帮助文档,其中注意在nginx的日志格式变化的情况下,需要修改–log-foramt参数对应的值
    1
    goaccess pre_access.log -o ../html/report.html --real-time-html --time-format='%H:%M:%S' --date-format='%d/%b/%Y' --log-format=COMBINED

    Nginx模块数据结构


      其中ngx_module_t中的type字段定义了nginx模块的类型

共享内存使用模块

参考文章

  1. 极客时间Nginx核心知识100讲