Nginx 目录结构和运行原理

news/2025/2/13 17:32:24/
1. 简介

nginx 是目前最流行的 web 服务器软件,也是目前互联网公司和网站的首选

nginx 发行版比较多,常用版本有两大阵营,我们平时使用最多的是开源版,本文使用的也是开源版

  • nginx 开源版:https://nginx.org
  • nginx plus 商业版:https://nginx.com
2. 安装

nginx 有多种安装方式:

方式一:使用包管理器,这种方式比较简单,只需要一个 install 命令即可

 
  1. # MacOS
  2. brew install nginx
  3. # Windows
  4. scoop install nginx

方式二:使用源码进行编译安装

nginx 是使用 c 语言开发的,那么也就可以像其他 c 语言项目一样,下载 nginx 的源码到自己的服务器上,然后执行预编译、编译和安装,这种方式比较灵活,可以自定义各种配置参数,适合于一些特殊的场景

这种方式也是比较麻烦的,因为编译安装的过程,可能会遇到各种各样的问题,需要有一定的排查和解决问题的能力

 
  1. ./configure --prefix=/usr/local/nginx

方式三:使用 Docker 安装,使用 docker 镜像来安装和运行 nginx

这种方式也是比较简单的,只需要执行几个 docker 命令就可以了,想要学习和体验已经足够满足了

 
  1. docker pull nginx
3. 服务启停

nginx 安装完成之后就可以来启动服务了,在 nginx 安装目录下的 sbin 目录下运行以下命令

回车之后没有任何提示消息的话,就表示启动成功了,这是 linux 系统的一个设计思想,没有消息就是最好的消息

如果启动失败的话会有提示,那么就需要根据提示信息来排查和解决问题

 
  1. ./nginx

nginx 的服务启动之后,会作为一个后台进程一直运行,我们运行下面命令查看 nginx 进程

 
  1. ps -ef | grep nginx

这里只需要关注前面两个进程就可以了,一个是 master 进程,一个是 worker 进程

稍微解释一下 nginx 的进程模型,这里的 master 进程就是 nginx 的主进程

它主要负责读取和验证配置文件以及管理 worker 进程,worker 进程就是 nginx 的工作进程,负责处理实际的请求,master 进程只有一个,而 worker 进行可以有多个

master 进程和 worker 进程之间的关系就像是老板和员工的关系一样,老板负责管理员工,并且将工作分配给员工,员工负责完成具体的工作,worker 进程的数量可以通过配置文件来调整

上图中的第二列就是 PID,也就是进程 ID,PID 是 Linux 系统中每一个进程的唯一标识

还可以使用 lsof 命令来查看一个端口占用情况

 
  1. lsof -i:80

有些系统没有自带 lsof 命令,需要手动安装【mac 已经自带,无需自行安装】

 
  1. # centos
  2. yum install lsof -y

我们可以看到 80 端口正被 nginx 的两个进行占用着

这两个进程的 PID 就是上面我们看到的 nginx 的进程 PID,表示 nginx 正在监听 80 端口

nginx 服务启动之后,我们可以通过 ./nginx -s 参数 来控制 nginx 的停止或重启

 
  1. ./nginx -s quit # 优雅停止
  2. ./nginx -s stop # 立即停止
  3. ./nginx -s reload # 重载配置文件
4. 目录结构

在使用 nginx 之前,我们先对安装好的 nginx 目录文件进行一个分析,可以使用一个工具 tree,使用该命令可以方便的查看文件目录结构,要使用该命令需要先进行安装,运行以下命令即可

 
  1. yum install tree -y
1. 目录概览

nginx 一般都是安装在 /usr/local/nginx 目录,本文默认您将 nginx 安装到此目录下

 
  1. ./configure --prefix=/usr/local/nginx

nginx 安装完成后,在其安装目录下默认有下面四个目录

 
  1. ├── conf # 配置文件存放目录
  2. ├── html # 默认站点目录
  3. ├── logs # 日志文件存放目录
  4. ├── sbin # nginx 主程序文件存放目录

如果你的目录下多了好几个以 _temp 为后缀的目录,无需关注,这几个目录都是 nginx 运行时产生的临时文件

 
  1. ls /usr/local/nginx

nginx 目录结构一览图

2. conf 目录

conf:nginx 配置文件存放目录

可以将默认的配置文件分为三大类:cgi 相关配置文件

CGI(Common Gateway Interface):通用网关接口,主要解决的问题是从客户端发送一个请求和数据,服务端获取到请求和数据后可以调用 CGI 程序处理及相应结果给客户端的一种标准规范

 
  1. ├── fastcgi.conf # fastcgi 配置文件
  2. ├── fastcgi.conf.default # fastcgi.conf 的备份文件
  3. ├── fastcgi_params # fastcgi 参数配置
  4. ├── fastcgi_params.default # fastcgi_params 的备份文件
  5. ├── scgi_params # scgi 参数配置
  6. ├── scgi_params.default # scgi_params 的备份文件
  7. ├── uwsgi_params # uwsgi 参数配置
  8. ├── uwsgi_params.default # uwsgi_params 的备份文件
  9. ├── koi-utf
  10. ├── koi-win
  11. ├── win-utf
  12. ├── mime.types
  13. ├── mime.types.default
  14. ├── nginx.conf
  15. ├── nginx.conf.default

