本次分享基于618慕课网直播。
618双11这样的活动肯定会有大促,有大促就会有大流量,那么必然的我们必须要保证两个点,一个是高可用,一个是高并发。
那么这次涉及到的一些资料,软件等可以到直播群里去获取,汇总后会统一发出来的。
那么说到集群高可用的话肯定会联想到Nginx,通过nginx就能搭建多机节点的集群,比如tomcat集群,nginx作为网关接受用户的请求,起到反向代理的作用。
Nginx是反向代理服务器,可以构建集群和负载均衡,我们公开课里会使用阿里的Tengine,Tengine是基于Nginx的增强版本,阿里在此基础上的二次开发并且开源的服务器。(可以理解为nginx相当于iPhone12,tengine相当于iPhone12plus)。那么学了Tengine就相当于nginx也会了,一石二鸟。
Nginx并发能力很强,可以支持上万并发(理论5万左右),并且所需要的硬件配置不会很高,对cpu,内存的依赖度不大,而且长期运行十分稳定可靠。
Nginx是异步非阻塞的(AIO),上万连接可以对应到一个进程。(在咱们架构师课程里我们提过apache这个httpd服务器,它是同步阻塞的(BIO),一个连接就对应一个线程,并发越高性能越低下)所以现在主流的服务器都用的nginx或者tengine。
欸?那nginx和tengine是7层还是4层的网络模型呀? 那LVS呢? 俗话说四层转发,七层代理。LVS4层只管向后抛,他不会处理你的请求,7层可以处理,他提供了http协议,根据根据url地址来找到你硬盘里的某个资源文件地址,或匹配请求到反向代理的upstream,他也可以操作header啊cookie啥的。后面要说的负载均衡器组件SLB也是四层负载。
如何理解四层和七层,参考下图:
上面的概念没听懂没关系,我们先把Tengine来安装一下,概念在后面循序渐进的去理解。 打开:http://tengine.taobao.org/ 下载最新版的即可
用腾讯云的的666miss服务器
tar zxvf tengine-2.3.2.tar.gz
./configure --prefix=/usr/local/tengine
make && make install
启动方式与nginx一致
浏览器访问tengine所在的内网ip:
虽然是tengine,但是本质上他还是nginx的进程:
打开 /usr/local/tengine/conf/nginx.conf
,配置内容如下:
# 默认注释了,其实就是nginx的默认用户,注释代表使用当前用户,也就是root,这里可以修改为指定的用户,用以限制。
#user nobody;
#nginx 是多进程,一个进程里又可以开很多线程,线程用以处理用户连接,可以设置为CPU的核数为1,预留一
个,比如你现在是8核的,那就设置为7,当然你设置为8问题也不大,这个服务器里不要再放额外的一些中间件了(默认1个)
worker_processes 2;
# 每个worker进程可以处理的最大连接数,连接数并不是越大越好,因为还受到环境因素,比如磁盘io或网络
io快不快,内存和cpu大不大等因素影响。
events {
worker_connections 10240;
}
# 此外,操作系统限制一个进程能够打开的最大文件数,也限制了nginx的最大并发,可以通过如下查看:
# cat /proc/sys/fs/file-max
# 一般9万左右,worker_processes x worker_connections < file-max,这个可以自己调大
# 如果反向代理了几台tomcat,那么总的并发数是 worker_processes x worker_connections / 4,得出的值
是一个差不多的范围,4是一个预估的经验值(长期以往大家总结的)。
# 需要注意,真正的并发数并不是一个特定的值,是根据硬件资源以及环境资源的一个综合的值,和上面计算
得出的值也肯定会有一定的偏差
# HTTP 模块
http {
# 在任何地方都能使用include进行配置的引入
# 资源媒体类型,浏览器支持的资源媒体类型和我们设置的类型匹配,则会在浏览器播放视频/播放音乐/展示图片,不匹配则下载,阿里OSS的图片在chrome上只能下载不能展示,道理是一样的
include mime.types;
# 如果文件类型在mime.type中找不到则默认使用下方的
default_type application/octet-stream;
# 高效传输模式,发送文件数据更快,简单来说,nginx作为静态资源服务器,开启会提高nginx性能,如果把nginx作为反向代理服务器,那么没什么卵用
# 文件数据传输存在于操作系统的内核里,不需要经过缓冲区的拷贝,如此效率更高,性能更好,也可以称之为零拷贝
sendfile on;
# 打开后可以优化网络传输,打开的前提是sendfile为on
# tcp_nopush on;
# 设置客户端与服务端请求的超时时间,保证客户端多次请求的时候不会重复建立新的连接,节约资源损耗。
#keepalive_timeout 0;
keepalive_timeout 65;
# 启用压缩,html/js/css压缩后文件变小,传输也会更快(我们在架构师课程里有演示过吧,不记得的敲个0)
#gzip on;
# 可以在http指令块中设置多个虚拟主机
server {
# listen 监听端口
# server_name localhost、ip、域名
# location 请求路由映射,匹配拦截,默认用`/`可以对后面的路径进行匹配,匹配到就显示对应的资源文件。
# location 参考文档:http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_core_module.html#location
# root 请求位置
# index 首页设置
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
}
}