Nginx高可用实战

来源:jingfengjiaoyu

Nginx的特点

跨平台:Nginx 可以在大多数 Unix like OS编译运行,而且也有Windows的移植版本。
配置异常简单,非常容易上手。配置风格跟程序开发一样,神一般的配置
非阻塞、高并发连接:数据复制时,磁盘I/O的第一阶段是非阻塞的。官方测试能够支撑5万并发连接,在实际生产环境中跑到2~3万并发连接数.(这得益于Nginx使用了最新的epoll模型)
事件驱动:通信机制采用epoll模型,支持更大的并发连接。
master/worker结构:一个master进程,生成一个或多个worker进程
内存消耗小:处理大并发的请求内存消耗非常小。在3万并发连接下,开启的10个Nginx 进程才消耗150M内存(15M*10=150M) 成本低廉:Nginx为开源软件,可以免费使用。而购买F5 BIG-IP、NetScaler等硬件负载均衡交换机则需要十多万至几十万人民币
内置的健康检查功能:如果 Nginx Proxy 后端的某台 Web 服务器宕机了,不会影响前端访问。
节省带宽:支持 GZIP 压缩,可以添加浏览器本地缓存的 Header 头。
稳定性高:用于反向代理,宕机的概率微乎其微

nginx代理和后端web服务器间无需长连接;
接收用户请求是异步的,即先将用户请求全部接收下来,再一次性发送后后端web服务器,极大的减轻后端web服务器的压力
发送响应报文时,是边接收来自后端web服务器的数据,边发送给客户端的
网络依赖型低。NGINX对网络的依赖程度非常低,理论上讲,只要能够ping通就可以实施负载均衡,而且可以有效区分内网和外网流量
支持服务器检测。NGINX能够根据应用服务器处理页面返回的状态码、超时信息等检测服务器是否出现故障,并及时返回错误的请求重新提交到其它节点上

Nginx是如何处理一个请求

首先,nginx在启动时,会解析配置文件,得到需要监听的端口与ip地址,然后在nginx的master进程里面,先初始化好这个监控的socket(创建socket,设置addrreuse等选项,绑定到指定的ip地址端口,再listen),然后再fork(一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程 )出多个子进程出来,然后子进程会竞争accept新的连接。此时,客户端就可以向nginx发起连接了。当客户端与nginx进行三次握手,与nginx建立好一个连接后,此时,某一个子进程会accept成功,得到这个建立好的连接的socket,然后创建nginx对连接的封装,即ngx_connection_t结构体。接着,设置读写事件处理函数并添加读写事件来与客户端进行数据的交换。最后,nginx或客户端来主动关掉连接,到此,一个连接就寿终正寝了。

Nginx典型的应用场景

在这里插入图片描述
Nginx常见配置说明

worker_processes 8;
#nginx进程数,建议设置为等于CPU总核心数
worker_connections 65535;
#单个进程最大连接数(最大连接数=连接数*进程数)
client_header_buffer_size 32k; #上传文件大小限制
large_client_header_buffers 4 64k; #设定请求缓
client_max_body_size 8m; #设定请求缓
autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。
tcp_nopush on; #防止网络阻塞
tcp_nodelay on; #防止网络阻塞
keepalive_timeout 120; #长连接超时时间,单位是秒
gzip on; #开启gzip压缩输出
gzip_min_length 1k; #最小压缩文件大小
gzip_buffers 4 16k; #压缩缓冲区
gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
gzip_comp_level 2; #压缩等级

upstream blog.ha97.com {
#upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。
server 192.168.80.121:80 weight=3;
server 192.168.80.122:80 weight=2;
server 192.168.80.123:80 weight=3;
}

