1. Nginx 进程模型简介

多进程+多路复用
master 进程 、 worker 进程 

启动nginx,查看nginx的线程,可以发现:

[root@localhost ~]# 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
[root@localhost ~]#  
worker_processes 1 cpu 总核心数
epoll . select ....
#user nobody; 用户
worker_processes 1; 工作进程数
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
 
events {
use epoll ; io 模型
worker_connections 1024; 理论上 processes* connections

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 的高可用方案

Nginx 作为反向代理服务器,所有的流量都会经过 Nginx,所以 Nginx 本身的可靠性是我们首先要考虑的问题
 
keepalived
 
Keepalived 是 Linux 下一个轻量级别的高可用解决方案,Keepalived 软件起初是专为 LVS 负载均衡软件设计的,
用来管理并监控 LVS 集群系统中各个服务节点的状态,后来又加入了可以实现高可用的 VRRP 功能。因此,Keepalived 除了能够管理 LVS 软件外,
还可以作为其他服务(例如:Nginx、Haproxy、MySQL 等)的高可用解决方案软件Keepalived 软件主要是通过 VRRP 协议实现高可用功能的。
VRRP 是 VirtualRouter RedundancyProtocol(虚拟路由器冗余协议)的缩写,VRRP 出现的目的就是为了解决静态路由单点故障问题的,
它能够保证当个别节点宕机时,整个网络可以不间断地运行;(简单来说,vrrp 就是把两台或多态路由器设备虚拟成一个设备,实现主备高可用)

所以,Keepalived 一方面具有配置管理 LVS 的功能,同时还具有对 LVS 下面节点进行健康检查的功能,另一方面也可实现系统网络服务的高可用功能
 
LVS 是 Linux Virtual Server 的缩写,也就是 Linux 虚拟服务器,在 linux2.4 内核以后,已经完全内置了 LVS 的各个功能模块。
它是工作在四层的负载均衡,类似于 Haproxy, 主要用于实现对服务器集群的负载均衡。
关于四层负载,我们知道 osi 网络层次模型的 7 层模模型(应用层、表示层、会话层、传输层、网络层、数据链路层、物理层);
四层负载就是基于传输层,也就是ip+端口的负载;而七层负载就是需要基于 URL 等应用层的信息来做负载,同时还有二层负载(基于 MAC)、三层负载(IP);
常见的四层负载有:LVS、F5; 七层负载有:Nginx、HAproxy; 在软件层面,Nginx/LVS/HAProxy 是使用得比较广泛的三种负载均衡软件
对于中小型的 Web 应用,可以使用 Nginx、大型网站或者重要的服务并且服务比较多的时候,可以考虑使用 LVS 
 
轻量级的高可用解决方案
LVS 四层负载均衡软件(Linux virtual server)
监控 lvs 集群系统中的各个服务节点的状态
VRRP 协议(虚拟路由冗余协议)
linux2.4 以后,是内置在 linux 内核中的
lvs(四层) -> HAproxy 七层
lvs(四层) -> Nginx(七层)

Keepalived 下载地址

https://www.keepalived.org/download.html

 

实践
\1. 下载 keepalived 的安装包
\2. tar -zxvf keepalived-2.0.7.tar.gz
\3. 在/data/program/目录下创建一个 keepalived 的文件
\4. cd 到 keepalived-2.0.7 目录下,执行 ./configure --prefix=/data/program/keepalived --sysconf=/etc
\5. 如果缺少依赖库,则 yum install gcc; yum -y install openssl-devel ; yum install libnllibnl-devel ,然后重新执行4
\6. 编译安装 make && make install
  
报错
make[]: *** [namespaces.o] Error
make[]: Leaving directory `/root/keepalived-1.2./keepalived/core'
make[]: *** [all-recursive] Error
make[]: Leaving directory `/root/keepalived-1.2./keepalived'
make: *** [all-recursive] Error
升级了下glib试一下能不能解决
yum update glib*
还不行的话,看一下自己的系统版本,换一个低版本的keepalived
centos6.+keepalived1.2.7
\7. 进入安装后的路径 cd /data/program/keepalived, 创建软连接: ln -s sbin/keepalived /sbin  覆盖软连接 ln -snf sbin/keepalived /sbin
\8. 复制运行命令 cp /data/program/keepalived-2.0.7/keepalived/etc/init.d/keepalived /etc/init.d (换成自己的版本路径cp /keepalived-2.0.7/keepalived/etc/init.d/keepalived /etc/init.d/)
\9. chkconfig --add keepalived
\10.添加到系统服务 chkconfig keepalived on
\11. 启用该服务service keepalived start
  service keepalived status 查看keepalived 运行状况
● keepalived.service - LVS and VRRP High Availability Monitor
Loaded: loaded (/usr/lib/systemd/system/keepalived.service; enabled; vendor preset: disabled)
Active: active (running) since Mon -- :: CST; 5min ago
Process: ExecStart=/data/program/keepalived/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=/SUCCESS)
Main PID: (keepalived)
CGroup: /system.slice/keepalived.service
├─ /data/program/keepalived/sbin/keepalived -D
└─ /data/program/keepalived/sbin/keepalived -D Jun :: localhost.localdomain Keepalived_healthcheckers[]: Timeout connecting server [192.168.....
Jun :: localhost.localdomain Keepalived_healthcheckers[]: Check on service [192.168.201.100]:tc...d.
Jun :: localhost.localdomain Keepalived_healthcheckers[]: Removing service [192.168.201.100]:tc...
Jun :: localhost.localdomain Keepalived_healthcheckers[]: Lost quorum -= > for VS [192.168...
Jun :: localhost.localdomain Keepalived_healthcheckers[]: Remote SMTP server [192.168.200.1]:...d.
Jun :: localhost.localdomain Keepalived_healthcheckers[]: Error reading data from remote SMTP s....
Jun :: localhost.localdomain Keepalived_healthcheckers[]: Error reading data from remote SMTP s....
Jun :: localhost.localdomain Keepalived_healthcheckers[]: Error reading data from remote SMTP s....
Jun :: localhost.localdomain Keepalived_healthcheckers[]: Error reading data from remote SMTP s....
Jun :: localhost.localdomain Keepalived_healthcheckers[]: Error reading data from remote SMTP s....
Hint: Some lines were ellipsized, use -l to show in full.
[root@localhost keepalived]#

keepalived 的配置

vi /etc/keepalived/keepalived.conf
master
! 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 #设置对外服务的接口,必须跟本地ip应用名称一致
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 #监测端口
}
}
}
keepalived 日志文件配置
 
