JAVA开发运维(nginx工作原理)

news2024/9/20 20:35:14

nginx源码目录结构:

.
├── auto            自动检测系统环境以及编译相关的脚本
│   ├── cc          关于编译器相关的编译选项的检测脚本
│   ├── lib         nginx编译所需要的一些库的检测脚本
│   ├── os          与平台相关的一些系统参数与系统调用相关的检测
│   └── types       与数据类型相关的一些辅助脚本
├── conf            存放默认配置文件,在make install后,会拷贝到安装目录中去
├── contrib         存放一些实用工具,如geo配置生成工具(geo2nginx.pl)
├── html            存放默认的网页文件,在make install后,会拷贝到安装目录中去
├── man             nginx的man手册
└── src             存放nginx的源代码
    ├── core        nginx的核心源代码,包括常用数据结构的定义,以及nginx初始化运行的核心代码如main函数
    ├── event       对系统事件处理机制的封装,以及定时器的实现相关代码
    │   └── modules 不同事件处理方式的模块化,如select、poll、epoll、kqueue等
    ├── http        nginx作为http服务器相关的代码
    │   └── modules 包含http的各种功能模块
    ├── mail        nginx作为邮件代理服务器相关的代码
    ├── misc        一些辅助代码,测试c++头的兼容性,以及对google_perftools的支持
    └── os          主要是对各种不同体系统结构所提供的系统函数的封装,对外提供统一的系统调用接口

Nginx由内核和模块组成。

 

Nginx的模块从结构上分为核心模块、基础模块和第三方模块:

  • 核心模块:HTTP模块、EVENT模块和MAIL模块
  • 基础模块:HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite模块,
  • 第三方模块:HTTP Upstream Request Hash模块、Notice模块和HTTP Access Key模块。

Nginx的模块从功能上分为如下三类:

  • Handlers(处理器模块)。此类模块直接处理请求,并进行输出内容和修改headers信息等操作。Handlers处理器模块一般只能有一个。
  • Filters (过滤器模块)。此类模块主要对其他处理器模块输出的内容进行修改操作,最后由Nginx输出。
  • Proxies (代理类模块)。此类模块是Nginx的HTTP Upstream之类的模块,这些模块主要与后端一些服务比如FastCGI等进行交互,实现服务代理和负载均衡等功能。

Nginx进程模型:

  Nginx默认采用多进程工作方式,Nginx启动后,会运行一个master进程和多个worker进程。其中master充当整个进程组与用户的交互接口,同时对进程进行监护,管理worker进程来实现重启服务、平滑升级、更换日志文件、配置文件实时生效等功能。worker用来处理基本的网络事件,worker之间是平等的,他们共同竞争来处理来自客户端的请求。

worker工作原理:

在创建 Worker 进程的时候,是通过 fork 系统调用让 Worker 进程完全复制自己的资源,包括 listen 状态的 socket 句柄。

 

 在 Worker 进程中,创建了一个 epoll 内核对象,通过 epoll_ctl 将其想监听的事件注册上去,然后调用 epoll_wait 进入事件循环。

 

客户端与epllo交互观过程:

 

 Nginx配置详解:

#配置用户或者组,默认为nobody
user  nginx;
 
#允许生成的进程数,默认为1,一般配置为cpu核数
worker_processes  auto;
#错误日志
error_log  /var/log/nginx/error.log notice;
 
#进程ID
pid        /var/run/nginx.pid;
 
