Nginx源码分析—nginx的配置

Nginx都是一个master进程来管理多个worker进程。Worker进程的数量与服务器上的CPU核心数相等。Master是管理worker,接受外部信号,worker进程之间通过共享内存、原子操作实现通信和同步。

任意一个worker进程出现错误从而导致coredump时,master进程会立刻启动新的worker进程继续服务。

不同worker进程之间处理并发请求几乎没有同步锁的限制,(可以参考进程间通信机制中的介绍)

实现负载均衡使用的是负载均衡锁,accept_mutex,每一个worker进程都在尝试获取这个锁,只有获取了这个锁的worker进程才可以接受客户端的连接。默认是打开的,如果某一个进程没有得到这个锁,那么等待accept_mutex_delay 时间以后再去尝试获取这个锁。

由于IP地址的数量有限,经常存在多个主机域名对应着同一个IP地址的情况,这时在nginx.conf中就可以按照server_name(对应用户请求中的主机域名)并通过server块来定义虚拟主机,每个server块就是一个虚拟主机,它只处理与之相对应的主机域名当前请求。这样,一台服务器上的nginx就可以不同的方式处理访问不同主机域名的HTTP请求了

Server_name后可以跟多个主机名称,在开始处理一个HTTP请求时,nginx会去除header头中的HOST,与每个server中的serve_name进行匹配,以此决定到底由哪一个server块来处理这个请求。为了提高寻找server name 的能力,使用散列表来存储server name

Ngxin对于每个建立成功的TCP连接会预先分配一个内存池。也就是ngx_connection_t结构体中的pool,在处理HTTP请求时,将会为每个请求分配一个内存池。

反向代理方式是指用代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络中的上游服务器,并将从上游服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外的表现就是一个web服务器。

一般nginx可以作为静态服务器,对于一个动态请求,可以在别的服务器上,这时nginx就是一个反向代理服务器,作为一个反向代理服务器,如果上游服务器返回内容,则不会先完整的缓存到nginx代理服务器再向客户端转发,而是边接收边转发到客户端;用户发来的请求将会完整的缓存到Ngingx代理服务器,之后才会向后端服务器转发;nginx反向代理服务器可以根据多种方案从上游服务器的集群中选择一台,他的负载均衡方案包括安IP地址做散列等。

客户端发HTTP请求,nginx进行缓存,知道接收到一个完整的HTTP请求包体,缺点是延长了一个请求的处理时间,但是降低了上游服务器的负载,因为ngxin和请求时外网,nginx和上游服务器是内网。

方向代理负载均衡可以通过权重或者ip_hash来实现均衡。我们希望来自某一个用户的请求始终落到固定的一台上游服务器中,例如,假设上游服务器会缓存一些信息,如果同一个用户的请求任意地转发到集群中的任一台上游服务器中,那么每一台上游服务器都有可能会缓存同一份信息,ip_hash解决上述问题,如果一个上游服务器暂时不用,不要删除,使用down表示,保证转发策略一贯性

时间: 2024-10-12 13:38:19

Nginx源码分析—nginx的配置的相关文章

nginx源码分析--nginx模块解析

nginx的模块非常之多,可以认为所有代码都是以模块的形式组织,这包括核心模块和功能模块,针对不同的应用场合,并非所有的功能模块都要被用到,附录A给出的是默认configure(即简单的http服务器应用)下被连接的模块,这里虽说是模块连接,但nginx不会像apache或lighttpd那样在编译时生成so动态库而在程序执行时再进行动态加载,nginx模块源文件会在生成nginx时就直接被编译到其二进制执行文件中,所以如果要选用不同的功能模块,必须对nginx做重新配置和编译.对于功能模块的选

nginx源码分析--nginx外部信号 命令参数

nginx命令行参数 不像许多其他软件系统,Nginx 仅有几个命令行参数,完全通过配置文件来配置 -c </path/to/config> 为 Nginx 指定一个配置文件,来代替缺省的. -t 不运行,而仅仅测试配置文件.nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件. -v 显示 nginx 的版本. -V 显示 nginx 的版本,编译器版本和配置参数. nginx控制信号 可以使用信号系统来控制主进程.默认,nginx 将其主进程的 pid 写入到 /u

