来源: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高可用的?