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表示,保证转发策略一贯性