nginx.conf 为主配置文件,主配置文件会引用其他配置文件

当修改配置文件后,运行以下命令来检查配置文件的内容是否正确,当有错误时,会提示错误的位置和原因

 
  1. ./nginx -t

nginx 的配置文件修改后,都是需要重新加载一下才会生效的

 
  1. ./nginx -s reload

在主配置文件 nginx.conf 中可以修改 worker 进程的数量

 
  1. # worker 进程数量默认只有一个
  2. worker_processes 1;

将 worker 进程数量设置为 3 个,重载 nginx 配置后,查看进程就能看到生效了

 
  1. worker_processes 3;

一般来说,worker 进程的数量保持和服务器 CPU 内核的数量相同是比较合适的,也可以设置为 auto,这样 nginx 就会根据内核的数量来自动设置 worker 进程的数量

 
  1. worker_processes auto;
3. logs 目录

logs 目录用来存放 nginx 日志文件和主进程 pid,日志文件比如:访问日志 (access.log) 和错误日志 (error.log)

nginx.pid 用来记录 nginx 主进程的 pid(当 nginx 服务启动后才会该文件)

4. sbin 目录

sbin 目录用于存放 nginx 主进程文件,根据它可以启动、停止 nginx 服务以及重载 nginx 配置

5. 运行原理

a. 基本运行原理

nginx 的高性能,其实和它的架构模式有关,nginx 默认采用的是多进程的方式来工作的

当通过 nginx 主进程文件启动 nginx 服务时,会开启主进程,然后主进程就会读取并校验配置文件(nginx.conf)

当配置文件没有错误时,会开启多个子进程,用于接受并响应请求

当有网络请求发送时,子进程就会接受请求,然后解析请求,读取配置文件,然后响应请求

b. 总结

nginx 服务启动会运行一个主进程,多个子进程,主进程负责协调子进程

当配置文件更改了,我们会执行以下命令重新加载配置文件

 
  1. ./nginx -s reload

该命令会将子进程杀掉,在杀掉之前会留有时间完成之前用户的请求,并且告诉子进程不允许再接受新的请求了

https://www.lengleng.net

当子进程把所有之前的请求完成后,子进程就会被杀掉了,新的子进程去读新的配置文件

验证上面的话,如下图所示,reload 之后,子进程的 pid 变了,主进程并没有变

 
  1. ps -ef | grep nginx
  2. /usr/local/nginx/sbin/nginx -s reload

nginx 基本运行原理如下图所示


http://www.ppmy.cn/news/1396912.html

相关文章

软考系统架构设计师(摘抄)01

架构师承担的责任 系统架构师设计师是承担系统架构设计的核心角色,他不仅是连接用户需求和系统进一步设计与实现的桥梁,也是系统开发早期阶段质量保证的关键角色。系统架构师就是项目的总设计师,他是一个既需要掌控整体又需要洞悉局部瓶颈&a…

面向对象编程(一)

文章目录 类类的实例属性类的属性(Attributes)类的实例方法类的方法(Methods) 类 在 Python 中,类(Class)是一种定义对象(Object)的结构,它包含了对象的状态&#xff08…

SpringMVC使用validation参数校验

Maven引入依赖 <!-- validation依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency>常用参数和正则表达式 spring boot-Validated参数校验 Pa…

ubuntu22.04配置Azure Kinect DK深度相机

一.安装SDK 今天我来配置一下微软公司的Azure Kinect DK深度相机&#xff0c;以前在ubuntu18.04上配置过&#xff0c;因为官方说唯一支持linux版本是18.04&#xff0c;所以在18.04中配置还算顺利 but这不代表不可以在更高版本的ubuntu中使用&#xff0c;只不过需要自己…

Spring Cloud Gateway 3.x 获取body中的数据鉴权

前言 SpringCloud Gateway建立在Spring Framework5、Project Reactor和Spring Boot2.0之上&#xff0c;使用WebFlux非阻塞API 什么是WebFlux? 官网&#xff1a;https://docs.spring.io/spring-framework/docs/current/reference/html/web-reactive.html 传统的Web框架&…

3.26总结

JAVA学习今天学了字符串相关类的底层原理&#xff08;简单了解了一下&#xff09;和集合部分&#xff0c;自己试着做了一些集合的简单练习来加强理解 集合和数组部分功能上有些相似&#xff0c;但是总体存在很大区别 1.长度 数组长度固定&#xff0c;集合长度可以改变 2.内…

前端下载超大文件的完整方案

实现步骤 使用分片下载&#xff1a; 将大文件分割成多个小块进行下载&#xff0c;可以降低内存占用和网络传输中断的风险。这样可以避免一次性下载整个大文件造成的性能问题。 断点续传&#xff1a; 实现断点续传功能&#xff0c;即在下载中途中断后&#xff0c;可以从已下载的…

【openGL4.x手册07】几何着色器

目录 一、说明二、关于几何着色器三、原始输入/输出规范3.1 实例 四、输入五、输出5.1 分层渲染 六、输出限制 一、说明 几何着色器对于渲染管线设计是一个新生事物&#xff1b;目前对应于几何着色器的资料不多&#xff0c;并且说法不一&#xff0c;因此如何用几何着色器&…