禅与计算机 禅与计算机
首页
  • Java基础

    • 聊一聊java一些核心知识点
    • 聊聊java面向对象核心知识点
    • 聊聊Java中的异常
    • 聊聊Java中的常用类String
    • 万字长文带你细聊Java注解本质
    • 来聊聊Java的反射机制
    • 深入解析Java泛型的魅力与机制
    • Java集合框架深度解析与面试指南
    • Java常用集合类HashMap深度解析
    • LinkedHashMap源码到面试题的全解析
    • 深入解析CopyOnWriteArrayList的工作机制
    • Java基础IO总结
    • Java三大IO模型小结
    • Java BIO NIO AIO详解
    • Java进阶NIO之IO多路复用详解
    • Java8流式编程入门
    • 一文速通lambda与函数式编程
    • Java8函数式方法引用最佳实践
  • Java并发编程

    • Java并发编程基础小结
    • 深入理解Java中的final关键字
    • 浅谈Java并发安全发布技术
    • 浅谈Java并发编程中断的哲学
    • Java线程池知识点小结
    • 浅谈Java线程池中拒绝策略与流控的艺术
    • synchronized关键字使用指南
    • 深入源码解析synchronized关键字
    • 详解JUC包下的锁
    • 详解并发编程中的CAS原子类
    • LongAdder源码分析
    • AQS源码解析
    • 深入剖析Java并发编程中的死锁问题
    • Java并发容器总结
    • 详解Java并发编程volatile关键字
    • 并发编程ThreadLocal必知必会
    • CompletableFuture基础实践小结
    • CompletableFuture异步多任务最佳实践
    • 硬核详解FutureTask设计与实现
    • 线程池大小设置的底层逻辑与场景化方案
    • 来聊一个有趣的限流器RateLimiter
  • JVM相关

    • 从零开始掌握 JVM
    • JVM核心知识点小结
    • JVM指令集概览:基础与应用
    • JVM类加载器深度解析
    • JVM方法区深度解析
    • Java内存模型JMM详解
    • Java对象大小的精确计算方法
    • 逃逸分析在Java中的应用与优化
    • 从零开始理解JVM的JIT编译机制
    • G1垃圾回收器:原理详解与调优指南
    • JVM故障排查实战指南
    • JVM内存问题排错最佳实践
    • JVM内存溢出排查指南
    • 简明的Arthas使用教程
    • 简明的Arthas配置及基础运维教程
    • 基于Arthas Idea的JVM故障排查与指令生成
    • 基于arthas量化监控诊断java应用方法论与实践
    • 深入剖析arthas技术原理
  • 深入理解Spring框架

    • Spring 核心知识点全面解析
    • Spring核心功能IOC详解
    • Spring AOP 深度剖析与实践
    • Spring 三级缓存机制深度解析
    • 深入 Spring 源码,剖析设计模式的落地实践
    • 探索 Spring 事务的奥秘
    • 深入解析Spring Bean的生命周期管理
    • 解读 Spring Boot 核心知识点
    • Spring Boot 启动优化实战:1分钟到13秒的排查与优化之路
    • Spring Boot自动装配原理及实践
    • 一文快速上手Sharding-JDBC
    • sharding-jdbc如何实现分页查询
    • 基于DynamicDataSource整合分库分表框架Shardingsphere
  • 计算机组成原理

    • 计算机硬件知识小结
    • CPU核心知识点小结
    • 浅谈CPU流水线的艺术
    • 从Java程序员视角聊聊CPU缓存
    • CPU任务调度和伪共享问题小结
    • CPU MESI缓存一致性协议
    • CPU内存管理机制
    • 内存深度解析
    • 磁盘存储原理
    • 详解计算机启动步骤
    • CPU南北桥架构与发展史
    • CPU中断机制与硬件交互详解
  • 操作系统

    • 如何实现一个高性能服务器
    • Linux文件结构与文件权限
    • Linux常见压缩指令小结
    • Linux核心系统调用详解
    • Linux进程管理
    • Linux线程管理
    • 进程与线程深度解析
    • Linux进程间通信机制
    • 零拷贝技术原理与实践
    • CPU缓存一致性问题深度解析
    • IO任务与CPU调度艺术
  • 计算机网络

    • 网卡通信原理详解
    • 网卡数据包处理指南
    • 基于抓包详解TCP协议
  • 编码最佳实践

    • 浅谈现代软件工程TDD最佳实践
    • 浅谈TDD模式下并发程序设计与实现
    • 面向AI编程新范式Trae后端开发环境搭建与实践
    • 基于提示词工程的Redis签到功能开发实践
    • 基于Vibe Coding的Redis分页查询实现
    • 告别AI无效对话:资深工程师的提示词设计最佳实践
  • 实用技巧与配置

    • Mac常用快捷键与效率插件指南
    • Keynote技术科普短视频制作全攻略
  • 写作

    • 写好技术博客的5大核心原则:从认知科学到AI工具的全流程指南
  • 开发工具

    • IDEA配置详解与高效使用指南
  • Nodejs
  • 博客搭建
  • Redis

    • Redis核心知识小结
    • 解锁Redis发布订阅模式
    • 掌握Redis事务
    • Redis主从复制技术
    • Redis的哨兵模式详解
    • 深度剖析Redisson分布式锁
    • 详解redis单线程设计思路
    • 来聊聊Redis所实现的Reactor模型
    • Redis RDB持久化源码深度解析
    • 来聊聊redis的AOF写入
    • 来聊聊Redis持久化AOF管道通信的设计
    • 来聊聊redis集群数据迁移
    • Redis SDS动态字符串深度解析
    • 高效索引的秘密:redis跳表设计与实现
    • 聊聊redis中的字典设计与实现
  • MySQL

    • MySQL基础知识点小结
    • 解读MySQL 索引基础
    • MySQL 索引进阶指南
    • 解读MySQL Explain关键字
    • 探秘 MySQL 锁:原理与实践
    • 详解MySQL重做日志redolog
    • 详解undoLog在MySQL MVCC中的运用
    • MySQL二进制日志binlog核心知识点
    • MySQL高效插入数据的最佳实践
    • MySQL分页查询优化指南
    • MySQL流式查询的奥秘与应用解析
    • 来聊聊分库分表
    • 来聊聊大厂常用的分布式ID生成方案
  • ElasticSearch

    • 从Lucene到Elasticsearch:进化之路
    • ES 基础使用指南
    • ElasticSearch如何写入一篇文档
    • 深入剖析Elasticsearch文档读取原理
    • 聊聊ElasticSearch性能调优
    • Spring借助Easy-Es操作ES
  • Netty

    • 一文快速了解高性能网络通信框架Netty
    • Netty网络传输简记
    • 来聊聊Netty的ByteBuf
    • 来聊聊Netty消息发送的那些事
    • 解密Netty高性能之谜:NioEventLoop线程池阻塞分析
    • 详解Netty中的责任链Pipeline如何管理ChannelHandler
    • Netty Reactor模型常见知识点小结
    • Netty如何驾驭TCP流式传输?粘包拆包问题全解
    • Netty解码器源码解析
  • 消息队列

    • 一文快速入门消息队列
    • 消息队列RocketMQ入门指南
    • 基于RocketMQ实现分布式事务
    • RocketMQ容器化最佳实践
    • RocketMQ常见问题与深度解析
    • Kafka快速安装与使用指南
  • Nginx

    • Linux下的nginx安装
    • Nginx基础入门总结
    • Nginx核心指令小结
    • Nginx进程结构与核心模块初探
    • Nginx应用进阶HTTP核心模块配置
    • Nginx缓存及HTTPS配置小记
    • nginx高可用实践简记
    • Nginx性能优化
  • 微服务基础

    • 微服务基础知识小结
    • 分布式事务核心概念小结
    • OpenFeign核心知识小结
    • 微服务组件Gateway核心使用小结
    • 分布式事务Seata实践
    • 用 Docker Compose 完成 Seata 的整合部署
  • Nacos

    • Nacos服务注册原理全解析
    • Nacos服务订阅流程全解析
    • Nacos服务变更推送流程全解析
    • 深入解析SpringCloud负载均衡器Loadbalancer
    • Nacos源码环境搭建与调试指南
  • Seata

    • 深度剖析Seata源码
  • Docker部署

    • 一文快速掌握docker的理念和基本使用
    • 使用docker编排容器
    • 基于docker-compose部署微服务基本环境
    • 基于docker容器化部署微服务
    • Gateway全局异常处理及请求响应监控
    • Docker图形化界面工具Portainer最佳实践
  • Go基础

    • 一文带你速通Go语言基础语法
    • 一文快速掌握Go语言切片
    • 来聊聊go语言的hashMap
    • 一文速通go语言类型系统
    • 浅谈Go语言中的面向对象
    • go语言是如何实现协程的
    • 聊聊go语言中的GMP模型
    • 极简的go语言channel入门
    • 聊聊go语言基于epoll的网络并发实现
    • 写给Java开发的Go语言协程实践
  • mini-redis实战

    • 来聊聊我用go手写redis这件事
    • mini-redis如何解析处理客户端请求
    • 实现mini-redis字符串操作
    • 硬核复刻redis底层双向链表核心实现
    • 动手复刻redis之go语言下的字典的设计与落地
    • Go 语言下的 Redis 跳表设计与实现
    • Go 语言版 Redis 有序集合指令复刻探索
  • 项目编排

    • Spring脚手架创建简记
    • Spring脚手架集成分页插件
    • Spring脚手架集成校验框架
    • maven父子模块两种搭建方式简记
    • SpringBoot+Vue3前后端快速整合入门
    • 来聊聊Java项目分层规范
  • 场景设计

    • Java实现文件分片上传
    • 基于时间缓存优化浏览器轮询阻塞问题
    • 基于EasyExcel实现高效导出
    • 10亿数据高效插入MySQL最佳方案
    • 从开源框架中学习那些实用的位运算技巧
  • CI/CD

    • 基于NETAPP实现内网穿透
    • 基于Gitee实现Jenkins自动化部署SpringBoot项目
    • Jenkins离线安装部署教程简记
    • 基于Nexus搭建Maven私服基础入门
    • 基于内网的Jenkins整合gitlab综合方案简记
  • 监控方法论

    • SpringBoot集成Prometheus与Grafana监控
    • Java监控度量Micrometer全解析
    • 从 micrometer计量器角度快速上手promQL
    • 硬核安利一个监控告警开源项目Nightingale
  • Spring AI

    • Spring AI Alibaba深度实战:一文掌握智能体开发全流程
    • Spring AI Alibaba实战:JVM监控诊断Arthas Agent的工程化构建与最佳实践
  • 大模型评测

    • M2.7 真能打!我用两个真实场景测了测,结果有点意外
    • Qoder JetBrains插件评测:祖传代码重构与接口优化实战
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

