前言最近在部署项目的时候,需要做负载均衡。有趣的是网上搜索都类似下面的配置文件upstreamlocalhost{server127.0.0.1:8080weight=1;server127.0.0.1:8081weight=1;}server{listen80;server_namelocalhost;location/{proxy_passhttp://localhost;indexindex.htmlindex.htmindex.jsp;}}于是打算去看看Nginx的内部原理。本篇博客主要介绍Nginx如何实现反向代理以及Nginx中负载均衡参数的使用一、正向代理和反向代理正向代理就是代理客户端,也就是客户端可以真正联系起来,比如需要使用VPN访问外网软件时,用户可以选择从哪里连接到服务器。反向代理就是代理服务器。用户无法感知,但是当客户端向服务器的端口发送请求时,Nginx监听并将该端口的请求转发给不同的服务器。我们拿上面的配置文件来说明一下,当你在url中输入http://localhost:80/(如果不加80,这里默认进入80端口,这里说清楚),然后Nginx监听后到80端口的请求,它会找到对应的位置去执行。从上面的配置文件中,我们可以看到请求被转发到不同的端口。这是在服务器中执行的,对用户不可见。服务器端最常用的反向代理工具是Nginx。2、Nginx的内部基本结构Nginx启动后,作为守护进程运行在后台,会有一个master进程和多个worker进程。Master进程:主要用于管理worker进程,包括:接收外界信号,向各个worker进程发送信号,监控worker进程的运行状态,worker进程退出时(异常下)自动重启新的worker情况)过程。工作进程:处理基本的网络事件。多个工作进程是对等的,它们平等地竞争来自客户端的请求,并且每个进程相互独立。一个请求只能在一个worker进程中处理,一个worker进程不能处理来自其他进程的请求。可以设置工作进程的数量。一般我们会设置成与机器的CPU核数一致,或者直接设置参数worker_processesauto;所以Nginx的基本结构是这样的:当我们输入./nginx-sreload,就是重启nginx,./nginx-sstop,就是停止nginx的运行,这里怎么办呢?在执行命令的时候,我们启动了一个新的nginx进程,新的nginx进程在解析reload参数后,开始知道我们的目的是控制nginx重新加载配置文件,它就会向master进程发送一个信号。master进程收到信号后,会先重新加载配置文件,然后启动新的worker进程,并向所有老的worker进程发送信号,告诉它们可以光荣退休了。新的worker启动后,开始接收新的请求,oldworker在收到master的信号后,不再接收新的请求,待当前进程中所有未处理的请求处理完毕,再退出。因此,使用上述命令重启Nginx时,服务不会中断。3、Nginx是如何处理客户端请求的首先我们来解释一下上面的架构图:每个worker进程都是从master进程中分支出来的。在master进程中,先建立需要监听的socket,然后分支到多个worker进程。所有worker进程的listenfd(socket中的listenfd是指client连接本机时的fd,用于与client通信)在新连接到来时变为可读。为保证只有一个进程处理连接,所有worker进程在注册listenfd读事件前抢accept_mutex,抢到mutex的进程注册listenfd读事件,在read事件中调用accept接受连接。在Nginx中,worker进程是平等的,每个进程都有相同的机会处理请求。当Nginx监听80端口时,客户端有一个连接请求过来,每个进程都可能处理这个连接。据说每个worker进程都会抢先注册listenfd的读事件。当一个工作进程接受连接后,它开始读取请求、解析请求、处理请求、生成数据、返回给客户端,最后断开连接。这样一个完整的请求是这样的。这里需要注意的是,一个请求是完全由worker进程处理的,它只在一个worker进程中处理。下面两张流程图可以帮助我们理解4、Nginx是如何处理事件并实现高并发的。Nginx使用异步和非阻塞的方法来处理请求。也就是说,Nginx可以同时处理上千个请求。的。异步非阻塞:当一个网络请求过来的时候,我们不依赖这个请求来进行后续的操作,那么这个请求就是一个异步操作,即调用者还可以在没有得到结果之前进行后续的操作。非阻塞是指当当前进程/线程没有得到请求调用的结果时,不会阻碍进程/线程的后续操作。可见异步对象和非阻塞对象是不一样的。5、Nginx负载均衡算法及参数roundrobin(默认):轮询方式,轮流向后台各个服务器分发请求,适用于后台机器性能一致的情况。如果服务器挂了,可以自动从服务列表中移除权重:根据权重将请求分发到不同的服务器,可以理解为按比例分配。性能高的服务器分流的请求多,性能低的服务器分流的请求少。IP_hash:根据请求者ip的hash值向后台服务器发送请求,保证同一个ip的请求转发到固定的服务器,解决session问题。您还可以通过更改upstreamlocalhost{ip_hash;server127.0.0.1:9090down;server127.0.0.1:8080weight=2;server127.0.0.1:6060;server127.0.0.1:7070backup;}参数配置负载均衡参数列表如下:
