1个master模型,1个或多个worker进程,这种工作机制能够稳定,灵活的运行,master进程主要监视进程, 不处理具体业务,专门用来管理监控worker进程工作,master和work通信使用共享内存和信号,
2、调整work进程数量
多少个worker进程合适?多核计算机,就让每个worker跑在一个单核上,最大程度减少cpu进程切换成本,提高系统效率
// 查看processor数量
grep -c processor /proc/cpuinfo
// 通过修改虚拟机将processor数量修改成4
// 修改nginx配置文件将,worker线程修改成4
cd /usr/local/nginx/conf
vim nginx.conf
// 查看nginx进程
ps -ef | grep nginx
3、nginx启动参数说明
// 不停机,重新加载配置文件
./nginx -s reload
// 关闭nginx
./nginx -s stop // 粗暴退出
./nginx -s quit // 优雅退出
1、vm虚拟机共享目录消失解决
// 自定义查看进程显示方式
ps -eo pid,ppid,sid,tty,pgrp,comm, | grep -E 'bash|PID|nginx'
2、strace工具使用
linux系统调试工具,可以跟踪进程的系统调用,以及接收到的信号
// 现在分别监控bash这个窗口进程,和这个bash下运行的nginx,然后关闭这个bash
strace -e trace=signal -p 29517
strace -e trace=signal -p 28998
可以看到,先发送信号SIGHUP这个信号给,-29517的绝对值所在进程组,所以nginx这个程序就收到了这个信号
这个bash先发生SIGHUP这个信号给同一个session里面的所有进程,然后发给自己
设想:
1、nginx进程拦截SIGHUP信号,
2、nginx进程和bash不在同一个session里(需要创建一个新的session id,进程组组长不能调用setsid)
3、通过setsid ./nginx启动程序,他的父进程是1老祖宗进程
4、nohup(no hang up不要挂断)用该命令启动进程跟上面忽略SIGHUP信号一样,该命令会将输出重定向当前目录的nohup.out下
1、设想1实现
// 在代码中加入此行代码,忽略这个信号,不做处理
signal(SIGHUP,SIG_IGN);
2、设想2实现
#include
#include
#include
int main()
{
pid_t pid = fork();
if(pid==0)
{
setsid();
while(true)
{
printf("hello world\n");
sleep(1);
}
}
else
{
printf("父进程\n");
while(1) sleep(1);
}
return 0;
}