epoll

Nginx 是如何处理 HTTP 头部的?

我的梦境 提交于 2020-04-13 14:40:29
【今日推荐】:为什么一到面试就懵逼!>>> Nginx 处理 HTTP 头部的过程 Nginx 在处理 HTTP 请求之前,首先需要 Nginx 的框架先和客户端建立好连接,然后接收用户发来的 HTTP 的请求行,比如方法、URL 等,然后接收所有的 Header,根据这些 Header 信息,才能决定由哪些 HTTP 模块处理请求。下面这张图,解释了 Nginx 在处理 HTTP 请求之前,所经历的一系列流程,强烈建议收藏保存。下面针对每个部分单独讲解一下。 接收请求事件模块 首先是三次握手,当客户端发来 ACK 之后,由操作系统内核回一个 SYN+ACK,紧接着客户端 ACK 之后,连接建立成功。同时可能有很多 worker 进程都在监听 80 或 443 端口,由操作系统的负载均衡算法,选取一个 worker 进程来处理,这个 worker 进程会通过 epoll_wait 方法,返回一个建立连接的句柄。拿到了监听的句柄之后,这实际上是一个读事件(因为是从操作系统中读取到了一个请求),调用 accept 方法,分配连接内存池。 内存池主要分为连接内存池和请求内存池。 连接内存池大小的配置是 connection_pool_size ,到了这一步之后,Nginx 会为已经建立的连接分配一个 512 字节大小的连接内存池。分配完内存池,建立好连接之后,HTTP

Nginx 是如何处理 HTTP 头部的?

醉酒当歌 提交于 2020-04-13 11:44:44
【今日推荐】:为什么一到面试就懵逼!>>> Nginx 处理 HTTP 头部的过程 Nginx 在处理 HTTP 请求之前,首先需要 Nginx 的框架先和客户端建立好连接,然后接收用户发来的 HTTP 的请求行,比如方法、URL 等,然后接收所有的 Header,根据这些 Header 信息,才能决定由哪些 HTTP 模块处理请求。下面这张图,解释了 Nginx 在处理 HTTP 请求之前,所经历的一系列流程,强烈建议收藏保存。下面针对每个部分单独讲解一下。 接收请求事件模块 首先是三次握手,当客户端发来 ACK 之后,由操作系统内核回一个 SYN+ACK,紧接着客户端 ACK 之后,连接建立成功。同时可能有很多 worker 进程都在监听 80 或 443 端口,由操作系统的负载均衡算法,选取一个 worker 进程来处理,这个 worker 进程会通过 epoll_wait 方法,返回一个建立连接的句柄。拿到了监听的句柄之后,这实际上是一个读事件(因为是从操作系统中读取到了一个请求),调用 accept 方法,分配连接内存池。 内存池主要分为连接内存池和请求内存池。 连接内存池大小的配置是 connection_pool_size ,到了这一步之后,Nginx 会为已经建立的连接分配一个 512 字节大小的连接内存池。分配完内存池,建立好连接之后,HTTP

如何设计一个大规模远程命令执行系统

你离开我真会死。 提交于 2020-04-11 02:28:22
本文作者:AIOps智能运维 干货概览 书接前文,在上一篇文章中我们介绍了大规模命令执行的意义以及所面对的问题和困难,简单介绍了百度集群控制系统(Cluster Control System,以下简称CCS系统)通过构建两级数据模型、四级调度模型、三级代理执行的方式解决了这些问题,在本篇文章中,我们将续接前文,继续对CCS系统的设计实现进行详细剖析。 两级数据模型 设计考量 回顾前文,在面临的需求中我们提到,需要在大规模的服务器上执行命令并且能够灵活控制。为了满足这样的需求,建立数据模型时,只有执行信息是不够的,还要有控制信息,如路由、并发度、暂停点等,两者组合在一起,构成了CCS系统中的数据模型。 控制信息 控制信息包括命令传递所需的“路由”信息和调度过程的控制信息,如下: 目标机器:命令执行的目标服务器列表,可以是IP,也可以是Hostname。 并发程度:分组并发执行时每组的机器数量,用于控制分组执行,避免系统升级时所有服务器同时升级造成业务中断。 暂停节点:指定执行到第几台服务器时暂停执行,方便先操作几台服务器并确认没问题后再继续执行,若有问题也可将问题控制在小范围内。 执行信息 执行信息是指命令到达目标机器后开始执行时所必需的信息,如下: 认证信息:标示执行者是谁的信息,用来确认执行者的合法性,如不合法则拒绝执行。 鉴权信息:标示执行者所持有的权限