#虚拟主机的配置
server
{
#监听端口
listen 80;
#域名可以有多个,用空格隔开
server_name www.ha97.com ha97.com;
index index.html index.htm index.php;
root /data/www/ha97;
location ~ .*.(php|php5)?$
{
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}

配置静态资源

  location ~ \.(jpg|png|jpeg|bmp|gif|swf|css)$
        {
         
            expires 30d;
             root /nginx-1.4.7;#root:
            break;
        }

高并发连接

官方测试Nginx 能够支撑5万并发连接,在实际生产环境中可支撑2~4万并发连接数。这得益于Nginx使用了最新的epoll (Linux 2.6内核〉和kqueue ( freebsd)网络IO模型,而Apache使用的则是传统的 select模型,其比较稳定的 Prefork模式为多进程模式,需要经常派生子进程,所消耗的CPU 等服务器资源要比Nginx高得多。
笔者曾完成6台Web Server 从 Apache到Nginx服务器的迁移(这6台Web Server搭建的是一个日均2500万PV的分类信息网站,迁移前每台服务器的平均系统负载为5060、CPU使用率为70%~90%,迁移后平均系统负载为1~4,CPU使用率为20%~40%,见图1-2。
在这里插入图片描述
由此可见,处理大量连接的读写,Apache所采用的select网络I/O模型非常低效。
在这里插入图片描述

内存消耗少

Nginx + PHP (FastCGI)服务器在3万并发连接下,开启的10个Nginx进程消耗150MB内存(15MB×10=150MB),开启的64个php-cgi进程消耗1280MB内存(20MB×64=1280MB),加上系统自身消耗的内存,总共消耗不到2GB 的内存。如果服务器内存较小,完全可以只开启25个php-cgi进程,这样php-cgi消耗的总内存数才500MB。用 Webbench做压力测试,在3万并发连接下,访问Nginx + PHP(FastCGI)服务器的 PHP程序,运行速度仍然飞快。网
在实际的生产环境下,两台Nginx + PHP5(FastCGI)服务器运行多个复杂性一般的纯PHP动态程序,从Nginx的日志可以统计出,单台Nginx + PHP5 (FastCGI)服务器处理PHP动态程序的能力已经超过“700次请求/秒”(见图1-5),相当于每天可以承受6000万(700×60×60×24=60 480 000)的访问量,而服务器的系统负载也不算高(见图1-6)。
在这里插入图片描述
以下是这两台服务器的配置清单及运行的程序说明:
服务器①:DELL PowerEdge 1950(两个Intel®Xeon®双核CPU5120 @ 1.86GHz,4GB内存)。
服务器②:DELL PowerEdge 1950(一个Intel®Xeon®双核CPU5140 @ 2.33GHz,4GB内存)。

Web服务器:CentOS Linux 4.4 + Nginx 0.5.35+ PHP 5.2.6RC2 (300 FastCGI Procees,unix-domain socket, with XCache)。
PHP程序内容:大量 Memcached读写操作,少量MySQL读操作,大量文件队列写操作。请求数统计方式:从Nginx访问日志中,统计每分钟的第15秒共有多少条日志记录。同等硬件环境下,Nginx 的处理能力相当于Apache的5~10倍。

成本低廉

购买F5 BIG-IP、NetScaler等硬件负载均衡交换机需要十多万甚至几十万人民币。而Nginx为开源软件,采用的是2-clause BSD-like协议,可以免费使用,并且可用于商业用途。

BSD开源协议是一个给使用者很大自由的协议。协议指出可以自由使用、修改源代码,也可以将修改后的代码作为开源或专有软件再发布。当你发布使用了BSD 协议的代码,或者以 BSD协议代码为基础做二次开发时,须满足三个条件:

(1)如果再发布的产品中包含源代码,则源代码中必须带有原来代码中的BSD协议。

(2)如果再发布的是二进制类库/软件,则需要在类库/软件的文档和版权声明中包含原来代码中的BSD协议。

(3)不可以用开源代码的作者/机构名字和原来产品的名字做市场推广。

BSD代码鼓励代码共享,但须尊重代码作者的著作权。BSD由于允许使用者修改和重新发布代码,也允许使用或在BSD 代码上开发商业软件,并进行发布和销售,因此它是对商业集成很友好的协议。很多的公司、企业在选用开源产品的时候都会首选 BSD协议,因为可以完全控制这些第三方的代码,在必要的时候可以修改或二次开发。

Nginx所采用的2-clause BSD-like license衍生自BSD协议,也就是删掉了BSD协议的第3个条件–—“不可以用开源代码的作者/机构名字和原来产品的名字做市场推广”。

Nginx与Apache、Lighttpd的综合对比

在这里插入图片描述

1 、Nginx WEB 高可用架构概念

1)高可用,高的可用性,针对于 WEB 网站、服务器系统、数据库的;
2)高可用,不是说网站不宕机,可用率达到几个 9,99%、99.9%,
衡量的 WEB 网站高可用率看几个 9;
3)高可用,其共同的特点有多个(至少是 2 个+)相同系统做备份,
2 台 Nginx、2 台 MYSQL、2 台 Tomcat 等,当其中一台服务宕机,可
以切换至另外一台;
4)Nginx WEB 高可用 (两台就够用),如何去实现 Nginx WEB 高可用呢?实现的方
式:
 基于 SHELL 脚本实现高可用;
 基于 Keepalived 软件实现高可用;
 基于 Heartbeat 软件实现高可用;

2 、Nginx WEB 源码编译部署(部署思路)

1)生产环境至少需要 2 台硬件服务器(云主机),2 台服务器分别
部署 Nginx WEB 服务;
在这里插入图片描述

Nginx WEB 1

2)官网下载 Nginx WEB 软件

wget http://nginx.org/download/nginx-1.12.2.tar.gz

3)解压 Nginx 软件包,通过 Tar 工具解压

tar -xzf nginx-1.12.2.tar.gz

4)进入解压目录

cd nginx-1.12.2

5)修改 Nginx 版本,隐藏版本对 Nginx WEB 启动安全的作用,指令
如下:

sed -i -e 's/1.12.2//g' -e 's/nginx\//JWS/g' -e 's/"NGINX"/"JWS"/g' src/core/nginx.h

6)预编译