\1. 首先看一下/etc/sysconfig/keepalived 文件
vi /etc/sysconfig/keepalived
KEEPALIVED_OPTIONS="-D -d -S 0"
“-D” 就是输出日志的选项
这里的“-S 0”表示 local0.* 具体的还需要看一下vim /etc/rsyslog.conf  文件
\2. 在/etc/rsyslog.conf 里添加:local0.* /var/log/keepalived.log
\3. 重新启动 keepalived 和 rsyslog 服务:
service rsyslog restart (/bin/systemctl restart rsyslog.service)
service keepalived restart 
查看日志信息:cat /var/log/keepalived.log
 
示例:keepalived +nginx+tomcat
 启动报错,查看日志
发现 没有eth0网卡名称
关闭网络防火墙 

使用命令:systemctl status firewalld.service

查看防火墙状态

执行后可以看到绿色字样标注的“active(running)”,说明防火墙是开启状态

使用命令:systemctl stop firewalld.service

关闭运行的防火墙

输入命令:systemctl disable firewalld.service,禁止防火墙服务器

ip a 来查看虚拟IP是否绑定到本机

安装nginx到本地试一下

Nginx(三)--Nginx 的高可用的更多相关文章

  1. Keepalived+LVS+Nginx负载均衡之高可用

    Keepalived+LVS+Nginx负载均衡之高可用 上一篇写了nginx负载均衡,此篇实现高可用(HA).系统整体设计是采用Nginx做负载均衡,若出现Nginx单机故障,则导致整个系统无法正常 ...

  2. 在CentOS上使用Nginx和Tomcat搭建高可用高并发网站

    目录 目录 前言 创建CentOS虚拟机 安装Nginx 安装Tomcat 安装lvs和keepalived 反向代理 部署网站 搭建数据库 编写网站项目 解决session一致性 注意 参考资料 前 ...

  3. nginx与keepalived实现高可用+Apache实现负载均衡

    nginx与keepalived实现高可用 本实验使用了四台虚拟机 两台需要安装nginx及keepalived 两台安装Apache nginx可以源码安装也可以用yum安装nginx yum安装n ...

  4. Nginx+Keepalived负载均衡高可用

    Nginx+Keepalived负载均衡高可用方案: Nginx 使用平台:unix.linux.windows. 功能: A.www web服务  http 80 b.负载均衡(方向代理proxy) ...

  5. Keepalived+Nginx实现负载均衡高可用

    一.负载均衡高可用 Nginx作为负载均衡器,所有请求都到了Nginx,可见Nginx处于非常重点的位置,如果Nginx服务器宕机后端web服务将无法提供服务,影响严重. 为了避免负载均衡服务器的宕机 ...

  6. nginx负载均衡+keepalived高可用

    nginx负载均衡+keepalived高可用 环境准备 192.168.88.111:nginx + keepalived   MASTER 192.168.88.112:nginx + keepa ...

  7. Nginx 配置实例-配置高可用

    Nginx 配置实例-配置高可用 1. 实现效果 2. 两台机器 nginx 的安装 2.1 192.168.25.120 中 nginx 的安装 2.1.1 安装 pcre 依赖 2.1.2 安装其 ...

  8. suse 12 编译部署Keepalived + nginx 为 kube-apiserver 提供高可用

    文章目录 编译部署nginx 下载nginx源码包 编译nginx 配置nginx.conf 配置nginx为systemctl管理 分发nginx二进制文件和配置文件 启动kube-nginx服务 ...

  9. 23.Nginx+keepalived负载均衡高可用

    Nginx+keepalived负载均衡高可用 结构图 环境: 主 服务器:192.168.239.10 备 服务器:192.168.239.20 Web 服务器1:192.168.239.40 We ...

  10. centos实现三个节点高可用

    centos实现三个节点高可用 使用的资源为keepalived和nginx 高可用主机IP地址 192.168.136.131 192.168.136.133 192.168.136.134 ngi ...

