nginx
文章平均质量分 79
摩力克
拥有超过15年开发经验,精通网络通信、网络安全和Python开发,希望通过分享和大家共同进步。
展开
-
nginx upstream使用及源码解析
nginx upstream机制使得nginx可以成为一个反向代理服务器,nginx一方面从下游客户端接收http请求,处理请求,并根据请求发送tcp报文到上游服务器,根据上游服务器的返回报文,来向下游客户端发送请求响应报文。upstream机制也提供了负载分担的功能,可以将请求负载分担到集群服务器的某个服务器上面。2.1upstream的流程介绍1分析客户端请求报文,转载 2016-05-12 14:44:29 · 4473 阅读 · 0 评论 -
【Linux学习】epoll详解
什么是epollepoll是什么?按照man手册的说法:是为处理大批量句柄而作了改进的poll。当然,这不是2.6内核才有的,它是在2.5.44内核中被引进的(epoll(4) is a new API introduced in Linux kernel 2.5.44),它几乎具备了之前所说的一切优点,被公认为Linux2.6下性能最好的多路I/O就绪通知方法。 epol转载 2015-11-04 12:00:51 · 336 阅读 · 0 评论 -
将nginx编译成静态库
库是一种软件组件技术,库里面封装了数据和函数。库的使用可以使程序模块化。Windows系统包括静态链接库(.lib文件)和动态链接库(.dll文件)。Linux通常把库文件存放在/usr/lib或/lib目录下。Linux库文件名由:前缀lib、库名和后缀3部分组成,其中动态链接库以.so最为后缀,静态链接库通常以.a作为后缀。在程序中使用使用静态库和动态库原创 2015-11-18 15:31:28 · 2926 阅读 · 0 评论 -
gdb调试nginx
1、启动gdb【root】gdb2、设置调试子进程(gdb) set follow-fork-mode child3、执行调试文件(gdb) file test4、设置子进程断点(gdb) b son_thread_fun5、 程序运行到断点处(gdb) r6、单步跟踪(gdb) n 用n单步跟踪,不进入函数调用(gdb) s 用s原创 2015-11-25 13:55:11 · 511 阅读 · 0 评论 -
nginx配置location总结及rewrite规则写法
location正则写法一个示例:location = / { # 精确匹配 / ,主机名后面不能带任何字符串 [ configuration A ] }location / { # 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求 # 但是正则和最长字符串会优先匹配 [ configuration B ] }location /docum转载 2015-12-10 14:56:35 · 293 阅读 · 0 评论 -
nginx日志模块分析详解
本节内容:Nginx日志模块 在Nginx中,ngx_errlog_module模块专门用于处理nginx日志信息,是nginx的core模块之一;通过解析error_log配置项将不同等级的日志信息输出到指定的文件中。nginx启动过程中在解析配置文件时遇到error_log 配置项就调用errlog模块的ngx_error_log函数来解析。ngx_error_lo转载 2015-11-02 16:01:00 · 3444 阅读 · 0 评论 -
nginx源码分析—处理继承的sockets
Content0.序1.侦听结构2. ngx_add_inherited_sockets()分析3. ngx_set_inherited_sockets()分析4.小结 0.序 本文将着重分析初始化过程中如何处理继承的sockets。文中如无特别说明,.表示nginx-1.0.4代码目录,本文为/usr/src/ng转载 2015-11-02 17:39:16 · 491 阅读 · 0 评论 -
NGINX原理分析 之 SLAB分配机制
1 引言 众所周知,操作系统使用伙伴系统管理内存,不仅会造成大量的内存碎片,同时处理效率也较低下。SLAB是一种内存管理机制,其拥有较高的处理效率,同时也有效的避免内存碎片的产生,其核心思想是预分配。其按照SIZE对内存进行分类管理的,当申请一块大小为SIZE的内存时,分配器就从SIZE集合中分配一个内存块(BLOCK)出去,当释放一个大小为SIZE的内存时,则将该内存块放回到原有集合,转载 2015-11-02 17:16:06 · 581 阅读 · 0 评论 -
nginx源码剖析 从main函数看nginx启动流程
俗话说的好,牵牛要牵牛鼻子 驾车顶牛,处理复杂的东西,只要抓住重点,才能理清脉络,不至于深陷其中,不能自拔。对复杂的nginx而言,main函数就是“牛之鼻”,只要能理清main函数,就一定能理解其中的奥秘,下面我们就一起来研究一下nginx的main函数。1.nginx的main函数解读nginx启动显然是由main函数驱动的,main函数在在core/nginx.c文件转载 2015-11-03 10:16:42 · 2590 阅读 · 0 评论 -
Nginx内存管理及数据结构浅析–共享内存的实现
nginx是多进程模型,在许多场景我们可能需要跨进程共享数据,考虑到这个可能性,nginx本身也提供了共享内存这方面的接口。ngx_int_t ngx_shm_alloc(ngx_shm_t *shm);这个是nginx中关于分配共享内存最底层的接口了,它实际上就是直接调用mmap进行共享内存的分配的。对于需要多次分配和释放共享内存的场景来说,直接用这个接口实际是无法忍受效率上的问转载 2015-11-02 16:08:02 · 1849 阅读 · 0 评论 -
EPOLL 事件之 EPOLLRDHUP
在对系统问题进行排查时,我发现了一个奇怪的现象:明明是对方断开请求,系统却报告一个查询失败的错误,但从用户角度来看请求的结果正常返回,没有任何问题。对这个现象深入分析后发现,这是一个基于 epoll 的连接池实现上的问题,或者说是特性 :)首先解释一下导致这个现象的原因。在使用 epoll 时,对端正常断开连接(调用 close()),在服务器端会触发一个 epoll 事件转载 2015-11-17 09:18:09 · 13077 阅读 · 0 评论 -
nginx源码分析—模块及其初始化(二)
ontent0. 序1. nginx有哪些模块?2. nginx如何描述这些模块?2.1 模块数据结构2.1.1 ngx_module_t结构2.1.2 ngx_command_t结构2.2 模块类图3. nginx如何组织这些模块?3.1 全局数组ngx_modules3.2 模块组织结构图4. nginx的转载 2015-10-30 12:08:19 · 554 阅读 · 0 评论 -
nginx的进程模型
1 进程间的通信方式 使用 UNIX域套接字 socketpair() 异步通讯机制: nginx在创建worker前将先调用 socketpair(int channel[2]) 然后将 channel[0-1]设置为异步通知方式,并注册evnet事件,父进程使用channel[0],子进程使用channel[1]实现双方的通讯.1.1 创建子进程时用到的标示转载 2015-11-03 11:37:47 · 436 阅读 · 0 评论 -
socketpair理解
先说说我的理解:socketpair创建了一对无名的套接字描述符(只能在AF_UNIX域中使用),描述符存储于一个二元数组,eg. s[2] .这对套接字可以进行双工通信,每一个描述符既可以读也可以写。这个在同一个进程中也可以进行通信,向s[0]中写入,就可以从s[1]中读取(只能从s[1]中读取),也可以在s[1]中写入,然后从s[0]中读取;但是,若没有在0端写入,而从1端读取,则1端的读取操转载 2015-11-03 14:01:30 · 296 阅读 · 0 评论 -
Nginx、Tomcat、SSL、双向认证
1. 证书层级结构2. 服务器结构tomcat不要求认证客户端,nginx要求认证客户端3. tomcat配置注意点tomcat的服务器证书的CN必须为tomcat_backend4. nginx配置注意点使用openssl从pfx文件中导出pem格式公钥1openssl pkcs1转载 2016-05-25 11:14:43 · 995 阅读 · 0 评论 -
Nginx中为http请求或响应添加头部字段
0.序1.upload模块中添加头部字段2.Nginx对于ngx_http_headers_out_t headers_out.headers成员变量的处理 1)请求: 2)响应:3.向请求或者响应中添加头部字段 1)程序 在请求中添加头部字段 helloHeaders 内容123344转载 2016-05-24 11:27:12 · 14774 阅读 · 0 评论 -
nginx中的ngx_cdecl
看nginx的代码时,发现有些函数返回值之后,还有一个ngx_cdecl关键字,如:帮助1234567intngx_cdeclmain(intargc, char*const*argv){ ngx_int_t i; ngx_log_t *log;转载 2016-01-29 10:16:16 · 1345 阅读 · 0 评论 -
Nginx reopen reload作用及工作过程
一.Nginx简介Nginx (“engine x”) 是俄罗斯人Igor Sysoev(塞索耶夫)编写的一款高性能的 HTTP 和反向代理服务器。Nginx 已经在俄罗斯最大的门户网站── Rambler Media(www.rambler.ru)上运行了4年时间,同时俄罗斯超过20%的虚拟主机平台采用Nginx作为反向代理服务器。在国内,已经有新浪博客、新浪播客、搜狐通行证、网易新闻、转载 2016-01-04 11:17:29 · 2194 阅读 · 0 评论 -
nginx keepalive连接回收机制
我在nginx 1.0.12代码中发现了名为ngx_reusable_connection的函数(它是在哪个版本里被加上的就不去追究了),很好奇这个函数是做什么的。后来有一次在我的群里讨论nginx的时候,有人发现了一个奇怪的现象,这位同学报告说:并发量大的时候,一些keepalive的连接会被新连接给挤掉。。。 关于这个问题,切入点在ngx_get_connection,并转载 2015-12-17 14:54:14 · 702 阅读 · 0 评论 -
Nginx变量的源码分析
nginx中的变量在nginx中的使用非常的多,正因为变量的存在,使得nginx在配置上变得非常灵活。我们知道,在nginx的配置文件中,配合变量,我们可以动态的得到我们想要的值。最常见的使用是,我们在写access_log的格式时,需要用到多很多变量。而这些变量是如何工作的呢?我们可以输出哪些变量?我们又怎么才能输出自己想要的内容呢?当然,我们可能还想知道,如何在我们的模块里面去使用转载 2015-12-17 11:20:32 · 375 阅读 · 0 评论 -
locations 设计和实现
Locations 数据结构及初始化1) 先看看 ngx_http_core_loc_conf_t 这个结构体struct ngx_http_core_loc_conf_s { // location 名称 ngx_str_t name; // 如果是 re location,这里存储 re 信息 #if (NGX_PCRE)转载 2015-12-17 10:19:33 · 589 阅读 · 0 评论 -
nginx rewrite if指令剖析
0. 前言nginx的if功能确实是弱得可以,严重影响了生产效率。故此,先提出严正抗议!1. if指令配置的实现对于这个功能奇弱的if指令,nginx实现得还特别复杂。下面将对其实现进行剖析。1.1. 指令解析if 指令由ngx_http_rewrite_if函数负责解析。这个函数的主要工作是543: ctx = ngx_pca转载 2015-12-17 10:11:04 · 1160 阅读 · 0 评论 -
nginx 优化(突破十万并发)
一般来说nginx 配置文件中对优化比较有作用的为以下几项:worker_processes 8;nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数。worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;为每个进程转载 2015-12-30 11:30:23 · 287 阅读 · 0 评论 -
nginx模块开发—HTTP初始化之listen
1、知识百科nginx作为一个高性能的HTTP服务器,网络的处理是其核心,了解网络的初始化有助于加深对nginx网络处理的了解。与网络有关的配置命令主要有两个:listen和sever_name。listen命令设置nginx监听地址,对于IP协议,这个地址就是address和port,对于UNIX域套接字协议,这个地址就是path,一条listen指令只能指定一个address或者por转载 2015-11-19 16:51:06 · 1646 阅读 · 0 评论 -
nginx如何利用ngx_channel_t在进程间传递消息
多进程你可能很熟悉,也许有一套自己的使用习惯和方法。这东西没有什么权威建议,书上只是给出了基本知识点,至于具体怎么去用,因人而异。nginx在多进程设计方面有很多值得学习和借鉴的东西,我认为是一套比较好的实现方案。你也许认为这东西很简单,是老生常谈的东西了,但是我这里要提醒你一下,俗话道酒是陈的香,越经典的东西越值得去琢磨,不要对自己太自信。善于思考的家伙总是会在一些老的技术上给你许多新鲜的见解,原创 2015-11-03 15:06:58 · 559 阅读 · 0 评论 -
nginx源码分析—队列结构ngx_queue_t
Content0. 序1. 队列结构2. 队列操作2.1 在头节点之后插入2.2 在尾节点之后插入2.3 删除节点2.4 分割队列2.5 链接队列2.6 获取中间节点2.7 队列排序2.8 如何获取队列节点数据3. 一个例子3.1代码3.2如何编译3.3 运行结果4.小结转载 2015-10-30 09:55:12 · 519 阅读 · 0 评论 -
nginx源码分析—链表结构ngx_list_t
Content1.链表结构1.2 ngx_list_t的逻辑结构2.1创建链表3.一个例子3.2如何编译4.小结0. 序 本文继续介绍nginx的容器——链表。链表实现文件:文件:./src/core/ngx_list.h/.c。.表示nginx-1.0.4代码目录,本文为/usr/src/nginx-1.转载 2015-10-30 09:19:53 · 511 阅读 · 0 评论 -
Nginx 源码完全剖析 nginx 自旋锁 ngx_spinlock
Nginx 是多进程模式的,一个 master 与多个 workers,一般工作在多核 CPU 上,所以自旋锁就是必须用到的。Nginx 中的自旋锁的定义,位于 ngx_spinlock.c 中,如下:voidngx_spinlock(ngx_atomic_t *lock, ngx_atomic_int_t value, ngx_uint_t spin){#if (NGX_HAVE_A转载 2015-11-11 14:15:39 · 615 阅读 · 0 评论 -
条件变量pthread_cond_t怎么用
最近看《UNIX环境高级编程》多线程同步,看到他举例说条件变量pthread_cond_t怎么用,愣是没有看懂,只好在网上找了份代码,跑了跑,才弄明白[cpp] view plaincopy#include #include #include pthread_mutex_t mutex = PTHREAD_MUTEX_IN转载 2015-11-11 10:44:56 · 568 阅读 · 0 评论 -
Nginx多线程原理
一、问题一般情况下,nginx 是一个事件处理器,一个从内核获取连接事件并告诉系统如何处理的控制器。实际上,在操作系统做读写数据调度的时候,nginx是协同系统工作的,所以nginx能越快响应越好。 nginx处理的事件可以是 超时通知、socket可读写的通知 或 错误通知。nginx 接收到这些消息后,会逐一进行处理。但是所有处理过程都是在一个简单的线程循环中完成的转载 2015-11-11 09:12:01 · 9251 阅读 · 0 评论 -
nginx多进程模型之热代码平滑升级
平滑升级的主要过程包括一下步骤: 1. 新代码make执行完后,这里不用在make install 了,接下来重名/sbin/nginx为nginx.old# mv /usr/local/nginx/sbin/nginx/usr/local/nginx/sbin/nginx.old 2. 复制编译后objs目录下的nginx文件到nginx的安装目录sbin转载 2015-11-06 15:37:20 · 555 阅读 · 0 评论 -
Nginx平滑升级的详细操作方法
一、平滑升级概述Nginx方便地帮助我们实现了平滑升级。其原理简单概括,就是:(1)在不停掉老进程的情况下,启动新进程。(2)老进程负责处理仍然没有处理完的请求,但不再接受处理请求。(3)新进程接受新请求。(4)老进程处理完所有请求,关闭所有连接后,停止。这样就很方便地实现了平滑升级。一般有两种情况下需要升级Nginx,一种是确实要升级Nginx的版本,另一种是要为Ngin转载 2015-11-06 16:07:00 · 716 阅读 · 0 评论 -
linux信号处理函数
linux中信号的处理一般分为四步1、信号集的安装和登记2、信号集操作3、信号的发送4、信号的接收 下面分阶段详细说明1、信号集的安装和登记使用sigaction函数对信号进行安装和登记ngx_init_signals(ngx_log_t *log){ ngx_signal_t *sig; struct sigaction原创 2015-11-06 10:52:27 · 660 阅读 · 0 评论 -
函数waitpid和WTERMSIG说明
waitpid系统调用在Linux函数库中的原型是:#include #include pid_t waitpid(pid_t pid,int *status,int options)从本质上讲,系统调用waitpid和wait的作用是完全相同的,但waitpid多出了两个可由用户控制的参数pid和options,从而为我们编程提供了另一种更灵原创 2015-11-06 12:02:19 · 4385 阅读 · 0 评论 -
标题:用kill函数传递信号 int kill(pid_t pid,int sig)
int kill(pid_t pid,int sig)函数功能:传送信号给指定的进程相关函数 raise,signal表头文件 #include#include函数定义 int kill(pid_t pid,int sig);函数说明:kill()可以用来送参数sig指定的信号给参数pid指定的进程。参数pid有几种情况:pid>0原创 2015-11-06 08:57:34 · 4193 阅读 · 0 评论 -
Nginx学习之六-nginx核心进程模型
一、Nginx整体架构正常执行中的nginx会有多个进程,最基本的有master process(监控进程,也叫做主进程)和woker process(工作进程),还可能有cache相关进程。一个较为完整的整体框架结构如图所示:二、核心进程模型启动nginx的主进程将充当监控进程,而由主进程fork()出来的子进程则充当工作进程。ng转载 2015-11-03 16:07:21 · 517 阅读 · 0 评论 -
Nginx学习——Nginx进程间的通信
nginx进程间的通信进程间消息传递共享内存共享内存还是Linux下提供的最基本的进程间通信方式,它通过mmap和shmget系统调用在内存中创建了一块连续的线性地址空间,而通过munmap或者shmdt系统调用可以释放这块内存。使用共享内存的好处是当多个进程使用同一块共享内存时,在任何一个进程修改了共享内存中的内容后,其他进程通过访问这段共享内存都能够得到修改后的内容。N转载 2015-11-03 11:49:08 · 381 阅读 · 0 评论 -
ngx_worker_process_cycle子进程执行
这一节主要学习子进程处理函数ngx_worker_process_cycle[cpp] view plaincopyprint?src/os/unix/ngx_process_cycle.c static void ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data)转载 2015-11-04 10:50:49 · 629 阅读 · 0 评论 -
centos6 nginx 安装PHP
1、首先安装PHP的依赖文件 yum install gcc bison bison-devel zlib-devel libmcrypt-devel mcrypt mhash-devel openssl-devel libxml2-devel libcurl-devel bzip2-devel readline-devel libedit-devel sqlite-devel2、其中原创 2015-10-21 15:22:31 · 427 阅读 · 0 评论 -
Linux系统 - 源码编译安装Nginx
安装说明系统环境:CentOS6、CentOS7、Red Hat6、Red Hat7软件:nginx-1.8.0.tar.gz其他所需软件:openssl-1.0.2d.tar.gz、pcre-8.37.tar.gz、zlib-1.2.8.tar.gz安装方式:源码编译安装 安装位置:/usr/local/nginx 下载地址:http://nginx.org/en/dow转载 2015-10-19 15:12:28 · 345 阅读 · 0 评论