如何设计一个大规模远程命令执行系统

你说的曾经没有我的故事 提交于 2020-04-11 02:23:18
本文作者:AIOps智能运维 干货概览 书接前文,在上一篇文章中我们介绍了大规模命令执行的意义以及所面对的问题和困难,简单介绍了百度集群控制系统(Cluster Control System,以下简称CCS系统)通过构建两级数据模型、四级调度模型、三级代理执行的方式解决了这些问题,在本篇文章中,我们将续接前文,继续对CCS系统的设计实现进行详细剖析。 两级数据模型 设计考量 回顾前文,在面临的需求中我们提到,需要在大规模的服务器上执行命令并且能够灵活控制。为了满足这样的需求,建立数据模型时,只有执行信息是不够的,还要有控制信息,如路由、并发度、暂停点等,两者组合在一起,构成了CCS系统中的数据模型。 控制信息 控制信息包括命令传递所需的“路由”信息和调度过程的控制信息,如下: 目标机器:命令执行的目标服务器列表,可以是IP,也可以是Hostname。 并发程度:分组并发执行时每组的机器数量,用于控制分组执行,避免系统升级时所有服务器同时升级造成业务中断。 暂停节点:指定执行到第几台服务器时暂停执行,方便先操作几台服务器并确认没问题后再继续执行,若有问题也可将问题控制在小范围内。 执行信息 执行信息是指命令到达目标机器后开始执行时所必需的信息,如下: 认证信息:标示执行者是谁的信息,用来确认执行者的合法性,如不合法则拒绝执行。 鉴权信息:标示执行者所持有的权限

linux下异步RPC的阶段性总结-非阻塞SOCKET客户端