./configure --prefix=/usr/local/nginx/ --user=www
--group=www --with-http_stub_status_module
--with-http_ssl_module

7)编译

make -j4

8)安装

make -j4 install

在这里插入图片描述
9)启动 Nginx

/usr/local/nginx/sbin/nginx

在这里插入图片描述
在这里插入图片描述
10)配置 Hosts 文件(充当 DNS 服务器),填写如下代码:

192.168.0.124 vv1.jfedu.net

在这里插入图片描述

3、 Nginx WEB 2

wget http://nginx.org/download/nginx-1.12.2.tar.gz
tar -xzf nginx-1.12.2.tar.gz
cd nginx-1.12.2;
sed -i -e 's/1.12.2//g' -e 's/nginx\//JWS/g' -e
's/"NGINX"/"JWS"/g' src/core/nginx.h

./configure --prefix=/usr/local/nginx/ --user=www
--group=www --with-http_stub_status_module
--with-http_ssl_module
make -j4         #四个cpu就写4
make -j4 install
/usr/local/nginx/sbin/nginx
#如果不创建用户,会报错nginx: [emerg] getwnam("www") failed
# useradd ww /-s /sbin/nologin
ps –ef|grep nginx
netstat –tnlp|grep 80
或者
#netstat –tnlp|grep "\<80\>"
setenfoce 0
systemctl stop firewalld.service

如果124宕机了,在win里面更改hosts。125也要安装nginx,网站又可以访问了。访问不了,要清理浏览器缓存。刷新网页

网站不变,网站代理的IP,可以随意切换。

192.168.0.125 vv1.jfedu.net

4 、Nginx WEB 高可用架构切换(自动切换)

1)通过手工的方式模拟切换,手工切换效率比较低,尤其是外网直
接切换解析 DNS,生效比较慢(1-2 个小时);
2)赋予 Nginx(2 台 WEB 集群)一个 VIP 地址(Virtual IP),VIP
代替真实的 IP 对外提供访问;
3)在 Nginx WEB 服务器,绑定一个 VIP 地址,同一时刻只能有一台
WEB 绑定 VIP,如果同时绑定出现 IP 冲突;
4)通过 VIP 即可访问该服务器所在的真实 IP 下配置的 Nginx WEB 网
站;
5)配置服务器的 VIP 方法,拷贝物理网卡,并且命名为 ens33:1,
添加如下代码:
124机器

# cd /sysconfig/network-scripts/
#cp ifcfg-ens33 ifcfg-ens33:1
# vi ifcfg-ens33:1

TYPE="Ethernet"
BOOTPROTO="static"
DEVICE="ens33:1"
ONBOOT="yes"
IPADDR=192.168.0.188
NETMASK=255.255.255.0

#cat ifcfg-ens33:1
# ifup ens33:1     #启动ens33:1网卡。不能使用systemctl重启网卡

#ifconfig            #绑定子接口,IP就显示出来了

在这里插入图片描述
在这里插入图片描述

5、nginx WEB 高可用架构切换(SHELL )

# vi auto_check_nginx_vip.sh

#!/bin/bash
#2018 年 1 月 7 日 20:42:50
#auto change service VIP
#by author www.jfedu.net
########################
NGINX_NUM=`ps -ef|grep nginx|grep -v grep|grep -v check|wc -l`
if [ $NGINX_NUM -eq 0 ];then
   ifdown ens33:1
else
      ping -c 2 192.168.0.188 >/dev/null 2>&1
     if [ $? -ne 0 ];then
cat>/etc/sysconfig/network-scripts/ifcfg-ens33:1<<EOF
TYPE="Ethernet"
BOOTPROTO="static"
DEVICE="ens33:1"
ONBOOT="yes"
IPADDR=192.168.0.188
NETMASK=255.255.255.0
GATEWAY=192.168.0.1
EOF
      ifup ens33:1
      fi
fi

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
两台机器都执行这个命令

#while sleep 2;do sh auto_check_nginx_vip.sh ; done

在这里插入图片描述
在这里插入图片描述
125把nginxpkilll了,ens33:1会自动消失,使用ifconfig,查看IP地址是否消失。

由于两台机器都执行了脚本,当124nginx停止时,125就会执行脚本。域名指向125机器

#while sleep 2;sh auto_check_nginx_vip.sh ; done

两台机器都有ens33:1里面的 188IP地址。当一台nginx停止,几秒之后,另一台机器就会有188地址,同时网站地址也能访问。

在windows里面ping网站,会先ping,然后自动切换到125之后,就能ping通了。

说明切换成功。

1、Nginx WEB高可用架构作业

1) 手工编写SHELL脚本实现两台Nginx WEB高可用切换,并且写出基于SHELL脚本高可用的优点和缺点?
2) 基于SHELL实现Nginx高可用,默认是主备方式,如何修改SHELL使其实现主主高可用,即两台Nginx实现双机互备;
3) 写出Keepalived高可用软件特点及其工作原理,基于Keepalived是如何实现Nginx WEB高可用的?


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寰宇001

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值