刚才完了nginx的编译,nginx的编译还是挺简单的。控制nginx:重启、关闭。只有孤零零的一个二进制文件nginx

通过信号来控制它,Linux操作系统进程与进程之间通过信号来通信。荷兰的一位计算机科学家通过火车轨道的红绿灯产生灵感提出了信号这个概念。

nginx的官方command line的地址已被改为:https://www.nginx.com/resources/wiki/start/topics/tutorials/commandline/


Nginx信号量

nginx确实在运行,不过是子进程(worker process)在运行,主进程(master process)并没有在运行,看来上节启动nginx主进程(master process)还存在着问题。

注意主进程的文件不直接响应浏览器的请求,主进程是用来管理子进程的。子进程响应浏览器的请求,主进程负责影响子进程,或者是紧急地杀死子进程。所以子进程叫worker,才是真正的工作者。

主进程和子进程的关系

杀死子进程不能用很暴力的pkill -9,你要是在工作中特别是访问量很大的网站不能这么暴力来的。很多人正在下单子,但是你这个进程啪一下给人家关了,怎么办,钱也扣了。单子还没有写到服务器上。所以引入信号量

使用kill -INT杀死nginx子进程worker process,worker process的进程号是8889.然后重新执行./sbin/nginx启动nginx就成功了,上节的问题(nginx子进程占用了80端口)解决了。查看之后发现nginx主进程和子进程都启动了。


再杀死主进程12077,再查看发现nginx被关闭了


TERM或者是INT紧急地杀掉nginx进程,轻易不要这样用。QUIT优雅地关闭进程。如果说有人在下载但是没有下载完,你要是一下子给人关了,下载到一半或者是付钱付到一半怎么办。优雅是指某个worker正在工作先不杀你,某个worker空闲着就把先把你杀掉。等这个worker工作完了就杀掉,不要再接收新的请求了,最后这个主进程也消亡了。

要是晚上机器要停个五分钟休息一下,建议就使用优雅的关闭QUIT


HUP 如果使用了HUP这个信号量,将会开启新的worker 进程,工作子进程,新的工作进程会读新的配置文件,然后会优雅地关掉旧的子进程。旧进程间接地几秒钟之后就消失了,新进程全部得到的是新配置文件。HUP将会有一个很好的功能是,nginx下有一个很强大的功能,方便的功能,改完配置文件之后不需要重启主进程(apache就得要重启一下它的主进程)。在nginx下直接HUP一下,你新读取的配置就生效了。新写的配置就生效了。

测试一下

修改nginx的配置文件nginx.conf,增加一个索引文件ab.html.并且在ab.html上写些内容。

在ab.html上加些内容

你没有重启,也没有通过信号软重启。


下面使用信号量HUP软重启。

访问nginx的时候索引文件就变成了ab.html而不是index.html

修改配置文件nginx.conf影响的是索引文件究竟是html文件夹下的哪一个html文件先出来,是ab.html还是index.html。


再试一次

修改配置文件

script的小技巧:把链接赋给它自身。

修改index.html,增加一段script

修改ab.html,把那段script也改成页面不断地到一个根目录,要把自己刷新到根目录。

刷新到根目录当前访问的不正是ab.html吗?修改了配置文件把它改成index.html但是一直没生效是因为没有重启。

修改了配置文件之后为什么不立即生效?你怎么过了好几秒钟才生效,为什么不立即生效啊?这就是我们所说的优雅。因为这个页面用JS自己刷新自己,刷新的速度是非常快的,导致它那个进程压根就没有结束,没有结束那它就得在那里运行着了。


再一次把nginx.conf改到ab.html,让它优雅地重启。这次重启达到的效果:重读最新的配置文件。所以并不会立即生效,因为我们的JS正在狂刷新,导致它这个nginx的进程压根就没有结束。

中间一直没断过线,已经变过来了。


HUP:你改了配置文件之后,重读配置文件,它就发挥作用了。


