一、基本概念
大约 5 分钟约 1379 字
(一)简介
1.概述
Nginx
(engine x)是一个高性能的HTTP
和反向代理web
服务器- 同时也提供了
IMAP/POP3/SMTP
服务 Nginx
是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru
站点(俄文:Рамблер
)开发的- 其特点是占有内存少,并发能力强,事实上
Nginx
的并发能力在同类型的网页服务器中表现较好 - 中国大陆使用
Nginx
网站用户有:百度、京东、新浪、网易、腾讯、淘宝等 - http://nginx.org/en/download.html
2.作为 Web 服务器
Nginx
可以作为静态页面的Web
服务器,同时还支持CGI
协议的动态语言- 比如
Perl
、PHP
等,但是不支持Java
Java
程序只能通过与Tomcat
配合完成Nginx
专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率,能经受高负载的考验- 有报告表明能 支持高达 50000 个并发连接数 (C10K:Connection 10000,万级连接数)
(二)反向代理
1.正向代理
- 如果把局域网外的
Internet
想象成一个巨大的资源库,则局域网中的客户端要访问Internet
时,需要通过代理服务器来访问,这种代理服务就称为正向代理【梯子】
重要
正向代理,是在浏览器(客户端)配置代理服务器,代理的是客户端
2.反向代理
- 客户端对代理无感知,只需将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后再返回给客户端
- 此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是反向代理服务器的地址,隐藏了真实服务器的
IP
地址
重要
反向代理,是在服务器端配置代理服务器,代理的是服务器
(三)负载均衡
1.早期架构模式
- 客户端发送多个请求到服务器,服务器处理请求,有一些可能要与数据库进行交互,服务器处理完毕后,再将结果返回给客户端
- 这种架构模式对于早期的系统相对单一,并发请求相对较少的情况下是比较适合的,成本也低
- 但是随着信息数量的不断增长,访问量和数据量的飞速增长,以及系统业务的复杂度增加,这种架构会造成服务器响应客户端的请求日益缓慢,并发量特别大的时候,还容易造成服务器直接崩溃,很明显这是由于服务器性能的瓶颈造成的问题
2.集群 —— 负载均衡
- 单个服务器解决不了上述问题,于是产生了 集群 的概念
- 增加服务器的数量 ,然后将请求分发到各个服务器上,将原先请求集中到单个服务器的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,即负载均衡
3.Nginx 负载均衡的分配方式(策略)
1)轮询(默认)
- 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器
down
掉,能自动剔除
2)weight
weight
代表权重,默认为 1- 权重越高被分配的客户端越多
- 指定轮询几率,
weight
和访问比率成正比,用于后端服务器性能不均的情况
upstream server_pool {
server 192.168.5.21 weight=5;
server 192.168.5.22 weight=10;
}
3)ip_hash
- 每个请求按访问
ip
的hash
结果分配,这样每个访客固定访问一个后端服务器,可以解决session
的问题
upstream server_pool {
ip_hash;
server 192.168.5.21:80;
server 192.168.5.22:80;
}
4)fair(第三方)
- 按后端服务器的响应时间来分配请求,响应时间短的优先分配
upstream server_pool {
server 192.168.5.21:80;
server 192.168.5.22:80;
fair;
}
(四)动静分离
- 为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来单个服务器的压力
1.实现方式一
- 纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案
- 通过
location
指定不同的后缀名实现不同的请求转发 - 通过
expires
参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量 expires
:给一个资源设定一个过期时间,即无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量- 此种方法非常适合 不经常变动的资源 ,如果经常更新的文件,不建议使用
Expires
来缓存
- 通过
- 例:设置
3d
,表示在这 3 天之内访问这个URL
,发送一个请求- 比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返状态码
304
- 如果有修改,则直接从服务器重新下载,返回状态码
200
- 比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返状态码
2.实现方式二
- 动态和静态文件混合在一起发布,通过
Nginx
来分开