nginx
程序猿阿三
Good ideal worth spreading
展开
-
Nginx 模块自主开发四: 模块数据结构
其中,ngx_module_s,这 个是 每个新的模块的定义struct ngx_module_s { /*ctx_index表示当前模块在这类模块中的序号。这个 成员常常是由管理模块的 一个Nginx核心模块设置的,对于所有的http模块而言,ctx_index是由核心模块ngx_http_module设置的,ctx_index非常重要,Nginx的模块化设计非常依赖各个模块的顺序*/原创 2016-06-24 11:07:44 · 1158 阅读 · 0 评论 -
Nginx 模块自主开发八: 总结 Nginx框架的流程
前面两篇博客:Nginx 模块自主开发六:源码剖析配置文件解析过程和 Nginx 模块自主开发七:源码剖析整个Nginx框架从源码层面上解析Nginx框架,这样导致太过于 细节,所以本篇博客将带领你系统上过一遍Nginx框架Nginx主框架的流程当启动Nginx程序时候,Nginx从入口函数Main()开始执行,检查命令行参数和环境变量,初始化ngx_modules数组,然后进入初始化函数ngx_原创 2016-07-01 15:16:06 · 1022 阅读 · 0 评论 -
Nginx 模块自主开发七:源码剖析整个Nginx框架
在博客提到的Nginx 模块自主开发四: 模块数据结构一个很重要的数据结构ngx_module_s,所有的模块都是用这个结构体来表示。ngx_module_t结构体 模块又分为ngx_core_module_t和ngx_xxx_module_t,而在ngx_module_t中会包含这两个结构,只不过不同类的模块包含不同的结构,一般会 用ctx表示,ngx_module_t又用type这个域用来表原创 2016-06-30 11:40:51 · 12400 阅读 · 11 评论 -
三:深入理解Nginx的模块化 (结合源码详解)
盗用前面用到的流程图 第二步实际上是调用 ngx_add_inherited_sockets()//文件名: Nginx.cint ngx_cdeclmain(int argc, char *const *argv){ ... if (ngx_add_inherited_sockets(&init_cycle) != NGX_OK) { return 1;原创 2016-06-20 10:56:16 · 2028 阅读 · 0 评论 -
Nginx 模块自主开发十: 设计一个基于NGINX 的缓存服务
计算机不仅需要对计算机理论有一定的要求,同时要学以致用,这篇博客将结合公司给我的一个问题,我自主设计一个初步的方案 ,如何 有什么bug或是想法,可以提出来,我一直秉承一个思想:good idea worth spreading.只有将自己的学习计划放在互联网上,才会进步得更快。问题 将磁盘文件分块加载到内存,一般来说磁盘文件远大于内存空间,所以将磁盘文件分块,部分读入内存,系统预分配内存空间原创 2016-07-06 09:10:30 · 690 阅读 · 3 评论 -
四:深入Nginx之事件和连接 (之一)
Nginx 本质上是基于事件驱动的Web服务器,事件 处理框架所要解决的问题就是如何收集、管理、分发事件。 事件主要 以网络事件(TCP网络事件为主 )定时器事件 Nginx 定义一个 核心模块ngx_event_module,参考博客一深入理解Nginx的 模块化 ,全局观,Nginx在启动时会调用ngx_init_cycle方法 解析配置文件时,一旦 在nginx.conf中找到感兴趣的原创 2016-06-20 15:21:12 · 7061 阅读 · 0 评论 -
epoll之一:epoll的原理
之前 我写过一篇博客IO复用之select poll epoll 函数,大概介绍了一下epoll和select,poll的一些区别,接下来要 从原理剖析epoll的强大的原因select和poll的工作机制在某一时刻,进程收集有事件连接时,大部分的连接是没有发生事件,但是 select和poll的工作机制,在 每次收集事件 的 时候,都把全部 的 连接的 套接字传给操作系统(这首先就是用户态内存到原创 2016-06-22 13:36:33 · 539 阅读 · 0 评论 -
四:深入Nginx之事件和连接 (之二)
ngx_events_module 核心事件 定义新的事类型,并定义每个事件模块都需要实现的ngx_event_module_t接口,还需要管理这些事件模块生成的 配置 项结构体,并 解析事件类配置项,解析配置项时会调用其在ngx_command_t数组 中 定义的回调方法。 假设定义一个ngx_command_t(当然这个模块如何处理自己感兴趣的配置项),ngx_events_comma原创 2016-06-22 10:40:18 · 1061 阅读 · 0 评论 -
Nginx 进程间的关系
部署Nginx 都是使用一个 master进程来 管理多个 worker进程 ,一般情况下进程的数量与服务器 上 的CPU数量 相同,每一个worker的 进程都是繁忙的 。她们真正提供互联网服务,master进程只是 负责监控管理 worker进程,worker进程之间通过 共享内存 、原子操作等 一些进程 间的通信机制来实现负载均衡机制。为什么产品环境是按照master-worker方式进行的?原创 2016-06-08 14:00:27 · 2203 阅读 · 0 评论 -
四:深入Nginx之事件和连接 (之三:连接池)
在Nginx中的connection就是对TCP连接的封装,包括连接的socket、读事件、写事件。利用Nginx封装的connection,我们 可以很方便的使用nginx处理与连接相关的事情 ,所以Nginx不仅可以作为 一个 web服务器,也可以邮件服务器,同时也可以利用nginx提供的connection,可以实现与任何后端服务打交道。 流程:结合一个tcp连接的生命周期,首先nginx原创 2016-06-22 16:56:21 · 5055 阅读 · 1 评论 -
Nginx 模块自主开发一:开发前的了解
个人觉得要真正理解源码,如果 只停留在理论是远远不够,所以从现在起,要开始学习自己开发Nginx模块,再反过来理解Nginx本身代码。 Nginx 发送文件或转发 请求到其他服务器,有处理模块处理,但需要压缩或在服务端添加一些东西时,可以采用过滤模块,还是有一些核心模块主要负责管理网络层和应用层的 协议。如果处理模块把请求反向代理到后端的服务器,就变成另外一类的模块:负载均衡模块。负载均衡原创 2016-06-23 11:02:23 · 603 阅读 · 1 评论 -
一深入理解Nginx的 模块化 ,全局观
Nginx源码目录结构.├── auto 自动检测系统环境以及编译相关的脚本│ ├── cc 关于编译器相关的编译选项的检测脚本│ ├── lib nginx编译所需要的一些库的检测脚本│ ├── os 与平台相关的一些系统参数与系统调用相关的检测│ └── types 与数据类型相关的一原创 2016-06-15 14:44:28 · 4961 阅读 · 0 评论 -
Nginx配置正向代理
前面 已经有一篇博客 Nginx 代理缓存阐述了Nginx的正反向代理的差别(同时那篇主要也是讲解如何配置nginx反向代理),那么这篇博客就简单介绍一下Nginx配置正向代理(http proxy和https proxy) 废话不多说,进入正题nginx前向代理在 配置文件nginx.conf中HTTP{}中内容改写成以下内容server { resolver 8.8.8.8;原创 2016-06-15 12:38:08 · 11243 阅读 · 2 评论 -
Nginx 模块自主开发六:源码剖析配置文件解析过程
Nginx源码实现有一个很好的优点就是模块化,有点像面向对象语言的设计模式,实现“高内聚,松耦合”,这篇博客主要讲解模块的共有流程 集中在ngx_cycle.c、 ngx_process.c、 ngx_process_cycle.c 和 ngx_event.c代码中。 共有流程开始于解析 nginx 配置,这个过程集中在 ngx_init_cycle 函数中。 ngx_init_cy原创 2016-06-29 13:43:23 · 8051 阅读 · 0 评论 -
Nginx的命令行控制
默认方式启动/usr/local/nginx/sbin/nginx#这时会读取默认路径下的配置文件:/usr/local/nginx/conf/nginx.conf另行指定配置文件# 使用-c参数指定配置文件/usr/local/nginx/sbin/nginx -c /tmp/nginx.conf另行指定安装目录的启动方式/usr/local/nginx/sbin/nginx -p /usr/原创 2016-06-07 23:47:28 · 558 阅读 · 0 评论 -
Nginx 缓存机制 详解之一 缓存管理进程
Nginx缓存的基本思路就是利用请求的局部性原理,下次访问不再连接后端服务器。 Nginx是通过设置xxx_cache_path(比如proxy_cache_path),主要用来创建管理cache的共享 内存数据结构(红黑树和对列),另一个是xxx_cache主要 用来前面的参数创建内存空间。命令xxx_cache_path,会调用ngx_http_file_cache_set_slot函数原创 2016-06-24 18:12:22 · 11617 阅读 · 0 评论 -
Nginx 缓存机制 详解之二 缓存加载进程
上一篇博客已经详细讲解了缓存管理进程,接下来详细讲解缓存加载进程机制缓存加载进程机制ngx_cache_loader_process_handler函数 加载进程 和管理进程都是从函数ngx_cache_manager_process_cycle进入,只是接下来的流程函数不一样ngx_process_events_and_timers()->ngx_event_expire_timers()-原创 2016-06-24 19:05:48 · 1829 阅读 · 0 评论 -
GDB 调试 Nginx 磨刀不误砍柴工
源码分析工具windows平台首选的是sourceInsightlinux平台利用Vi,Taglist,Cscope以及Ctag这几个工具 结合使用有一个 更好的选择:Source Navigator测试辅助工具wget (最好是wget-1.13之后的 版本)curl (显示请求的 详细信息 )wireshark:抓包使用Nu:网络工具的瑞士刀fireFox:结合 firebug查原创 2016-06-09 08:53:26 · 2097 阅读 · 0 评论 -
Ngnix 的代码分析
说明:上一节Gdb 调Nginx,这一节我们深入代码本身,以下是我个人对Nginx代码的初步理解,若有出错,不吝赐教。Nginx两大进程核心进程:包括监控进程和工作进程Cache进程:Cache管理进程和Cache加载进程Nginx核心进程模型 Ngnix的进程模型将进程分成监控进程和工作进程两类,启动Nginx的主进程将充当监控进程,而由主进程fork()出来的子进程则充当工作进程。工作原创 2016-06-10 10:02:25 · 2844 阅读 · 0 评论 -
从源码解析Nginx对 Native aio支持
使用异步I/O大大提高应用程序的性能 linux下有两种aio,一种是glibc实现的aio,这个比较烂,它是直接在用户空间用pthread进行模拟的。还有一种就是内核实现的aio,这些系统调用是以io_xxx开始的。下面将针对 同步和异步模型,以及阻塞和非阻塞的模型进行介绍。而native aio的优点就是能够同时提交多个io请求给内核,然后直接由内核的io调度算法去处理这些请求(direct原创 2016-06-27 11:43:59 · 6827 阅读 · 0 评论 -
从流程解析Nginx对 Native aio支持
强烈建议这篇博客和从源码解析Nginx对 Native aio支持一起阅读异步I/O 异步IO就是把IO提交给系统,让系统替你做,做完了再用某种方式通知你(通过信号,或者其他异步方式通知,这时候,操作系统已经帮你完成IO操作,具体来说就是你那个作为传入参数的的buffer的指针所指向的空间已经读到了数据或者你的buffer的数据已经写出去了)非阻塞I/O 非阻塞IO就是你要通过某种方式不定原创 2016-06-27 16:12:18 · 2778 阅读 · 0 评论 -
Nginx 安装
今天第一天来实习,带我的老师叫我先了解nginx这个东东,所以对这个了解还是比较肤浅。这里面 有错误请大家积极指正。nginx简介Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器,Nginx是罗斯的程序设计师lgorsysoev所开发 将其源码以类BSD许可证的形式发布,可以运行在Unix、GUN/Linux、solaris、BSD、Microsof原创 2016-06-07 17:09:55 · 1127 阅读 · 0 评论 -
Nginx TCP/UDP 代理
这个模块可以实现基于TCP、UDP和Unix域的socket的协议的代理服务。这个 模块是在nginx-1.9 以后版本才添加的模块,如果要使用这个模块的话,要重新编译这个源代码,参考之前的的博客nginx安装,添加编译选项--with-stream。就可以使用 这个模块配置基于TCP连接和UDP的数据报的反向代理1.创建最顶层的stream {}块stream{....}2.可以在str原创 2016-06-14 14:26:33 · 12585 阅读 · 4 评论 -
Nginx 配置
学了 nginx 命令行控制和 nginx进程间的 关系,接下来就 进入到Nginx的配置环节Nginx服务的基本 配置主要分为下面4类 + 用于调试、定位 + 正常运行的配置 + 优化性能的配置项 + 事件类的配置项 有一些配置项,即使没有显示地进行配置,他也会默认值用于调试进程和定位 问题 的配置项1.是否以守护进程的方式运行Nginx 设置方法 :daemon on | of原创 2016-06-08 16:44:00 · 601 阅读 · 0 评论 -
Nginx 模块自主开发二:Nginx的类型命名封装
我们在看Nginx源代码的时候,看不到我们以前在写C语言的类型名称(比如int,char等),其实是Nginx为了跨平台习惯将一些 C语言的东西进行了封装,所以在编写自己的模块的 时候,建议尽量沿用Nginx的习惯。整型封装typedef intptr_t ngx_int_t;typedef uintptr_t ngx_uint_t;ngx_str_t 数据结构体原创 2016-06-23 14:29:49 · 803 阅读 · 0 评论