sharkchili

计算机禅修者
首页
  • Java基础

    • 聊一聊java一些核心知识点
    • 聊聊java面向对象核心知识点
    • 聊聊Java中的异常
    • 聊聊Java中的常用类String
    • 万字长文带你细聊Java注解本质
    • 来聊聊Java的反射机制
    • 深入解析Java泛型的魅力与机制
    • Java集合框架深度解析与面试指南
    • Java常用集合类HashMap深度解析
    • LinkedHashMap源码到面试题的全解析
    • 深入解析CopyOnWriteArrayList的工作机制
    • Java基础IO总结
    • Java三大IO模型小结
    • Java BIO NIO AIO详解
    • Java进阶NIO之IO多路复用详解
    • Java8流式编程入门
    • 一文速通lambda与函数式编程
    • Java8函数式方法引用最佳实践
  • Java并发编程

    • Java并发编程基础小结
    • 深入理解Java中的final关键字
    • 浅谈Java并发安全发布技术
    • 浅谈Java并发编程中断的哲学
    • Java线程池知识点小结
    • 浅谈Java线程池中拒绝策略与流控的艺术
    • synchronized关键字使用指南
    • 深入源码解析synchronized关键字
    • 详解JUC包下的锁
    • 详解并发编程中的CAS原子类
    • LongAdder源码分析
    • AQS源码解析
    • 深入剖析Java并发编程中的死锁问题
    • Java并发容器总结
    • 详解Java并发编程volatile关键字
    • 并发编程ThreadLocal必知必会
    • CompletableFuture基础实践小结
    • CompletableFuture异步多任务最佳实践
    • 硬核详解FutureTask设计与实现
    • 线程池大小设置的底层逻辑与场景化方案
    • 来聊一个有趣的限流器RateLimiter
  • JVM相关

    • 从零开始掌握 JVM
    • JVM核心知识点小结
    • JVM指令集概览:基础与应用
    • JVM类加载器深度解析
    • JVM方法区深度解析
    • Java内存模型JMM详解
    • Java对象大小的精确计算方法
    • 逃逸分析在Java中的应用与优化
    • 从零开始理解JVM的JIT编译机制
    • G1垃圾回收器:原理详解与调优指南
    • JVM故障排查实战指南
    • JVM内存问题排错最佳实践
    • JVM内存溢出排查指南
    • 简明的Arthas使用教程
    • 简明的Arthas配置及基础运维教程
    • 基于Arthas Idea的JVM故障排查与指令生成
    • 基于arthas量化监控诊断java应用方法论与实践
    • 深入剖析arthas技术原理
  • 深入理解Spring框架

    • Spring 核心知识点全面解析
    • Spring核心功能IOC详解
    • Spring AOP 深度剖析与实践
    • Spring 三级缓存机制深度解析
    • 深入 Spring 源码,剖析设计模式的落地实践
    • 探索 Spring 事务的奥秘
    • 深入解析Spring Bean的生命周期管理
    • 解读 Spring Boot 核心知识点
    • Spring Boot 启动优化实战:1分钟到13秒的排查与优化之路
    • Spring Boot自动装配原理及实践
    • 一文快速上手Sharding-JDBC
    • sharding-jdbc如何实现分页查询
    • 基于DynamicDataSource整合分库分表框架Shardingsphere
  • 计算机组成原理

    • 计算机硬件知识小结
    • CPU核心知识点小结
    • 浅谈CPU流水线的艺术
    • 从Java程序员视角聊聊CPU缓存
    • CPU任务调度和伪共享问题小结
    • CPU MESI缓存一致性协议
    • CPU内存管理机制
    • 内存深度解析
    • 磁盘存储原理
    • 详解计算机启动步骤
    • CPU南北桥架构与发展史
    • CPU中断机制与硬件交互详解
  • 操作系统

    • 如何实现一个高性能服务器
    • Linux文件结构与文件权限
    • Linux常见压缩指令小结
    • Linux核心系统调用详解
    • Linux进程管理
    • Linux线程管理
    • 进程与线程深度解析
    • Linux进程间通信机制
    • 零拷贝技术原理与实践
    • CPU缓存一致性问题深度解析
    • IO任务与CPU调度艺术
  • 计算机网络

    • 网卡通信原理详解
    • 网卡数据包处理指南
    • 基于抓包详解TCP协议
  • 编码最佳实践

    • 浅谈现代软件工程TDD最佳实践
    • 浅谈TDD模式下并发程序设计与实现
    • 面向AI编程新范式Trae后端开发环境搭建与实践
    • 基于提示词工程的Redis签到功能开发实践
    • 基于Vibe Coding的Redis分页查询实现
    • 告别AI无效对话:资深工程师的提示词设计最佳实践
  • 实用技巧与配置

    • Mac常用快捷键与效率插件指南
    • Keynote技术科普短视频制作全攻略
  • 写作

    • 写好技术博客的5大核心原则:从认知科学到AI工具的全流程指南
  • 开发工具

    • IDEA配置详解与高效使用指南
  • Nodejs
  • 博客搭建
  • Redis

    • Redis核心知识小结
    • 解锁Redis发布订阅模式
    • 掌握Redis事务
    • Redis主从复制技术
    • Redis的哨兵模式详解
    • 深度剖析Redisson分布式锁
    • 详解redis单线程设计思路
    • 来聊聊Redis所实现的Reactor模型
    • Redis RDB持久化源码深度解析
    • 来聊聊redis的AOF写入
    • 来聊聊Redis持久化AOF管道通信的设计
    • 来聊聊redis集群数据迁移
    • Redis SDS动态字符串深度解析
    • 高效索引的秘密:redis跳表设计与实现
    • 聊聊redis中的字典设计与实现
  • MySQL

    • MySQL基础知识点小结
    • 解读MySQL 索引基础
    • MySQL 索引进阶指南
    • 解读MySQL Explain关键字
    • 探秘 MySQL 锁:原理与实践
    • 详解MySQL重做日志redolog
    • 详解undoLog在MySQL MVCC中的运用
    • MySQL二进制日志binlog核心知识点
    • MySQL高效插入数据的最佳实践
    • MySQL分页查询优化指南
    • MySQL流式查询的奥秘与应用解析
    • 来聊聊分库分表
    • 来聊聊大厂常用的分布式ID生成方案
  • ElasticSearch

    • 从Lucene到Elasticsearch:进化之路
    • ES 基础使用指南
    • ElasticSearch如何写入一篇文档
    • 深入剖析Elasticsearch文档读取原理
    • 聊聊ElasticSearch性能调优
    • Spring借助Easy-Es操作ES
  • Netty

    • 一文快速了解高性能网络通信框架Netty
    • Netty网络传输简记
    • 来聊聊Netty的ByteBuf
    • 来聊聊Netty消息发送的那些事
    • 解密Netty高性能之谜:NioEventLoop线程池阻塞分析
    • 详解Netty中的责任链Pipeline如何管理ChannelHandler
    • Netty Reactor模型常见知识点小结
    • Netty如何驾驭TCP流式传输?粘包拆包问题全解
    • Netty解码器源码解析
  • 消息队列

    • 一文快速入门消息队列
    • 消息队列RocketMQ入门指南
    • 基于RocketMQ实现分布式事务
    • RocketMQ容器化最佳实践
    • RocketMQ常见问题与深度解析
    • Kafka快速安装与使用指南
  • Nginx

    • Linux下的nginx安装
    • Nginx基础入门总结
    • Nginx核心指令小结
    • Nginx进程结构与核心模块初探
    • Nginx应用进阶HTTP核心模块配置
    • Nginx缓存及HTTPS配置小记
    • nginx高可用实践简记
    • Nginx性能优化
  • 微服务基础

    • 微服务基础知识小结
    • 分布式事务核心概念小结
    • OpenFeign核心知识小结
    • 微服务组件Gateway核心使用小结
    • 分布式事务Seata实践
    • 用 Docker Compose 完成 Seata 的整合部署
  • Nacos

    • Nacos服务注册原理全解析
    • Nacos服务订阅流程全解析
    • Nacos服务变更推送流程全解析
    • 深入解析SpringCloud负载均衡器Loadbalancer
    • Nacos源码环境搭建与调试指南
  • Seata

    • 深度剖析Seata源码
  • Docker部署

    • 一文快速掌握docker的理念和基本使用
    • 使用docker编排容器
    • 基于docker-compose部署微服务基本环境
    • 基于docker容器化部署微服务
    • Gateway全局异常处理及请求响应监控
    • Docker图形化界面工具Portainer最佳实践
  • Go基础

    • 一文带你速通Go语言基础语法
    • 一文快速掌握Go语言切片
    • 来聊聊go语言的hashMap
    • 一文速通go语言类型系统
    • 浅谈Go语言中的面向对象
    • go语言是如何实现协程的
    • 聊聊go语言中的GMP模型
    • 极简的go语言channel入门
    • 聊聊go语言基于epoll的网络并发实现
    • 写给Java开发的Go语言协程实践
  • mini-redis实战

    • 来聊聊我用go手写redis这件事
    • mini-redis如何解析处理客户端请求
    • 实现mini-redis字符串操作
    • 硬核复刻redis底层双向链表核心实现
    • 动手复刻redis之go语言下的字典的设计与落地
    • Go 语言下的 Redis 跳表设计与实现
    • Go 语言版 Redis 有序集合指令复刻探索
  • 项目编排

    • Spring脚手架创建简记
    • Spring脚手架集成分页插件
    • Spring脚手架集成校验框架
    • maven父子模块两种搭建方式简记
    • SpringBoot+Vue3前后端快速整合入门
    • 来聊聊Java项目分层规范
  • 场景设计

    • Java实现文件分片上传
    • 基于时间缓存优化浏览器轮询阻塞问题
    • 基于EasyExcel实现高效导出
    • 10亿数据高效插入MySQL最佳方案
    • 从开源框架中学习那些实用的位运算技巧
  • CI/CD

    • 基于NETAPP实现内网穿透
    • 基于Gitee实现Jenkins自动化部署SpringBoot项目
    • Jenkins离线安装部署教程简记
    • 基于Nexus搭建Maven私服基础入门
    • 基于内网的Jenkins整合gitlab综合方案简记
  • 监控方法论

    • SpringBoot集成Prometheus与Grafana监控
    • Java监控度量Micrometer全解析
    • 从 micrometer计量器角度快速上手promQL
    • 硬核安利一个监控告警开源项目Nightingale
  • Spring AI

    • Spring AI Alibaba深度实战:一文掌握智能体开发全流程
    • Spring AI Alibaba实战:JVM监控诊断Arthas Agent的工程化构建与最佳实践
  • 大模型评测

    • M2.7 真能打!我用两个真实场景测了测,结果有点意外
    • Qoder JetBrains插件评测:祖传代码重构与接口优化实战
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Netty

  • 消息队列

  • Nginx

    • Linux下的nginx安装
    • Nginx基础入门总结
    • Nginx核心指令小结
    • Nginx进程结构与核心模块初探
      • nginx进程结构
      • nginx与Linux进程管理
        • Linux进程管理命令与参数
      • 实践-修改nginx进程数
        • 直接操作worker进程(不推荐,略)
        • 用master管理nginx进程
        • 用命令行管理nginx进程
      • nginx配置重载
        • 配置文件重载的原理
        • 演示nginx热部署加载新配置
        • 演示nginx进程回滚
      • nginx模块化设计
      • nginx编译安装配置参数
        • 简介
        • 自定义安装nginx
      • nginx文件配置结构
      • 虚拟主机分类
        • 分类
        • 基于多网卡虚拟主机实现
        • 基于端口的虚拟主机实现
        • 基于域名的虚拟主机实现
      • 参考文献
    • Nginx应用进阶HTTP核心模块配置小结
    • Nginx缓存及HTTPS配置小记
    • nginx高可用实践简记
    • Nginx性能优化
  • 中间件
  • Nginx