Nginx源码分析 - Nginx启动以及IOCP模型

Nginx 源码分析 - Nginx启动以及IOCP模型 版本及平台信息 本文档针对Nginx1.11.7版本,分析Windows下的相关代码,虽然服务器可能用linux更多,但是windows平台下的代码也基本相似 ,另外windows的IOCP完成端口,异步IO模型非常优秀,很值得一看. Nginx启动 曾经有朋友问我,面对一个大项目的源代码,应该从何读起呢?我给他举了一个例子,我们学校大一大二是在紫金港校区,到了 大三搬到玉泉校区,但是大一的时候也会有时候有事情要去玉泉办.偶尔会去玉泉,但

nginx源码分析--nginx进程间通信

Linux下的IPC很多,nginx的进程都是有亲缘关系的进程,对于他们的通信我们选择TCP socket进行通信.   TCP socket 用来做进程通信的好处有,   1.socket是文件描述符,操作简单. 2.双向流动.3.另外还有一个重要好处:可记录可重现,我们可以用tcpdump抓取信息,方便调试. 当然对于进程间大量数据的共享 自然而然的我们采用共享内存. 采用socketpair()函数创造匿名socket 为master process(父进程) 和 work  proces

nginx源码分析--配置信息的继承&amp;合并

这里只讲述http{}模块下的配置: 在ngx_http_block()函数内(这个函数别调用时在ngx_inti_cycle内的ngx_conf_parse函数,这个函数遇到http命令时 回调ngx_http_block,开启http{}配置块的解读工作),针对每一个http模块,调用init_conf之后,有调用了ngx_http_merge_servers().这是为何! 首先明确几点:一个http{}配置块内可以包含多个server{}配置块,每个server{}配置块可以包含多个lo

nginx源码分析--模块分类

ngx-modules Nginx 主要的模块大致可以分为四类: handler – 协同完成客户端请求的处理.产生响应数据.比如模块, ngx_http_rewrite_module, ngx_http_log_module, ngx_http_static_module. filter – 对 handler 产生的响应数据做各种过滤处理.比如模块, ngx_http_not_modified_filter_module, ngx_http_header_filter_module. ups

nginx源码分析--ngx_http_optimize_servers()函数

这个函数做了连部分工作:1)以端口为入口点 将有用的信息存放到hash表内 2)调用ngx_http_init_listening()函数 对端口进行监听 1. 在ngx_http_core_main_conf_t结构体中有一个字段为ports,是一个数组,数组内存放的全是ngx_http_conf_port_t:对于每一个端口信息(ngx_http_conf_port_t),调用 ngx_http_server_names函数,同时也调用ngx_http_init_listening函数,这里

nginx源码分析--监听套接字的创建 套接字的监听 HTTP请求创建连接

作为一个web服务器,那么肯定是有监听套接字的,这个监听套接字是用于接收HTTP请求的,这个监听套接字的创建是根据配置文件的内容来创建的,在nginx.conf文件中有多少个地址就需要创建多少个监听套接字.这里不说各个结构体的构造 只说大体情况! 1).首先在main函数中调用了ngx_init_cycle()函数,在这个函数的最后调用了ngx_open_listening_sockets函数,这个函数负责将创建的监听套接字进行套接字选项的设置(比如非阻塞.接受发送的缓冲区.绑定.监听处理) 2

Nginx源码分析:3张图看懂启动及进程工作原理

编者按:高可用架构分享及传播在架构领域具有典型意义的文章,本文由陈科在高可用架构群分享.转载请注明来自高可用架构公众号「ArchNotes」.   导读:很多工程师及架构师都希望了解及掌握高性能服务器开发,阅读优秀源代码是一种有效的方式,nginx 是业界知名的高性能 Web 服务器实现,如何有效的阅读及理解 nginx?本文用图解的方式帮助大家来更好的阅读及理解 nginx 关键环节的实现.   陈科,十年行业从业经验,曾在浙江电信.阿里巴巴.华为.五八同城任开发工程及架构师等职,目前负责河狸