USER1。如果你是运维的话,你会经常碰到它。比如:新建了一个日志文件,旧的日志文件要打包存起来。在Linux中,一个文件对应一个节点叫做inode。inode才是在硬盘上/磁盘上那个文件真正的位置,至于那文件名只是表象罢了,就像猪八戒看到白骨精变的那个美女一样。你真正指向的是磁盘上的哪一块文件那就源源不断的对它写啊写,写日志。日志备份很容易,给它改一下名字就完了。这样不行,因为你在对日志文件给名字,但是这个文件一直被nginx进程打开,就算你改了名,它还是打开的那个文件描述符,还是指向这块磁盘空间,还是指向这块的磁盘文件。就算你改名字了,它还是往这块磁盘写。就算你把它删了,它还是往这个inode上写。所以应该这样做:

把旧的日志文件a重新改成a.bak保存这没错,同时还得再重新建立一个a文件,同时还得好声好气告诉nginx这里有一个新的日志文件a让它去读这一块,来读最新的日志文件。

所以在日志切割的时候

每秒的访问速度很快,访问nginx的速度很快,访问次数在不断的增加。


你更改你的,我给日志文件改个名字,比如说用日期来做备份。很奇怪,日志文件的名字已经被改了,但是它的文件大小还在不断地增大。

它的文件大小还在不断地增大。这是Linux文件系统的特殊之处。因为它真正指向磁盘上的那个东西是叫节点,至于名字是无所谓,你改了名字又如何呢?节点还是那个节点,这个进程还是冲着那个节点写,导致你改了名字还是往那个节点写。

新增一个日志文件:access.log之后

access.log的大小根本没有发生变化。真正指向磁盘的文件是用了inode节点,而不是说光靠一个文件名。现在你是把文件名改了,但是linux系统根本不买账,进程根本不买账。所以我就是刚才打开的进程一直往里面写。


要想备份日志文件,就得使用信号量USR1。

旧的配置文件access.log.0305已经不变了,写新的配置文件access.log上去了。开发还用的少一些,如果是运维,老板说这个日志每天晚上你得备份起来,并且第二天写新日志上,这个时候就得靠USR1了。


USR2。平滑地升级。比如说nginx用的是1.4,过几天用1.6了,1.6重新编译的话,把日志文件又复制到/usr/local/nginx下面去了。一复制呢,就得重新启动这个新进程。新进程一启动,旧进程怎么办,使用信号量USR2。这个新进程将会控制旧进程里面的东西,如果有访问旧进程的,这一次你访问完毕了你就结束吧,你旧的别想再有机会启动了,后来都是这个1.6的新版本在重新启动,响应新的请求。所以USR2和WINCH配合起来用于升级的时候用。


不用查进程号也可以kill的方法。其实说到底还是离不开进程号,只是变通一下罢了。

Linux内核是根据进程号管理的。不想老是查看进程号,可以查看它的pid文件,它的pid文件只是把进程号记录下来了。也可以把进程文件的进程号作为参数赋给kill


虚拟目录的配置:基于ip的虚拟主机,基于端口的虚拟主机,基于域名的虚拟主机。