sharkchili
2023-09-05
目录

Nginx进程结构与核心模块初探

# nginx进程结构

nginx是多进程结构,并不是多线程结构,之所以这样设计的原因是因为多线程内存空间是共享的,一旦一个线程崩溃可能导致整个进程崩溃,所以nginx的设计者就将nginx设计为多进程结构。

在这里插入图片描述

# nginx与Linux进程管理

# Linux进程管理命令与参数

杀死进程的命令如下所示:

kill -数字或者字母(参考下表) pid
1

注意:kill后面需要跟一个参数,对应参数的数字含义如下,以笔者日常使用为例,基本使用-9。

1) SIGHUP 本信号在用户终端连接(正常或非正常)结束时发出, 通常是在终端的控制进程结束时, 通知同一session内的各个作业, 这时它们与控制终端不再关联.

2) SIGINT 程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl+C)时发出

3) SIGQUIT 和 SIGINT类似, 但由QUIT字符(通常是Ctrl+\)来控制. 进程在因收到 SIGQUIT 退出时会产生core文件, 在这个意义上类似于一个程序错误信号.

4) SIGILL 执行了非法指令. 通常是因为可执行文件本身出现错误, 或者试图执行数据段. 堆栈溢出时也有可能产生这个信号.

5) SIGTRAP 由断点指令或其它trap指令产生. 由debugger使用.