随机推荐

  1. hdu 1880 魔咒词典(双hash)

    魔咒词典Time Limit: 8000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  2. nyoj 99-单词拼接 (euler, dfs)

    99-单词拼接 内存限制:64MB 时间限制:3000ms 特判: No 通过数:7 提交数:14 难度:5 题目描述: 给你一些单词,请你判断能否把它们首尾串起来串成一串. 前一个单词的结尾应该与下 ...

  3. 函数的prototype

    1.函数的prototype属性 每一个函数都有一个prototype属性,默认指向object空对象(原型对象),每一个原型对象都有一个constructor属性,指向函数对象 2.给原型对象添加属 ...

  4. python day 1 homework 2

    多级菜单 1 三级菜单 2 可依次选择进入各子菜单 3 所需新知识点,列表,字典 province_info = {":{"name":"黑龙江", ...

  5. goland_beego框架学习--api实现

    goland_beego框架学习--api实现 完成一项api实现的流程 (1)beego框架的router层里面注册路由 正则路由 为了用户更加方便的路由设置,beego 参考了 sinatra 的 ...

  6. Java 添加、读取、修改、删除Word文档属性

    Word文档属性包括常规.摘要.统计.内容.自定义等,其中摘要包括标题.主题.作者.经理.单位.类别.关键词.备注等项目,通过设置这些摘要信息或自定义属性可方便对文档的管理.本文中将主要介绍对文档摘要 ...

  7. 携程Apollo简单入门教程这一篇就够了

    1. Apollo背景 对程序配置的期望值也越来越高:配置修改后实时生效,灰度发布,分环境.分集群管理配置,完善的权限.审核机制……   废话不多说,参考官方文档   如果不想看文档, 也没关系, 跟 ...

  8. PTA 1139 1138 1137 1136

    PAT 1139 1138 1137 1136 一个月不写题,有点生疏..脑子跟不上手速,还可以啦,反正今天很开心. PAT 1139 First Contact 18/30 找个时间再修bug 23 ...

  9. 启动项目报错:org.apache.catalina.LifecycleException: Failed to start component

    原因 环境异常重启,项目java进程未关闭,原项目的端口依旧在占用. 一般为8080端口被占用 解决方法 以下两种方法都可以解决,原理相同(结束异常进程) 1. 简单粗暴: 打开任务管理器找到java ...

  10. docker-primary

    docker-ce  docker网址 https://docs.docker.com/docsarchive/ Docker的安装和启动 官方安装文档链接:https://docs.docker.c ...