nginx模块开发

nginx的请求接收流程(一)

空扰寡人 提交于 2020-01-08 03:52:03
今年我们组计划写一本nginx模块开发以及原理解析方面的书,整本书是以open book的形式在网上会定时的更新,网址为http://tengine.taobao.org/book/index.html。本书分析的nginx源码版本为1.2.0,环境为linux,事件处理模型为epoll,大部分分析流程都基于以上假设。我会负责其中一些章节的编写,所以打算在这里写一系列我负责章节内容相关的文章(主要包括nginx各phase模块的开发,nginx请求的处理流程等)。本篇文章主要会介绍nginx中请求的接收流程,包括请求头的解析和请求体的读取流程。 首先介绍一下rfc2616中定义的http请求基本格式: [cpp] view plain copy <span style= "font-size:18px;">Request = Request-Line *(( general-header | request-header | entity-header ) CRLF) CRLF [ message-body ] </span> 第一行是请求行(request line),用来说明请求方法,要访问的资源以及所使用的HTTP版本: [cpp] view plain copy <span style= "font-size:18px;">Request-Line = Method SP

客户端灰度发布,NGINX+GeoIP2+GeoIP Database

懵懂的女人 提交于 2020-01-07 19:32:36
需求的产生 (分地区更新) 我们公司呢是做电商平台的,其主打商品里有一款智能饮水机产品,而每台智能饮水机产品都是装在全国客户的家里。为了售后维护需要服务端如何保存数据并传回这块实现较简单,而在远程展示水机的余额、归属地、出水的质量等功能这块是由水机自身所镶嵌的一块智能PAD屏所完成,其PAD内部安装的是安卓系统; 在由开发完成新功能的开发后需迭代智能PAD屏内部安卓系统APK版本时,在更新版本这块我们一直做的方法是全量更新不做任何更新上的限制。但随着业务量的增加全国大概有30万台水机版本需要更新,显然之前的更新方式不再适用于现有这种高业务量的需求了。所以我们考虑了一个新的更新方案 "按地区更新"; 参考的方案 一、最直接的方案是购买阿里云的CDN,利用CDN的缓存来实现。缓存原理如下 通过CDN访问的流程是:客户端-->CDN L1--->CDN L2--->源站; 客户端请求到的CDN节点是CDN的L1节点,当客户端请求到CDN的L1节点向该节点请求一个资源的时候,该CDN节点会查询本节点是否有这个资源,如有这个资源就会直接返回给客户端。如果没有这个资源,CDN L1节点就会向CDN的L2节点去请求资源,L2节点如果有缓存该文件,那么L1向L2拿到数据以后就返回给客户端。如果L2节点也没有缓存该资源,那么CDN的L2节点会回源向源站去请求这个资源然后返回给客户端

Nginx

和自甴很熟 提交于 2020-01-07 16:24:25
1 Nginx的简介 1.1 Nginx概述 Nginx是一个高性能的HTTP和反向代理服务器,特点是占用内存少,并发能力强,事实上Nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用Nginx的网站用户有:百度、京东、新浪、网易、腾讯和淘宝等。 1.2 Nginx作为web服务器 Nginx可以作为静态页面的web服务器,同时还支持CGI协议的动态语言,比如perl、php等。但是不支持java。java程序只能通过和tomcat等服务器配置使用。Nginx专为性能优化而开发,性能是最重要的考量,实现上非常注重效率,能经受高负载的考验,有报告表明能支持高达50000个并发连接数。 1.3 正向代理 Nginx不仅可以做反向代理,实现负载均衡。还能通过正向带来来进行上网等功能。 正向代理:如果把局域网外的Internet想象成一个巨大的资源库,则局域网中的客户端要Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理。 例如:国内是不能访问www.google.com的,但是可以通过正向代理服务器来访问www.google.com,如下图所示: 1.4 反向代理服务器 反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端

nginx源码分析——事件模块