6) SIGABRT 程序自己发现错误并调用abort时产生.

6) SIGIOT 在PDP-11上由iot指令产生, 在其它机器上和SIGABRT一样.

7) SIGBUS 非法地址, 包括内存地址对齐(alignment)出错. eg: 访问一个四个字长的整数, 但其地址不是4的倍数.

8) SIGFPE 在发生致命的算术运算错误时发出. 不仅包括浮点运算错误, 还包括溢出及除数为0等其它所有的算术的错误.

9) SIGKILL 用来立即结束程序的运行. 本信号不能被阻塞, 处理和忽略.

10) SIGUSR1 留给用户使用

11) SIGSEGV 试图访问未分配给自己的内存, 或试图往没有写权限的内存地址写数据.

12) SIGUSR2 留给用户使用

13) SIGPIPE Broken pipe

14) SIGALRM 时钟定时信号, 计算的是实际的时间或时钟时间. alarm函数使用该信号.

15) SIGTERM 程序结束(terminate)信号, 与SIGKILL不同的是该信号可以被阻塞和处理. 通常用来要求程序自己正常退出. shell命令kill缺省产生这个信号.

17) SIGCHLD 子进程结束时, 父进程会收到这个信号.

18) SIGCONT 让一个停止(stopped)的进程继续执行. 本信号不能被阻塞. 可以用一个handler来让程序在由stopped状态变为继续执行时完成特定的工作. 例如, 重新显示提示符

