nginx基础(3)-重载、热部署、日志切割

痛定思痛。 2022-11-04 11:29 225阅读 0赞

Nginx命令行

  01 格式:nginx 参数 信号

  02 帮助: -? -h

  03 使用指定的配置文件:-c

  04 指定配置指令: -g

  05 指定运行目录: -p

  06 发送信号: -s

    立刻停止服务: stop

    优雅地停止服务: quit

    重载配置文件: reload

    重新开始记录日志文件: reopen

  07 测试配置文件是否语法错误: -t -T

  08 打印nginx的版本信息、编译信息等: -v -V

重载配置文件

  1. /usr/local/nginx/sbin/nginx -s reload

若执行重启时报:nginx: [error] invalid PID number “” in “/usr/local/nginx/logs/nginx.pid”
解决:
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

热部署

  • 即在不打断用户请求的情况下更新版本
  • Nginx 采用了高度模块化的设计思路,并且内部的进程主要有两类,master 进程 和 worker 进程。其中 master 进程只有一个,worker 进程可以有多个。
  • worker 进程才是真正 working 的进程,才是真正处理请求的进程。worker 进程全部都是 master 进程的子进程。worker 进程是以普通用户的身份进行运行的,这样就可以极大增加程序的安全性。就算是万一有一个进程被劫持,那也不会有管理员权限。
  • nginx 的热部署和其并发模型有着密不可分的关系。说白了,就是因为 master 进程的关系。当通知 ngnix 重读配置文件的时候,master 进程会进行语法错误的判断。如果存在语法错误的话,返回错误,不进行装载;如果配置文件没有语法错误,那么 ngnix 也不会将新的配置调整到所有 worker 中。而是,先不改变已经建立连接的 worker,等待 worker 将所有请求结束之后,将原先在旧的配置下启动的 worker 杀死,然后使用新的配置创建新的 worker。

操作:源码安装nginx新版本,执行至make

ps -ef | grep nginx 查看当前nginx master进程

20210302152215426.png

备份现有Ngxix的二进制文件,更新时只会更新二进制文件不会更新其他文件

  1. cp nginx nginx.old

将编译好的最新版本的nginx二进制文件 拷贝到/usr/local/nginx/sbin/ 目录中 替换到正在运行的nginx二进制文件

给正在运行的nginx master进程发送一个信号,提示要开始热部署了

  1. kill -USR2 master进程ID

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zOTQ2MTQ4Nw_size_16_color_FFFFFF_t_70

现在nginx master进程回新启一个nginx master进程,新的master进程使用的是刚刚复制过来的新的nginx二进制文件,老的work也在运行,新的master 会生成新的work,他们会平滑的将所有的请求过度到新的二进制文件启的nginx进程中,这样就实现了平滑过度,查看新的nginx 进程状况

20210302152957367.png

会看到新老master进程都在运行,老的master 不再监听80 443 端口,所以新的请求会进入新的二进制文件的master中,向老的nginx 发送WINCH信号,告诉他请优雅的关闭老的work进程

  1. kill -WINCH master进程ID

20210302153529330.png

会看到老的master进程还在 但是没有老的work进程了,说明所有的请求已经切换到新的nginx中,但是有可能会出现一些问题需要将新版本退回到老版本,所以这时候还可以给老的master(13195)进程发送reload命令,让他重新把work进程拉起,在把新版本关掉,所以老的master不会自动退出,留在这里利于版本回退。

日志切割

1)将原日志备份之后执行命令:

  1. /usr/local/nginx/sbin/nginx -s reopen

2)计划任务将日志分隔
思路:将日志mv为其他文件名,已年月日方式存储
向Nginx 主进程发送 USR1 信号。USR1 信号是重新打开日志文件

  1. kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid)

3)在单个站点配置文件中编辑access_log文件的命名方式,例如

  1. server{
  2. if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})")
  3. {
  4. set $curyear $1;
  5. set $curmonth $2;
  6. set $curday $3;
  7. set $curhour $4;
  8. set $curminutes $5;
  9. set $curseconds $6;
  10. }
  11. access_log /data/logs/api_dev_xintong$curyear$curmonth$curday.log main;
  12. }

计划任务执行,只保存近7天的日志内容
每天3点执行清理日志文件

  1. 0 3 * * * find /data/logs -iname "*.log" -mtime +7|xargs rm -f > /dev/null 2>&1

发表评论

表情:
评论列表 (有 0 条评论,225人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Nginx日志切割

    Nginx日志没有类似Apache这样通过cronlog或者rotatelog对日志分割处理的能力。实际的问题是线上的日志如果不按天进行切割,那么日志就会越来越大,可以达到几G

    相关 Nginx日志切割

    默认情况下,nginx的日志比如:error.log,access.log都保存在/usr/local/nginx/logs目录下,慢慢的,日志会累积的越来越大,因此我们需要以

    相关 nginx日志切割

    概述 nginx的日志一般保存在logs文件夹下,随着运行时间加长,日志文件越来越大,阅读和查找也更加困难 有必要对日志文件进行切割  一般是以天为单位 添加定时任

    相关 nginx日志切割

    Web 访问日志 (access\_log) 记录了所有外部客户端对Web服务器的访问行为,包含了客户端IP,访问日期,访问的URL资源,服务器返回的HTTP状态码等重要信息。