给你一囗甜甜゛ 提交于 2020-01-07 04:59:46
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 1. 事件模块概述 事件处理框架所要解决的问题是如何收集,管理,分发事件。这里所说的事件,主要以网络事件和定时器事件为主,而网络事件中又以TCP网络事件为主。由于网络事件与网卡中断处理程序,内核提供的系统调用密切相关,所以网络事件的驱动取决于不同的操作系统平台,在同一操作系统中也受制于不同的操作系统内核版本。因此不同操作系统有不同的事件驱动机制。 基于模块化的设计思想,nginx对于事件处理分不同的模块来完成。首先是ngx_events_module,它是NGX_CORE_MODULE类型的模块,主要负责配置文件events块配置项的解析;其次是ngx_event_core_module,它是NGX_EVENTS_MODULE类型的模块,这个模块会决定使用哪种事件驱动机制,并且怎样调用事件驱动完成事件的管理;最后是ngx_epoll_module,ngx_kqueue_module,ngx_poll_module等一系列模块,这些模块实现了具体的事件驱动机制。 2. 事件模块间的抽象化及初始化流程 在模块接口ngx_module_t中,有一个指向模块上下文的指针,不同的模块采用不同的结构体。 对于NGX_EVENT_MODULE类型的模块,其上下文结构体为ngx_event_module_t: typedef

php-fpm运行原理

做~自己de王妃 提交于 2020-01-07 02:14:44
来源: https://blog.csdn.net/sinat_38804294/article/details/94393621 一、php-fpm由来 1.cgi (common gateway interface 公共网关接口)是一种协议,也是一种程序 它是为了保证web server传递过来的数据是标准格式,方便cgi程序的编写者。 web server网站服务器只是内容的分发者(比如nginx)。如果请求/index.html,那么nginx会去文件系统中找到这个文件,发送给浏览器。这里分发的是静态数据。如果请求/index.php,根据配置文件,nginx知道这不是一个静态文件,需要去找php解析器来处理,那么nginx就会把这个请求简单处理交给php解析器。但是nginx传递给php解析器什么呢?url、查询字符串、post数据、header?这时候cgi就出来了,cgi就是规定了要传那些数据并以什么格式传递给后方处理这个请求的协议。 当web server 收到/index.php请求后,会启动对应的cgi程序,这里就是php的解析器。接下来php解析器会解析php.ini文件,初始化执行环境,然后处理请求,再以cgi规定的格式返回处理后的结果,退出进程。web server再把结果返回给浏览器。 2.fastcgi用来提高cgi程序性能的 cgi是个协议

阿里云安装Nginx+vue项目部署

天大地大妈咪最大 提交于 2020-01-06 22:06:34
阿里云安装Nginx+vue项目部署 nginx安装包下载 http://nginx.org/en/download.html nginx安装 首先先安装PCRE pcre-devel 和Zlib,因为配置nginx的时候会需要这两个东西 PCRE(Perl Compatible Regular Expressions) 是一个Perl库,包括 perl 兼容的正则表达式库。nginx 的 http 模块使用 pcre 来解析正则表达式,所以需要在 linux 上安装 pcre 库,pcre-devel 是使用 pcre 开发的一个二次开发库。nginx也需要此库。命令: yum install -y pcre pcre-devel zlib 库提供了很多种压缩和解压缩的方式, nginx 使用 zlib 对 http 包的内容进行 gzip ,所以需要在 Centos 上安装 zlib 库。 yum install -y zlib zlib-devel 虽然我安装的时候安装着两个儿就可以了,但是如果有需要,根据error提示可能还需要GCC和OpenSSL yum install gcc-c++ yum install -y openssl openssl-devel 好,现在我们开始安装nginx,1.14.0这个是目前最新版本 wget -c https://nginx

《Nginx系列》之青铜入门篇 反向代理 负载均衡 动静分离就是这么简单

感情迁移 提交于 2020-01-06 16:10:41
1.什么是Nginx? Nginx是一个高性能的自由、开源的HTTP和 反向代理服务器 ,特点是 占用内存少 , 并发性能强 。 nginx能干嘛? 可以作为IMAP、POP3、SMTP的代理服务器; 可以作为HTTP服务器进行网站的发布处理; 可以作为反向代理进行负载均衡的实现; 2.Nginx的安装 2.1 将Nginx相关安装包上传到服务器上 [root@localhost nginx-1.12]# ls -l 总用量 2956 -rw-r--r--. 1 root root 981687 12月 21 16:09 nginx-1.12.2.tar.gz -rw-r--r--. 1 root root 2041593 12月 21 16:09 pcre-8.37.tar.gz nginx-1.12.2.tar.gz :nginx源码包,用于安装Nginx pcre-8.37.tar.gz :Perl库, 是一个用C语言编写的正则表达式函数库 。 2.2 安装pcre 解压pcre源码安装包 [root@localhost nginx-1.12]# tar zxf pcre-8.37.tar.gz 编译安装pcre [root@localhost pcre-8.37]# ./configure checking for a BSD-compatible install...