19) SIGSTOP 停止(stopped)进程的执行. 注意它和terminate以及interrupt的区别:该进程还未结束, 只是暂停执行. 本信号不能被阻塞, 处理或忽略.

20) SIGTSTP 停止进程的运行, 但该信号可以被处理和忽略. 用户键入SUSP字符时(通常是Ctrl+Z)发出这个信号

21) SIGTTIN 当后台作业要从用户终端读数据时, 该作业中的所有进程会收到SIGTTIN信号. 缺省时这些进程会停止执行.

22) SIGTTOU 类似于SIGTTIN, 但在写终端(或修改终端模式)时收到.

23) SIGURG 有"紧急"数据或out-of-band数据到达socket时产生.

24) SIGXCPU 超过CPU时间资源限制. 这个限制可以由getrlimit/setrlimit来读取/改变

25) SIGXFSZ 超过文件大小资源限制.

26) SIGVTALRM 虚拟时钟信号. 类似于SIGALRM, 但是计算的是该进程占用的CPU时间.

27) SIGPROF 类似于SIGALRM/SIGVTALRM, 但包括该进程用的CPU时间以及系统调用的时间.

28) SIGWINCH 窗口大小改变时发出.

29) SIGIO 文件描述符准备就绪, 可以开始进行输入/输出操作.