events {
 
    accept_mutex on;   #设置网路连接序列化,防止惊群现象发生,默认为on
    multi_accept off;  #设置一个进程是否同时接受多个网络连接,默认为off
	# epoll 模型对事件处理进行优化
    use epoll;      #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
    #允许最大连接数
    worker_connections  65535;
}
 
 
http {
	#隐藏nginx版本信息
	server_tokens off;
	#文件扩展名与文件类型映射表
    include       /etc/nginx/mime.types;
	#默认文件类型,默认为text/plain
    default_type  application/octet-stream;
 
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
 
    access_log  /var/log/nginx/access.log  main;
 
    sendfile        on;
    #tcp_nopush     on;
	
	#连接超时时间,默认为75s,可以在http,server,location块。
    keepalive_timeout  65;
 
    #gzip  on;
    client_max_body_size 1024m;
	
	#包含的自定义配置文件块
    include /etc/nginx/conf.d/*.conf;
 
	#是否传递4xx和5xx错误信息到客户端,或者允许nginx使用error_page处理错误信息。
    fastcgi_intercept_errors on;
}

子文件:

#8561端口服务器
server {
    #监听端口
    listen 8561;
	#域名配置项
    server_name _;
	location  /h5 {
		root  /usr/share/nginx/html/;
		try_files $uri $uri/ /h5/index.html;
	} 
 
   location  /mhyr-project {
	 root  /usr/share/nginx/html/mhyr-project/;
	 try_files $uri $uri/ /index.html;
   } 
   #静态资源配置项
   location /resource/ {
		proxy_pass https://tenc.cos.ap-beij.myqcloud.com/;
	}
   #静态资源
   location /icon/ {
		root /usr/share/nginx/html/mhyr-project-plat;
		try_files $uri $uri/ /index.html;
	}		
   #反向代理
   location /mhyrproject/ {
	 proxy_set_header Host $host;
	 client_max_body_size 10m;
	 proxy_set_header X-Real-IP $remote_addr;
	 proxy_set_header REMOTE-HOST $remote_addr;
	 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	 proxy_pass http://localhost:8100/;
   }
 
	#错误页面配置项	 
	error_page   403 404  /404.html;
	location = /404.html {
		root  error;
	}
 
	# redirect server error pages to the static page /50x.html
	# error_page   500 502 503 504  /50x.html;
	location = /50x.html {
		root   html;
	}
 
}
 
#443端口服务器
server {
    listen 443 ssl http2;
	#域名配置项
    server_name t-project.mhyr.cn;
	#证书配置项
    ssl_certificate /etc/nginx/cert/mhyr.cn2022.txt;
	#证书秘钥配置项
    ssl_certificate_key /etc/nginx/cert/private2022_unsecure.key;
    
    ssl_prefer_server_ciphers on;
	#SSL协议配置项
    ssl_protocols TLSv1.2;
    location  /h5 {
        root  /usr/share/nginx/html/;
        try_files $uri $uri/ /h5/index.html;
    } 
 
   location /mhyrproject/ {
	 proxy_set_header Host $host;
	 client_max_body_size 10m;
	 proxy_set_header X-Real-IP $remote_addr;
	 proxy_set_header REMOTE-HOST $remote_addr;
	 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	 #反向代理
	 proxy_pass http://apisSrvice;
   }
 
    location /resource/ {
        proxy_pass https://jt-mbr-uat-1301587776.cos.ap-beijing.myqcloud.com/;
    }
 
    location /icon/ {
        root /usr/share/nginx/html/mhyr-project-plat;
        try_files $uri $uri/ /index.html;
    }
         
    proxy_intercept_errors on;
    error_page  500 502 503 504 404 403   /404.html;
    #error_page 500 502 503 504 404 403 = https://project-test.mangocity.com/mhyr-project/#/error;
    location =  /404.html {
       root   /usr/share/nginx/html;
    }
 
    # redirect server error pages to the static page /50x.html
    # error_page   500 502 503 504  /50x.html;
    #location = /50x.html {
    #    root   html;
    #}
}

upstream apisSrvice { 
    server  20.11.1.26:9100 max_fails=2  fail_timeout=5s;
    server  20.11.1.45:9100 max_fails=2  fail_timeout=5s;
    server  20.11.1.46:9100 max_fails=2  fail_timeout=5s;
    server  20.11.1.30:9100 max_fails=2  fail_timeout=5s;
    server  20.11.1.21:9100 max_fails=2  fail_timeout=5s;
}
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/391720.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023-03-06 debian11 最小安装记录

1.镜像准备,根据个人需求下载debian 版本Debian -- 获取 Debian2.上传到VSAN 内容库我这边是在vm里面安装的,就直接上传到内容库备用(根据个人需求存放)3.分配虚拟主机配置根据个人需要配置4.开始最小安装1.在界面中选择Install&a…

Packet Tracer--配置帧中继

Packet Tracer--配置帧中继 拓扑图: 设备参数: 设备 接口 DLCI R1 S0/2 102,103 R2 S0/2 201 R3 S0/2 301 R1---R2 Se1:102-----Se2:201 R1---R3 Se1:103-----Se3:301 IP参数 设备 接口 IP地址…

CFNet: Cascade Fusion Network for Dense Prediction

论文名称:CFNet: Cascade Fusion Network for Dense Prediction 论文下载:https://arxiv.org/pdf/2302.06052.pdf 论文代码:GitHub - zhanggang001/CFNet: CFNet: Cascade Fusion Network for Dense Prediction 摘要: 在密集预…

十四届蓝桥选拔赛Scratch-2023.02.12 试题解析

十四届蓝桥选拔赛Scratch-2023.02.12 试题解析 单选题: 1. 运行以下程序,小猫和小企鹅谁能到达舞台右侧边缘? ( B ) *选择题严禁使用程序验证,选择题不答和答错不扣分 A. 小企鹅 B. 小猫 C. 都能到达 D. 都不能到达 2. 运行以下程序(小象仅有两个造型),小象的造型是…

最简单的SpringBoot+MyBatis多数据源实现

最简单的SpringBootMyBatis多数据源实现1.数据库准备2.环境准备3.代码部分3.1多数据源配置2.测试随着应用用户数量的增加,相应的并发请求的数量也会跟着不断增加,慢慢地,单个数据库已经没有办法满足频繁的数据库操作请求了,在某些…

【JeecgBoot-Vue3】第4节 目录结构与常用组件介绍

一、项目的目录结构讲解 1. src/api/ 存放API相关信息 src/api/存放的是调用后台api接口相关信息src/api/commonapi.tsapi接口信息2. src/assets 静态资源 src/assets静态资源 src/assets/icons 图标 src/assets/images 图片 src/assets/less 样式src/assets/svgsvg图像3. s…

函数编程:强大的 Stream API

函数编程:强大的 Stream API 每博一文案 只要有人的地方,世界就不会是冰冷的,我们可以平凡,但绝对不可以平庸。—————— 《平凡的世界》人活着,就得随时准备经受磨难。他已经看过一些书,知道不论是普通…

Python API教程:API入门

什么是API? 一个API,或被称为应用程序接口,是一个服务器为你提供一个接收或发送数据的代码。API通常用来接收数据。 本文就集中焦点在此话题中。 当我们想从一个API中接收数据,我们需要开始请求。请求可以包含整个Web。例如&am…

Vue基础18之github案例、vue-resource

Vue基础18github案例静态页面第三方样式引入(以bootstrap举例)App.vueSearch.vueList.vue列表展示接口地址使用全局事件总线进行兄弟间组件通信Search.vueList.vue完善案例List.vueSearch.vue补充知识点:{...this.info,...this.dataObj}效果呈…

Serverless

Serverless:云计算的下一个十年 最近几年的技术圈,对于 Serverless 技术的讨论异常火热,在业内也有了很多成熟的案例,国外发展较早,比较有代表性的就是亚马逊和谷歌, 而在国内,腾讯和阿里两位巨…

Maven使用教程

1.什么是Maven? 当我们在创建一个使用Spring的Web项目就需要引入大量的jar包。一个项目Jar包的数量极多,并且Jar包之间的关系错综复杂,一个Jar包往往又会引用其他Jar包,缺少任何一个Jar包都会导致项目编译失败。 以往开发项目时…

GraphPad Prism v9.5.1.733 科研绘图软件多语言

GraphPad Prism集生物统计、曲线拟合和科技绘图于一体,其所具有的功能均非常实用和精炼,包括了一些特色的功能,如ROC曲线分析、Bland-Altman分析等;曲线拟合功能是GraphPad Prism8 汉化版超越其他统计软体的制胜法宝,GraphPad Prism8 汉化版的线性/非线性拟合功能使用操作…

JVM运行时数据区—Java虚拟机栈

虚拟机栈的背景 由于跨平台性的设计,java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。 根据栈设计的优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功…

python制作【法律条文查询工具】妈妈再也不担心我法盲了

前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 更多教程源码资料电子书: 点击此处跳转文末名片获取 环境准备8 Python 3.8 Pycharm 《中华人民共和国刑法》 效果展示 打算做个简单的界面,主要功能就是查询法律条文 代码展示 查询器界面 设定界面大小 …

戴眼镜检测和识别2:Pytorch实现戴眼镜检测和识别(含戴眼镜数据集和训练代码)

Pytorch实现戴眼镜检测和识别(含戴眼镜数据集和训练代码) 目录 Pytorch实现戴眼镜检测和识别(含戴眼镜数据集和训练代码) 1.戴眼镜检测和识别方法 2.戴眼镜数据集 3.人脸检测模型 4.戴眼镜分类模型训练 (1)项目安装 (2)准…

反向代理和负载均衡有何区别?

反向代理和负载均衡是两种常用的网络架构模式,它们可以一起使用来提高网站的性能和可靠性,很多人会把这两者混淆,实际上,这两者的作用略有不同,今天我们就来详细说说具体区别是什么。一、反向代理(Reverse …

Python|贪心|数组|桶排序|二叉搜索树|贪心|单选记录:最大间距|将有序数组转换为二叉搜索树|跳跃游戏 II

1、最大间距(数组,桶排序) 给定一个无序的数组,找出数组在排序之后,相邻元素之间最大的差值。 如果数组元素个数小于 2,则返回 0。 示例 1: 输入: [3,6,9,1] 输出: 3 解释: 排序后的数组是 [1,3,6,9]…

三个案例场景带你掌握Cisco交换机VLAN互通

VLAN间路由的方式现在主流的组网主要是依靠三层交换机通过配置SVI接口【有的厂商叫VLANIF接口】,当然也有比较小型的网络,它就一个出口路由器可管理的二层交换机,还有一种更加差的,就是出口路由一个可管理的二层交换机&#xff0c…

描述一下锁的四种状态及升级过程?

文章目录1、锁的四种状态2、Java对象头描述3、锁的升级过程(Synchronized加锁/膨胀流程)1)简单过程如下图2)详细过程(1)偏向锁(2)轻量级锁(3)重量级锁4、拓展…

SpringBoot下的Spring框架学习(Tedu)——DAY02

SpringBoot下的Spring框架学习(Tedu)——DAY02 目录SpringBoot下的Spring框架学习(Tedu)——DAY02Spring框架学习1.1 Spring介绍1.2 知识铺垫1.2.1 编辑Dog类1.2.2 编辑Cat类1.2.3 编辑测试类User.java1.2.4 上述代码的总结1.3 面…