Nginx高级配置

倖福魔咒の 提交于 2020-01-06 15:29:55
1 nginx状态页 在编译的时候需要添加--with-http_stub_status_module参数 配置案例: [root@CentOS7-01 ~]#cat /apps/nginx/conf/vhosts/pc.conf server { listen 80; server_name www.hechunping.tech; location /nginx_status { stub_status; allow 192.168.7.0/24; allow 127.0.0.1; deny all; } } [root@CentOS7-01 ~]#systemctl reload nginx 访问测试 [root@CentOS7-01 ~]#curl www.hechunping.tech/nginx_status Active connections: 1 server accepts handled requests 32 32 36 #这三个数字分别对应accepts,handled,requests三个值 Reading: 0 Writing: 1 Waiting: 0 相关解释: Active connections: 当前处于活动状态的客户端连接数,包括连接等待空闲连接数。 accepts: 统计总值,Nginx⾃启动后已经接受的客户端请求的总数。 handled

Nginx基础

早过忘川 提交于 2020-01-05 00:06:57
简介 Nginx: engine X,2002年开始开发,2004年开源,2019年3月11日,Nginx公司被F5 Network以6.7亿美元收购。 Nginx是免费的、开源的、高性能的HTTP和反向代理服务器、邮件代理服务器,以及TCP/UDP代理服务器,解决了C10K问题(10K Connections),http://www.ideawu.net/blog/archives/740.html Nginx官网:http://nginx.org Nginx 商业版为Nginx Plus:https://www.nginx.com/products/nginx/ nginx的其它的二次发行版: Tengine:由淘宝网发起的Web服务器项⽬。它在Nginx的基础上,针对⼤访问量⽹ 站的需求,添加了很多⾼级功能和特性。Tengine的性能和稳定性已经在⼤型的网站如淘宝网,天猫商城等得到了很好的检验。它的最终⽬标是打造⼀个高效、稳定、安全、易⽤的Web平台,从2011年12⽉开始,Tengine成为⼀个开源项⽬,官⽹ http://tengine.taobao.org/ OpenResty:基于 Nginx 与 Lua 语言的高性能 Web 平台, 章亦春团队开发,官⽹:http://openresty.org/cn/ 1 Nginx功能介绍 静态的web资源服务器html,图⽚

浅谈Nginx主配置文件

泪湿孤枕 提交于 2020-01-02 15:32:45
浅谈Nginx主配置文件 1️⃣ Nginx配置文件组成部分 2️⃣ Nginx主配置文件结构 3️⃣ Nginx 全局配置 🅿 1.正常运行必备的配置 🅿 2.性能优化相关的配置 🅿 3.事件驱动相关的配置 🅿 4.调试和定位配置 1️⃣ Nginx配置文件组成部分 Nginx的配置⽂件的组成部分: 主配置⽂件: nginx.conf ,⼦配置⽂件 include conf.d/*.conf 主配置文件各种配置段的的详细配置选项信息见:http://nginx.org/en/docs/ngx_core_module.html 配置文件的结构: 段:如 http{} 、 event{} 、 server{} 、 location{} 等,段可以并列,也可以嵌套。 块:指的就是在段里定义的一组directives(配置指令)。 directive:指的就是块里的一条条配置指令。指令定义方法: directive value [value2 ...];。 注意: (1) 指令必须以分号结尾。 (2)嵌套的段是有层级结构的,比如http段里,遵循http{}–>server{}–>location{}这种嵌套结构。 (3) 支持使用配置变量: 内建变量:由Nginx模块引入,可直接引用。 自定义变量:由用户使用set命令定义。 定义变量: set variable_name value;