30) SIGPWR Power failure
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59

# 实践-修改nginx进程数

# 直接操作worker进程(不推荐,略)

# 用master管理nginx进程

我们的nginx.conf的worker_processes 为1,我们希望修改后通过master让其重新加载配置,首先我们需要键入如下命令确认worker进程数,可以看到当前只有1个worker进程

[root@localhost conf]# ps -ef |grep nginx |grep -v grep
root     27871     1  0 7月16 ?       00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
root     30259 27871  0 13:41 ?        00:00:00 nginx: worker process
1
2
3

随后我们使用vim修改 worker_processes 1; 改为 worker_processes auto;


[root@localhost conf]# vim nginx.conf
1
2

利用master将其重启

[root@localhost conf]# kill -1 27871
1

再次查看nginx进程数就会发现,worker值和CPU核心数一样。

[root@localhost conf]# ps -ef |grep nginx |grep -v grep
root     27871     1  0 7月16 ?       00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
root     30259 27871  0 13:41 ?        00:00:00 nginx: worker process
root     30260 27871  0 13:41 ?        00:00:00 nginx: worker process
root     30261 27871  0 13:41 ?        00:00:00 nginx: worker process
root     30262 27871  0 13:41 ?        00:00:00 nginx: worker process
1
2
3
4
5
6

# 用命令行管理nginx进程

同样的我们也可以使用命令行来管理nginx进程,这种方式其实更加常用,我们将worker_processes 还原为1,使用nginx -s reload可完成nginx配置重载,起到和signup同样的作用(实际上底层也是通过master完成配置重载)。

可以看到修改前 worker进程数为4。


[root@localhost conf]# ps -ef |grep nginx |grep -v grep
root     27871     1  0 7月16 ?       00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
root     30259 27871  0 13:41 ?        00:00:00 nginx: worker process
root     30260 27871  0 13:41 ?        00:00:00 nginx: worker process
root     30261 27871  0 13:41 ?        00:00:00 nginx: worker process
root     30262 27871  0 13:41 ?        00:00:00 nginx: worker process

1
2
3
4
5
6
7
8

将worker process改为1,并用nginx命令重载


[root@localhost conf]# vim nginx.conf
[root@localhost conf]# ../sbin/nginx -s reload

1
2
3
4

再次使用grep查看,可以看到配置生效了。

[root@localhost conf]# ps -ef |grep nginx |grep -v grep
root     27871     1  0 7月16 ?       00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
root     30494 27871  0 13:46 ?        00:00:00 nginx: worker process

1
2
3
4

# nginx配置重载

# 配置文件重载的原理

  1. 修改nginx.conf,向master发送hup或者reload信号,通知配置重载。
  2. master检查语法配置是否正确。
  3. master打开监听端口。
  4. 创建新的worker进程
  5. 向旧的worker发出QUIT信号
  6. 旧的worker关闭监听句柄,处理完手头的请求退出,新的worker处理新的请求。

在这里插入图片描述

# 演示nginx热部署加载新配置

步骤以及工作过程

  1. 将旧的nginx换成新的nginx文件
  2. 将master发送usr2信号
  3. master修改pid文件,原本的pid文件后缀变为oldbin
  4. master用新的nginx文件启动nginx进程
  5. 向旧的master进程发送winch信号,旧的worker进程退出
  6. 若需要回滚,则向旧的master发送HUP,将新的master杀死

首先备份nginx配置文件。


[root@localhost sbin]# cp nginx nginx.bak
[root@localhost sbin]# ll
总用量 6848
-rwxr-xr-x. 1 root root 3503640 4月  21 11:24 nginx
-rwxr-xr-x. 1 root root 3503640 7月  17 14:00 nginx.bak
1
2
3
4
5
6

查看nginx进程,确定此时的worker数为1。

[root@localhost sbin]# ps -ef |grep nginx |grep -v grep
root     27871     1  0 7月16 ?       00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
root     30494 27871  0 13:46 ?        00:00:00 nginx: worker process
1
2
3

使用SIGUSR2 保留旧的nginx进程启动新的nginx进程,如下所示,可以看到有启动了几个新的worker,而旧的worker还没有消失。

