![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
nginx
文章平均质量分 65
wangpengqi
这个作者很懒,什么都没留下…
展开
-
Nginx 源码编译
1、首先在官网下载Nginx 发布版的源码,Nginx 官网下载的地址是 :http://www.nginx.org/en/download.html因为Nginx官网支持SVN,可以简单方便的使用svn下载的是Nginx 1.3.0 版源码编译,命令如下:svn checkout svn://svn.nginx.org/nginx/tags/release-1.3.0转载 2013-12-09 13:53:04 · 860 阅读 · 0 评论 -
Nginx基本数据结构之ngx_hash_wildcard_t
nginx为了处理带有通配符的域名的匹配问题,实现了ngx_hash_wildcard_t这样的hash表。他可以支持两种类型的带有通配符的域名。一种是通配符在前的,例如:“*.abc.com”,也可以省略掉星号,直接写成”.abc.com”。这样的key,可以匹配www.abc.com,qqq.www.abc.com之类的。另外一种是通配符在末尾的,例如:“mail.xxx.*”,请特别注意通配转载 2013-12-10 17:16:14 · 2054 阅读 · 0 评论 -
Nginx基本数据结构之ngx_list_t
ngx_list_t顾名思义,看起来好像是一个list的数据结构。这样的说法,算对也不算对。因为它符合list类型数据结构的一些特点,比如可以添加元素,实现自增长,不会像数组类型的数据结构,受到初始设定的数组容量的限制,并且它跟我们常见的list型数据结构也是一样的,内部实现使用了一个链表。那么它跟我们常见的链表实现的list有什么不同呢?不同点就在于它的节点,它的节点不像我们常见的lis转载 2013-12-10 17:19:52 · 974 阅读 · 0 评论 -
Nginx基本数据结构之ngx_queue_t
ngx_queue_t是nginx中的双向链表,在nginx源码目录src/core下面的ngx_queue.h|c里面。它的原型如下:typedef struct ngx_queue_s ngx_queue_t;struct ngx_queue_s { ngx_queue_t *prev; ngx_queue_t *next;};不同于教科书转载 2013-12-10 17:20:33 · 1229 阅读 · 0 评论 -
nginx基础概念(100%)之connection
在nginx中connection就是对tcp连接的封装,其中包括连接的socket,读事件,写事件。利用nginx封装的connection,我们可以很方便的使用nginx来处理与连接相关的事情,比如,建立连接,发送与接受数据等。而nginx中的http请求的处理就是建立在connection之上的,所以nginx不仅可以作为一个web服务器,也可以作为邮件服务器。当然,利用nginx提供的co转载 2013-12-10 15:18:47 · 2879 阅读 · 0 评论 -
nginx基础概念(100%)之pipe
在http1.1中,引入了一种新的特性,即pipeline。那么什么是pipeline呢?pipeline其实就是流水线作业,它可以看作为keepalive的一种升华,因为pipeline也是基于长连接的,目的就是利用一个连接做多次请求。如果客户端要提交多个请求,对于keepalive来说,那么第二个请求,必须要等到第一个请求的响应接收完全后,才能发起,也就是说,请求是串行进行的,一个请求接着下一转载 2013-12-10 15:50:49 · 2512 阅读 · 0 评论 -
Nginx基本数据结构之ngx_hash_t
ngx_hash_t是nginx自己的hash表的实现。定义和实现位于src/core/ngx_hash.h|c中。ngx_hash_t的实现也与数据结构教课书上所描述的hash表的实现是大同小异。对于常用的解决冲突的方法有线性探测,二次探测和开链法等。ngx_hash_t使用的是最常用的一种,也就是开链法,这也是STL中的hash表使用的方法。但是ngx_hash_t的实现又有其几个显著转载 2013-12-10 16:54:35 · 1524 阅读 · 0 评论 -
Nginx基本数据结构之ngx_hash_combined_t
组合类型hash表,该hash表的定义如下:typedef struct { ngx_hash_t hash; ngx_hash_wildcard_t *wc_head; ngx_hash_wildcard_t *wc_tail;} ngx_hash_combined_t;从其定义显见,该类型实际上包含了三个hash表转载 2013-12-10 17:16:50 · 1008 阅读 · 0 评论 -
Nginx基本数据结构之ngx_hash_keys_arrays_t
大家看到在构建一个ngx_hash_wildcard_t的时候,需要对通配符的哪些key进行预处理。这个处理起来比较麻烦。而当有一组key,这些里面既有无通配符的key,也有包含通配符的key的时候。我们就需要构建三个hash表,一个包含普通的key的hash表,一个包含前向通配符的hash表,一个包含后向通配符的hash表(或者也可以把这三个hash表组合成一个ngx_hash_combined转载 2013-12-10 17:17:33 · 1250 阅读 · 0 评论 -
Nginx基本数据结构之ngx_chain_t
nginx的filter模块在处理从别的filter模块或者是handler模块传递过来的数据(实际上就是需要发送给客户端的http response)。这个传递过来的数据是以一个链表的形式(ngx_chain_t)。而且数据可能被分多次传递过来。也就是多次调用filter的处理函数,以不同的ngx_chain_t。该结构被定义在src/core/ngx_buf.h|c。下面我们来看一下n转载 2013-12-10 17:18:23 · 3725 阅读 · 0 评论 -
nginx的模块化体系结构
nginx的内部结构是由核心部分和一系列的功能模块所组成。这样划分是为了使得每个模块的功能相对简单,便于开发,同时也便于对系统进行功能扩展。为了便于描述,下文中我们将使用nginx core来称呼nginx的核心功能部分。nginx提供了web服务器的基础功能,同时提供了web服务反向代理,email服务反向代理功能。nginx core实现了底层的通讯协议,为其他模块和nginx进程构建了基转载 2013-12-12 11:36:33 · 2700 阅读 · 0 评论 -
Nginx基本数据结构之ngx_array_t
ngx_array_t是nginx内部使用的数组结构。nginx的数组结构在存储上与大家认知的C语言内置的数组有相似性,比如实际上存储数据的区域也是一大块连续的内存。但是数组除了存储数据的内存以外还包含一些元信息来描述相关的一些信息。下面我们从数组的定义上来详细的了解一下。ngx_array_t的定义位于src/core/ngx_array.c|h里面。typedef struct转载 2013-12-10 16:53:35 · 909 阅读 · 0 评论 -
Nginx基本数据结构之ngx_pool_t
ngx_pool_t是一个非常重要的数据结构,在很多重要的场合都有使用,很多重要的数据结构也都在使用它。那么它究竟是一个什么东西呢?简单的说,它提供了一种机制,帮助管理一系列的资源(如内存,文件等),使得对这些资源的使用和释放统一进行,免除了使用过程中考虑到对各种各样资源的什么时候释放,是否遗漏了释放的担心。例如对于内存的管理,如果我们需要使用内存,那么总是从一个ngx_pool_t的对象转载 2013-12-10 16:49:39 · 1007 阅读 · 0 评论 -
Nginx学习之二-配置项解析及编程实现
在开发功能灵活的Nginx模块时,需要从配置文件中获取特定的信息。不过,我们并不需要再编写一套读取配置的系统,Nginx已经为用户提供了强大的配置项解析机制,同时还支持“-s reload”命令,可以在不重启服务的情况下可使配置生效。一、Nginx配置文件简介如果编译安装Nginx时使用默认路径,那么Nginx运行目录是/usr/local/nginx,其配置文件存放目转载 2013-12-09 17:09:01 · 1084 阅读 · 0 评论 -
关于Nginx的配置文件解析
(大部分内容是基于作者本人的理解和在网络上搜索到的资料整合而成)由于本人理解能力有限,若有不足或错误之处还请各位看官多多指点! 关于Nginx的主配置文件(/etc/nginx/nginx.conf)Nginx 的配置文件主要分为4部分:main (全局设置) -> 此部分设置的指令将影响其它所有设置server (主机设置)转载 2013-12-09 15:57:31 · 3597 阅读 · 0 评论 -
Nginx经验总结
1. post方法请求静态文件默认情况下,web服务器都不允许post方法请求静态文件,会返回响应403 Not Allowed。但是有些时候确实有这种需求。可以通过配置文件来改变这种设置:在需要处理静态文件的location里这样配置即可,[plain] view plaincopyprint?location /static/ {转载 2013-12-10 09:55:13 · 1139 阅读 · 0 评论 -
nginx基础概念(100%)之keepalive
当然,在nginx中,对于http1.0与http1.1也是支持长连接的。什么是长连接呢?我们知道,http请求是基于TCP协议之上的,那么,当客户端在发起请求前,需要先与服务端建立TCP连接,而每一次的TCP连接是需要三次握手来确定的,如果客户端与服务端之间网络差一点,这三次交互消费的时间会比较多,而且三次交互也会带来网络流量。当然,当连接断开后,也会有四次的交互,当然对用户体验来说就不重要了。转载 2013-12-10 15:45:13 · 8442 阅读 · 0 评论 -
初探nginx架构(100%)
众所周知,nginx性能高,而nginx的高性能与其架构是分不开的。那么nginx究竟是怎么样的呢?这一节我们先来初识一下nginx框架吧。nginx在启动后,在unix系统中会以daemon的方式在后台运行,后台进程包含一个master进程和多个worker进程。我们也可以手动地关掉后台模式,让nginx在前台运行,并且通过配置让nginx取消master进程,从而可以使nginx以单进转载 2013-12-10 15:08:03 · 10221 阅读 · 0 评论 -
nginx基础概念(100%)之request
这节我们讲request,在nginx中我们指的是http请求,具体到nginx中的数据结构是ngx_http_request_t。ngx_http_request_t是对一个http请求的封装。 我们知道,一个http请求,包含请求行、请求头、请求体、响应行、响应头、响应体。http请求是典型的请求-响应类型的的网络协议,而http是文件协议,所以我们在分析请求行与请求头,以及输出响应行转载 2013-12-10 15:38:03 · 1893 阅读 · 0 评论 -
nginx基础概念(100%)之lingering_close
lingering_close,字面意思就是延迟关闭,也就是说,当nginx要关闭连接时,并非立即关闭连接,而是先关闭tcp连接的写,再等待一段时间后再关掉连接的读。为什么要这样呢?我们先来看看这样一个场景。nginx在接收客户端的请求时,可能由于客户端或服务端出错了,要立即响应错误信息给客户端,而nginx在响应错误信息后,大分部情况下是需要关闭当前连接。nginx执行完write()系统调用把转载 2013-12-10 16:09:21 · 6504 阅读 · 0 评论 -
Nginx基本数据结构之ngx_str_t
nginx的作者为追求极致的高效,自己实现了很多颇具特色的nginx风格的数据结构以及公共函数。比如,nginx提供了带长度的字符串,根据编译器选项优化过的字符串拷贝函数ngx_copy等。所以,在我们写nginx模块时,应该尽量调用nginx提供的api,尽管有些api只是对glibc的宏定义。本节,我们介绍string、list、buffer、chain等一系列最基本的数据结构及相关api的使转载 2013-12-10 16:27:58 · 14355 阅读 · 1 评论 -
Nginx基本数据结构之ngx_buf_t
这个ngx_buf_t就是这个ngx_chain_t链表的每个节点的实际数据。该结构实际上是一种抽象的数据结构,它代表某种具体的数据。这个数据可能是指向内存中的某个缓冲区,也可能指向一个文件的某一部分,也可能是一些纯元数据(元数据的作用在于指示这个链表的读取者对读取的数据进行不同的处理)。该数据结构位于src/core/ngx_buf.h|c文件中。我们来看一下它的定义。s转载 2013-12-10 17:19:15 · 7906 阅读 · 0 评论 -
nginx源码分析(2)——http模块的初始化过程
前一篇文章介绍了nginx的启动初始化过程,包括了所有模块的初始化过程,比如http模块、事件模块等。这里再详细介绍一下http模块的启动过程,还记得在前一篇文章中提到过ngx_conf_parse函数背后隐藏了大量的细节吗?这里就揭开这层神秘的面纱,去看看几个重要的http模块是如何初始化的。这里依然沿用上一篇文章的结构,首先来看几个重要的数据结构。1. 重要的数据结构转载 2013-12-10 14:49:06 · 1447 阅读 · 0 评论 -
模块的基本结构
handler模块简介相信大家在看了前一章的模块概述以后,都对nginx的模块有了一个基本的认识。基本上作为第三方开发者最可能开发的就是三种类型的模块,即handler,filter和load-balancer。Handler模块就是接受来自客户端的请求并产生输出的模块。有些地方说upstream模块实际上也是一种handler模块,只不过它产生的内容来自于从后端服务器获取的,而非在本机产转载 2013-12-12 11:54:58 · 3468 阅读 · 0 评论