Nginx--Nginx 的高可用
Posted flgb
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx--Nginx 的高可用相关的知识,希望对你有一定的参考价值。
1. nginx 进程模型简介
启动nginx,查看nginx的线程,可以发现:
[[email protected] ~]# ps -ef |grep nginx root 20714 1 0 02:36 ? 00:00:00 nginx: master process ../ngnix/sbin/nginx root 21728 20714 0 05:04 ? 00:00:00 nginx: worker process root 22694 22655 0 06:49 pts/2 00:00:00 grep nginx [[email protected] ~]#
1. 在创建master进程时,先建立需要监听的socket(listenfd),然后从master进程中fork()出多个worker进程,如此一来每个worker进程都可以监听用户请求的socket。一般来说,当一个连接进来后,所有Worker都会收到通知,但是只有一个进程可以接受这个连接请求,其它的都失败,这是所谓的惊群现象。nginx提供了一个accept_mutex(互斥锁),有了这把锁之后,同一时刻,就只会有一个进程在accpet连接,这样就不会有惊群问题了。
2. 先打开accept_mutex选项,只有获得了accept_mutex的进程才会去添加accept事件。nginx使用一个叫ngx_accept_disabled的变量来控制是否去竞争accept_mutex锁。ngx_accept_disabled = nginx单进程的所有连接总数 / 8 -空闲连接数量,当ngx_accept_disabled大于0时,不会去尝试获取accept_mutex锁,ngx_accept_disable越大,让出的机会就越多,这样其它进程获取锁的机会也就越大。不去accept,每个worker进程的连接数就控制下来了,其它进程的连接池就会得到利用,这样,nginx就控制了多进程间连接的平衡。
3.每个worker进程都有一个独立的连接池,连接池的大小是worker_connections。这里的连接池里面保存的其实不是真实的连接,它只是一个worker_connections大小的一个ngx_connection_t结构的数组。并且,nginx会通过一个链表free_connections来保存所有的空闲ngx_connection_t,每次获取一个连接时,就从空闲连接链表中获取一个,用完后,再放回空闲连接链表里面。一个nginx能建立的最大连接数,应该是worker_connections * worker_processes。当然,这里说的是最大连接数,对于HTTP请求本地资源来说,能够支持的最大并发数量是worker_connections * worker_processes,而如果是HTTP作为反向代理来说,最大并发数量应该是worker_connections * worker_processes/2。因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接。
相关的配置:
worker_processes 1; // 工作进程数,建议设成CPU总核心数。 events { // 多路复用IO模型机制,epoll . select ....根据操作系统不同来选择。linux 默认epoll use epoll; //io 模型 worker_connections 1024; // 每个woker进程的最大连接数,数值越大,并发量允许越大 } http{ sendfile on;//开启零拷贝 }
Nginx 的高可用方案
Keepalived 下载地址
https://www.keepalived.org/download.htmlkeepalived 的配置
! Configuration File for keepalived global_defs { router_id MASTER_DEVEL #运行 keepalived 服务器的标识,在一个网络内应该是唯一的 } vrrp_instance VI_1 { #vrrp 实例定义部分 state MASTER #设置 lvs 的状态,MASTER 和 BACKUP 两种,必须大写 interface ens33 #设置对外服务的接口 virtual_router_id 51 #设置虚拟路由标示,这个标示是一个数字,同一个 vrrp 实例使用唯一标示 priority 150 #定义优先级,数字越大优先级越高,在一个 vrrp——instance 下,master 的优先级必须大于 backup advert_int 1 #设定 master 与 backup 负载均衡器之间同步检查的时间间隔,单位是秒 authentication { #设置验证类型和密码 auth_type PASS auth_pass 1111 #验证密码,同一个 vrrp_instance 下 MASTER 和 BACKUP 密码必须相同} virtual_ipaddress { #设置虚拟 ip 地址,可以设置多个,每行一个 192.168.20.110 } } virtual_server 192.168.20.100 80 { #设置虚拟服务器,需要指定虚拟 ip 和服务端口 delay_loop 6 #健康检查时间间隔 lb_algo rr #负载均衡调度算法 lb_kind NAT #负载均衡转发规则 persistence_timeout 50 #设置会话保持时间 protocol TCP #指定转发协议类型,有 TCP 和 UDP 两种 real_server 192.168.20.130 80 { #配置服务器节点 1,需要指定 real server 的真实 IP 地址和端口weight 1 #设置权重,数字越大权重越高 TCP_CHECK { #realserver 的状态监测设置部分单位秒 connect_timeout 3 #超时时间 delay_before_retry 3 #重试间隔 connect_port 80 #监测端口 } } }
backup
! Configuration File for keepalived global_defs { router_id BACKUP_DEVEL #运行 keepalived 服务器的标识,在一个网络内应该是唯一的 } vrrp_instance VI_1 { #vrrp 实例定义部分 state BACKUP #设置 lvs 的状态,MASTER 和 BACKUP 两种,必须大写 interface ens33 #设置对外服务的接口 virtual_router_id 51 #设置虚拟路由标示,这个标示是一个数字,同一个 vrrp 实例使用唯一标示 priority 100 #定义优先级,数字越大优先级越高,在一个 vrrp——instance 下,master 的优先级必须大于 backup advert_int 1 #设定 master 与 backup 负载均衡器之间同步检查的时间间隔,单位是秒 authentication { #设置验证类型和密码 auth_type PASS auth_pass 1111 #验证密码,同一个 vrrp_instance 下 MASTER 和 BACKUP 密码必须相同} virtual_ipaddress { #设置虚拟 ip 地址,可以设置多个,每行一个 192.168.20.110 } } virtual_server 192.168.20.110 80 { #设置虚拟服务器,需要指定虚拟 ip 和服务端口 delay_loop 6 #健康检查时间间隔 lb_algo rr #负载均衡调度算法 lb_kind NAT #负载均衡转发规则 persistence_timeout 50 #设置会话保持时间 protocol TCP #指定转发协议类型,有 TCP 和 UDP 两种 real_server 192.168.20.128 80 { #配置服务器节点 1,需要指定 real server 的真实 IP 地址和端口weight 1 #设置权重,数字越大权重越高 TCP_CHECK { #realserver 的状态监测设置部分单位秒 connect_timeout 3 #超时时间 delay_before_retry 3 #重试间隔 connect_port 80 #监测端口 } } }
以上是关于Nginx--Nginx 的高可用的主要内容,如果未能解决你的问题,请参考以下文章
Nginx——Nginx启动报错Job for nginx.service failed because the control process exited with error code(代码片段