[root@localhost sbin]# kill -s SIGUSR2 27871
[root@localhost sbin]# ps -ef |grep nginx |grep -v grep
root     27871     1  0 7月16 ?       00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
root     30494 27871  0 13:46 ?        00:00:00 nginx: worker process
root     31350 27871  0 14:03 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
root     31351 31350  0 14:03 ?        00:00:00 nginx: worker process
1
2
3
4
5
6

此时查看log目录,可以看到27871这个旧的进程的pid文件后缀变为oldbin,查看这个文件可以定位到旧的worker进程pid。

[root@localhost sbin]# cat ../logs/nginx.pid.oldbin
27871
1
2

向旧的master进程发送winch信号,旧的worker进程退出

[root@localhost sbin]# kill -s SIGWINCH 27871
[root@localhost sbin]# ps -ef |grep nginx |grep -v grep
root     27871     1  0 7月16 ?       00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
root     31350 27871  0 14:03 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
root     31351 31350  0 14:03 ?        00:00:00 nginx: worker process

1
2
3
4
5
6

基于这个值,我们可以杀死旧的master的子进程


[root@localhost sbin]# kill -s SIGQUIT 27871
[root@localhost sbin]# ps -ef |grep nginx |grep -v grep
root     31350     1  0 14:03 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
root     31351 31350  0 14:03 ?        00:00:00 nginx: worker process
1
2
3
4
5

# 演示nginx进程回滚

首先我们查看nginx进程,确定worker数量。


[root@localhost sbin]# ps -ef |grep nginx |grep -v grep
root     31350     1  0 14:03 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
root     31351 31350  0 14:03 ?        00:00:00 nginx: worker process
1
2
3
4

佳玉下面这段命令演示用户定义信号2加载新配置过程


[root@localhost sbin]# kill -s SIGUSR2 31350
1
2

可以看到加载了新的worker


[root@localhost sbin]# ps -ef |grep nginx |grep -v grep
root     31350     1  0 14:03 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
root     31351 31350  0 14:03 ?        00:00:00 nginx: worker process
root     31822 31350  0 14:13 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
root     31823 31822  0 14:13 ?        00:00:00 nginx: worker process
1
2
3
4
5
6

此时发现新的进程有问题,我们只需hup旧的worker,退出新的worker进程即可。


[root@localhost sbin]# kill -s SIGHUP 31350
[root@localhost sbin]# kill -s SIGQUIT 31822
1
2
3

可以看到新的master就被杀死了


[root@localhost sbin]# ps -ef |grep nginx |grep -v grep
root     31350     1  0 14:03 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
root     31351 31350  0 14:03 ?        00:00:00 nginx: worker process
root     31856 31350  0 14:13 ?        00:00:00 nginx: worker process

1
2
3
4
5
6

# nginx模块化设计

nginx常见和核心模块和第三方模块如下:

  1. 核心模块:核心模块是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录、配置文件解析、事件驱动机制、进程管理等核心功能。
  2. 标准 HTTP 模块:标准 HTTP 模块提供 HTTP 协议解析相关的功能,如:端口配置、网页编码设置、HTTP 响应头设置等。
  3. 可选 HTTP 模块:可选 HTTP 模块主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,如:Flash 多媒体传输、解析 GeoIP 请求、SSL 支持等。
  4. 邮件服务模块:邮件服务模块主要用于支持 Nginx 的邮件服务,包括对 POP3 协议、IMAP 协议和 SMTP 协议的支持。
  5. 第三方模块:第三方模块是为了扩展 Nginx 服务器应用,完成开发者自定义功能,如:Json 支持、Lua 支持等。

在这里插入图片描述

# nginx编译安装配置参数

# 简介

在正式演示nginx编译配置之前,我们先来了解一下nginx那些常见的编译参数。

  1. --prefix :指定安装的目录。
  2. --user:运行nginx的worker子进程的所属主。
  3. --group:运行nginx的worker子进程的所属组。
  4. --pid-path:存放进程运行pid文件的路径。
  5. --conf-path:配置文件nginx.conf的存放路径。
  6. --error-log-path:错误日志error.log的存放路径。
  7. --http-log-path:访问日志access.log的存放路径。
  8. --with-pcre:pcre库的存放路径,正则表达式会用到。
  9. --with-zlib:zlib库的存放路径,gzip模块会用到。

# 自定义安装nginx

根据上文参数我们可以自定义这样一条命令:

  1. 指定安装目录为/usr/nginx。
  2. 指令配置文件目录为:/usr/nginx/conf/nginx.conf。
  3. 指定用户和group为root。
  4. 指定pid目录为/usr/nginx/pid/nginx.pid。
  5. 错误日志文件目录为/usr/nginx/error/error.log。
  6. 导入http_ssl_module 、http_image_filter_module 等模块。
  7. 指定日志目录为/usr/nginx/logs/access.log。
./configure --prefix=/usr/nginx --conf-path=/usr/nginx/conf/nginx.conf --user=root --group=root --pid-path=/usr/nginx/pid/nginx.pid --error-log-path=/usr/nginx/error/error.log --with-http_ssl_module --with-http_image_filter_module  --http-log-path=/usr/nginx/logs/access.log

1
2

如果报了下面的问题,我们可以用yum命令手动安装gd和gd-devel解决


./configure: error: the HTTP image filter module requires the GD library.
You can either do not enable the module or install the libraries.

[root@localhost nginx-1.10.2]# yum -y install gd gd-devel

1
2
3
4
5
6

完成这些步骤后,在使用make进行编译

make
1

最后再使用make install完成安装

make install
1

测试,可以看到上文指定user为user,所以启动的时候是以该用户启动的

/usr/nginx/sbin/nginx
[root@localhost nginx-1.10.2]# ps -ef |grep nginx
root      15244      1  0 15:15 ?        00:00:00 nginx: master process /usr/nginx/sbin/nginx
zhangsh+  15245  15244  0 15:15 ?        00:00:00 nginx: worker process
root      15251   3035  0 15:15 pts/1    00:00:00 grep --color=auto nginx

1
2
3
4
5
6

# nginx文件配置结构

nginx文件配置结构生效范围自外向里结构如下图所示,可以看到main负责全局配置,而events负责事件模型的配置,最常用的http模块层次如下。

在这里插入图片描述

# 虚拟主机分类

# 分类

  1. 基于多ip的虚拟主机
  2. 基于多端口的虚拟主机
  3. 基于多域名的虚拟主机

# 基于多网卡虚拟主机实现

查看本机所有ip,可以看到ens33和virbr0这两个ip我们就用这个做实验

[root@localhost server2]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.43.99  netmask 255.255.255.0  broadcast 192.168.43.255
		略



virbr0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
		略
1
2
3
4
5
6
7
8
9
10

虚拟主机ens33和virbr0配置如下,读者可参考注释自行阅读:

 server {
 	# 对ens33网卡的8081端口作监听
        listen       192.168.43.99:8081;
        server_name  localhost;



        location / {
        # 默认目录地址在nginx的html文件夹下的server1文件夹,所以我们必须创建这样一个文件夹并编写一个index.html
            root   html/server1;
            index  index.html index.htm;
        }


        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }


    }

	# 对virbr0网卡的8081端口作监听
         server {
        listen       192.168.122.1:8081;
        server_name  localhost;



        location / {
            root   html/server2;
            index  index.html index.htm;
        }


        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }


    }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43

实验

[root@localhost server2]# curl 192.168.43.99:8081
this is server1

[root@localhost server2]# curl 192.168.122.1:8081
this is server 2

1
2
3
4
5
6

# 基于端口的虚拟主机实现

配置如下可以看到,这里的listen只配置端口号

server {
		# 监听8001端口响应 html/server1
        listen       8081;
        server_name  localhost;



        location / {
            root   html/server1;
            index  index.html index.htm;
        }


        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }


    }



		# 监听8002端口响应 html/server2
         server {
        listen       8082;
        server_name  localhost;



        location / {
            root   html/server2;
            index  index.html index.htm;
        }


        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

实验结果可以看出这样的配置无论使用哪个ip,只要使用配置的端口,就会看到监听端口对应location 的页面

[root@localhost html]# curl 192.168.43.99:8081
this is server1

[root@localhost html]# curl 192.168.43.99:8082
this is server 2

[root@localhost html]# curl 192.168.122.1:8081
this is server1

[root@localhost html]# curl 192.168.122.1:8082
this is server 2

1
2
3
4
5
6
7
8
9
10
11
12

# 基于域名的虚拟主机实现

为了方便演示我们需要编写一下服务器的hosts文件,保证它可以解析到我们的自定义ip

vim /etc/hosts
1

增加如下两行数据

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.43.99 www.test.com
192.168.122.1 www.test2.com

1
2
3
4
5

nginx.conf配置,可以看到我们针对上面的两端域名分别做出不同的响应网页

 server {
        listen       8081;
        server_name  www.test.com;



        location / {
            root   html/server1;
            index  index.html index.htm;
        }


        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }


    }




         server {
        listen       8081;
        server_name  www.test2.com;



        location / {
            root   html/server2;
            index  index.html index.htm;
        }


        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }


    }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43

测试结果可以看出我们不同域名到达对应的网页都是不一样的

[root@localhost html]# curl www.test.com:8081
this is server1

[root@localhost html]# curl www.test2.com:8081
this is server 2

1
2
3
4
5
6

# 参考文献

Linux下signal信号汇总:https://www.cnblogs.com/frisk/p/11602973.html (opens new window)

Nginx配置文件结构:http://t.csdn.cn/Go7KM (opens new window)

Nginx及其架构设计 :https://www.cnblogs.com/Soy-technology/p/11355597.html#_label1 (opens new window)

编辑 (opens new window)
上次更新: 2026/03/26, 01:05:31
Nginx核心指令小结
Nginx应用进阶HTTP核心模块配置小结

← Nginx核心指令小结 Nginx应用进阶HTTP核心模块配置小结→

最近更新
01
基于EasyExcel实现高效导出
03-25
02
从开源框架中学习那些实用的位运算技巧
03-25
03
浅谈分布式架构设计思想和常见优化手段
03-25
更多文章>
Theme by Vdoing | Copyright © 2025-2026 Evan Xu | MIT License | 桂ICP备2024034950号 | 桂公网安备45142202000030
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×
×