眉间皱痕 提交于 2020-04-10 18:36:11
尽可能使用非阻塞socket int flags, s; flags = fcntl (fd, F_GETFL, 0); if (flags == -1){ close(fd); return -1; } flags |= O_NONBLOCK; s = fcntl (fd, F_SETFL, flags); if (s == -1){ close(fd); return -1; } 使用效率高效的epoll机制获取多个socket上的IN/OUT事件 非阻塞socket连接服务端时,不一定立即连接得上服务器 通过判断connect函数的返回值和错误号做进一步跟踪 int ret = ::connect(this->fd, (struct sockaddr*)&(server_addr), sizeof(server_addr)); if(ret == 0){ this->on_connected(); }else if(ret < 0 && errno != EINPROGRESS){ //error }else{ on_connecting(); } IN/OUT事件时如果是connecting需要判断socket状态,socket reset发生时也会产生事件,然后才进入有效的读写 if(this->connect_status == 1){//connecting int

nginx 配置小结

回眸只為那壹抹淺笑 提交于 2020-04-10 13:02:51
# worker_processes 定义了 nginx 对外提供 web 服务时的 worder 进程数。最优值取决于许多因素,包括(但不限于)CPU核的数量、存储数据的硬盘数量及负载模式。不能确定的时候,将其设置为可用的 CPU 内核数将是一个好的开始(设置为"auto"将尝试自动检测它)。 worker_processes 8; # worker_rlimit_nofile 更改 worker 进程的最大打开文件数限制。如果没设置的话,这个值为操作系统的限制。设置后你的操作系统和 Nginx 可以处理比 "ulimit -a" 更多的文件,所以把这个值设高,这样nginx就不会有 "too many open files" 问题了。 worker_rlimit_nofile 100000; # worker_connections 设置可由一个 worker 进程同时打开的最大连接数。如果设置了上面提到的 worker_rlimit_nofile,我们可以将这个值设得很高。 记住,最大客户数也由系统的可用 socket连接数限制(~ 64K),所以设置不切实际的高没什么好处。(最大连接数=连接数*进程数) worker_connections 1024; # multi_accept 告诉nginx收到一个新连接通知后接受尽可能多的连接。 multi_accept on; #

能说一说你对IO的理解吗?IO模块总结

淺唱寂寞╮ 提交于 2020-04-07 07:42:49
大家好,这是一个为了梦想而保持学习的博客。这是第六篇文章,分享一下我对【IO】的理解。 文章的风格会一直保持问答的方式讲述,这是我个人喜欢的一种风格,也是相当于模拟面试。 能说说IO的整个过程吗? 网络数据从接收到处理,可以分为三个阶段: 网卡接收数据包 :在网络编程中,我们的数据来源都是从网络中来的,那么数据包首先到达的就是我们的 网卡 ,因此这就是我们整个过程的第一阶段。 操作系统(OS)读取数据包 :在网卡拿到数据以后,会由我们的OS来负责读取对应的数据到我们的OS内核缓冲区中。数据都是自下而上传递的,此时我们应用层的运行的程序还无法获取到对应的数据。 将数据复制到用户空间 :我们的应用想要获取对应的数据,就需要将对应的数据从OS内核缓冲区中复制到自己的用户空间内,才可以进行下一步操作。 你知道有哪些获取数据的IO模型吗? 说起IO模型,大家肯定都不陌生,或多或少都了解过一些,但是是否有思考过这些IO模型是用来干什么的呢?我自己的理解,这些IO模型都是为了获取数据,针对上面所说的IO过程,准确的来说这些IO模型都是为了从OS内核缓冲区中获取数据。(当然换一种说法,可以理解为处理连接) 下面就来看看有哪些数据模型,分别都是怎么从OS内核缓冲区中获取数据的。 阻塞IO(BIO) 阻塞IO是最经典的一种网络IO模型,在这种IO模型下,从等待网络数据到达网卡

如何快速学习网站基本搭建和服务器环境配置?

时间秒杀一切 提交于 2020-04-06 15:08:30
一、基本概念 实验1: 在阿里云上部署Tomcat服务器 点击详情 业务背景 Tomcat为网站的服务器,每个网站在后面都有一个服务器来解析那个网页,Tomcat 对于 Java 来说它就是一个 Servlet 处理器,支持运行基于 Servlet 的 Java 程序,同时 JSP 本身也是基于 Servlet 的技术,也是支持的,像传说中的 Spring, Struts, JSF 都是基于 Servlet 的,都可以在 Tomcat 上跑起来。 技术背景 Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。 实验2: 快速搭建和部署LAMP环境 点击详情

Nginx的默认配置详解

随声附和 提交于 2020-04-06 15:06:56
我们首先看看有哪些默认配置文件,打开nginx.conf文件,查看尾行部分 [root@hongshaorou nginx]# tail -n 2 nginx.conf include /etc/nginx/conf.d/*.conf; } 我们看到将/etc/nginx/conf.d/文件下其他以.conf结尾的配置文件都导入到该文件中。 我们看看/etc/nginx/conf.d/文件下默认有哪些文件 [root@hongshaorou conf.d]# ls default.conf 也就是说默认情况下有两个配置文件nginx.conf default.conf 今天我们主要学习nginx.conf配置文件,该配置文件主要分为三大块 第一块: user 设置nginx服务的系统使用用户 worker_processes 工作进程数 error_log nginx的错误日志 pid nginx服务启动时候pid 第二块:(时间) events worker_connections 每个进程允许最大连接数 use 工作进程数 (设置是epoll 还是select) 第三块:http模块配置 http { include mime.types; default_type application/octet-stream; log_format main '$remote_addr:

如何快速学习网站基本搭建和服务器环境配置?

无人久伴 提交于 2020-04-05 20:45:25
一、基本概念 实验1: 在阿里云上部署Tomcat服务器 点击详情 业务背景 Tomcat为网站的服务器,每个网站在后面都有一个服务器来解析那个网页,Tomcat 对于 Java 来说它就是一个 Servlet 处理器,支持运行基于 Servlet 的 Java 程序,同时 JSP 本身也是基于 Servlet 的技术,也是支持的,像传说中的 Spring, Struts, JSF 都是基于 Servlet 的,都可以在 Tomcat 上跑起来。 技术背景 Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。 实验2: 快速搭建和部署LAMP环境 点击详情