02-nginx信号量的更多相关文章

  1. 02·nginx进阶·服务优化配置管理

    企业场景常用的Nginx http功能模块汇总 ngx_ http_ core_ module 包括-些核心的http 参数配置,对应Nginx的配置为HTTP区块部分 ngx_ http _acce ...

  2. Nginx教程--02.Nginx虚拟主机的配置

    1.Nginx虚拟主机的配置 1.1 在conf目录下,使用命令 : vim nginx.conf 对上图解释: //全局区 worker _processes 1; //表示当前有1个工作的子进程, ...

  3. 02 - nginx - 反向代理、限速

    一.Nginx反向代理 代理服务器,客户机在发送请求时,不会直接发送给目的主机,而是先发送给代理服务器. 代理服务接受客户机请求之后,再向主机发出,并接收目的主机返回的数据,存放在代理服务器的硬盘中, ...

  4. nginx信号量

    nginx信号说明相关说明 信号名称 作用 TERM,INT 快速关闭 QUIT 从容关闭 HUP 重新加载配置,用新的配置开始新的工作进程,从容关闭旧的工作进程 USR1 重新打开日志文件 USR2 ...

  5. 02 . Nginx平滑升级和虚拟主机

    Nginx虚拟主机 在真实的服务器环境,为了充分利用服务器资源,一台nginx web服务器会同时配置N个虚拟主机,这样可以充分利用服务器的资源,方便管理员的统一管理 配置nginx虚拟主机有三种方法 ...

  6. nginx反向代理+负载均衡+url重写+ssl认证

      Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器.Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄 ...

  7. 从刚刚「简书」平台的短暂异常,谈Nginx An error occurred报错~

    09.26简书平台的短暂异常 An error occurred. Sorry, the page you are looking for is currently unavailable. Plea ...

  8. 使用Nginx和Logstash以及kafka来实现网站日志采集的详细步骤和过程

    使用Nginx和Logstash以及kafka来实现网站日志采集的详细步骤和过程 先列出来总体启动流程: (1)启动zookeeper集群(hadoop01.hadoop02和hadoop03这3台机 ...

  9. nginx 基础文档

    Nginx基础 1.  nginx安装 2.  nginx 编译参数详解 3.  nginx安装配置+清缓存模块安装 4.  nginx+PHP 5.5 5.  nginx配置虚拟主机 6.  ngi ...

  10. [nginx] 网上最全面nginx教程(近100篇文章整理)

    转载:http://bbs.linuxtone.org/thread-25588-1-1.html Nginx基础 1.  nginx安装 2.  nginx 编译参数详解 3.  nginx安装配置 ...

随机推荐

  1. pgrep 和 pkill 使用小记

    在停止指定进程时,经常使用如下命令: kill `ps aux | grep -w program_name | grep -v grep | awk '{print $2}'` 使用 pgrep 和 ...

  2. asp.net core microservices 架构之eureka服务发现

    一 简介 微服务将需多的功能拆分为许多的轻量级的子应用,这些子应用相互调度.好处就是轻量级,完全符合了敏捷开发的精神.我们知道ut(单元测试),不仅仅提高我们的程序的健壮性,而且可以强制将类和方法的设 ...

  3. Tornado输出和响应头

    1.输出 再来看看输出`write`,实际上,`write`并没有直接把数据返回给前端,而是先写到缓存区,函数结束之后才会返回到前端,我们验证如下 class FlushHandler(tornado ...

  4. 6 字典和集合——《Swift3.0从入门到出家》

    字典和集合 字典 字典是集合类型存放多个键值对,其中键是唯一的,不能重复 字典中存放的键值对是无序的,写入的顺序和读取的顺序可能不同 字典中存放的数据是任意类型 字典可以分为可变字典和不可变字典 创建 ...

  5. 4 字符串 Swift/Objective -C ——《Swift3.0从入门到出家》

    4 字符串   Swift and Object-C 字符串由多个字符组成,使用 “” 引起的内容 swift语言中提供了两种字符串:可变字符串和不可变字符串 可变字符串:字符串的内容可以修改,字符串 ...

  6. POJ1742:Coins

    浅谈\(DP\):https://www.cnblogs.com/AKMer/p/10437525.html 题目传送门:http://poj.org/problem?id=1742 多重背包,每个物 ...

  7. unidac使用演示

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  8. TCP,你懂的

    TCP(Transmission Control Protocol 传输控制协议)是一种面向连接(连接导向)的.可靠的. 基于IP的传输层协议.TCP在IP报文的协议号是6.TCP是一个超级麻烦的协议 ...

  9. Vue.js:事件处理器

    ylbtech-Vue.js:事件处理器 1.返回顶部 1. Vue.js 事件处理器 事件监听可以使用 v-on 指令: v-on <div id="app"> &l ...

  10. phpmailer绑定邮箱

    1.配置 <?php return array ( 'email_host' => 'smtp.aliyun.com', 'email_port' => '25', 'email_u ...