文章目录
1【什么是Nginx?】
简介:Nginx是一个 轻量级/高性能的反向代理Web服务器,他实现非常高效的反向代理、负载均衡,他可以处理2-3万并发连接数,官方监测能支持5万并发,现在中国使用nginx网站用户有很多
例如:新浪、网易腾讯等
* 特点:
(1)跨平台、配置简单、反向代理、高并发连接:处理2-3万并发连接数,官方监测能支持5万并发,内存消耗小:开启10个nginx才占150M内存 ,nginx处理静态文件好,耗费内存少。
(2)Nginx内置的健康检查功能:如果有一个服务器
宕机,会做一个健康检查,再发送的请求就不会发器了。重新将请求提交到其他的节点上。
* 使用Nginx的话还能:
1、节省宽带:支持GZIP压缩,可以添加浏览器本地缓存
2、稳定性高:宕机的概率非常小
3、接收用户请求是异步的
Nginx应用场景?
1、http服务器。Nginx是一个http服务可以独立提供http服务,可以做网页静态服务器。
2、虚拟主机。可以实现在一台服务器虚拟出多个网站,例如个人网站使用的虚拟机。
3、反向代理,负载均衡。当网站的访问量达到一定程度后, 单台服务器不能满足用户的请求时,需要 用多台服务器集群可以使用nginx做反向代理。并且多台服务器可以平均分担负载,不会应为某台服务器负载高宕机而某台服务器闲置的情况。
4、nginx中也可以配置安全管理、比如可以使用Nginx搭建API接口网关,对每个接口服务进行拦截。
2【反向代理?正向代理?】
一、正向代理:
直接暴露服务器 IP 让客户端进行访问, 用户知道目标服务器地址,但由于网络限制等原因,无法直接访问。这是需要先连接代理服务器,然后再由代理服务器访问目标服务器。(代理服务器由客户端提供)
二、反向代理:隐藏服务器 IP ,暴露代理服务器 IP 让客户端访问。反向代理对用户则是不可知的, 代理服务器给我们转发请求到他们 N 多的服务器节点中的一个给我们进行搜索后将结果返回。
反向代理,客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。(代理服务器由服务端提供)
3【负载均衡?】
1.简介
单个服务器解决不了,增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡。nginx内置负载均衡策略主要分为三大类,分别是轮询、最少连接和ip hash。
作用
* 解决服务器的高并发压力,提高应用程序的处理性能;
* 提供故障转移,实现高可用;
* 通过添加或减少服务器数量,增强网站的可扩展性;
* 在负载均衡器上进行过滤,可以提高系统的安全性。
2.策略算法
负载均衡器的实现可以分为两个部分:
* 根据负载均衡算法在候选服务器列表选出一个服务器。
* 将请求数据发送到该服务器上。
负载均衡算法是负载均衡服务核心中的核心。负载均衡产品多种多样,但是各种负载均衡算法原理是共性的。负载均衡算法有很多种,分别适用于不同的应用场景。最为常见的负载均衡算法的特性及原理:轮询、随机、最小活跃数、源地址哈希、一致性哈希。
2.1 轮询(实际应用-常用策略)
2.1.1 普通轮询
该方式是默认方式,轮询适合服务器配置相当,无状态且短平快的服务使用。另外在轮询中,如果服务器挂掉,会自动剔除该服务器。单独使用无法保持会话。
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# 定义转发分配规则,该部分内容与 server 节点同级
#tomcat服务器组,要转发到的服务器,如ip、ip:端口号、域名、域名:端口号
upstream tomcat {
server 192.168.58.129:8081 weight=4;
server 192.168.58.129:8082;weight=3;
#server 192.168.58.129:8083;weight=2 down(故障后,不参与负载均衡);
#server 192.168.58.129:8084;weight=1 backup(备用机,当01,02不能用后,才会使用,这两种实际应用不多);
}
server {
listen 80; # nginx监听的端口
server_name localhost;
location / {
# 使用tomcat分配规则,即刚自定义添加的upstream节点
# 将所有请求转发到tomcat服务器组中配置的某一台服务器上
proxy_pass http://tomcat;
}
}
}
location / {
# 隐藏访问页面具体路径和参数,添加匹配映射rewrite
# rewrite 正则 替代内容 flag标记
# 指定URL的替代内容,可以使用正则表达式中的捕获组(使用$1、$2等)来引用匹配的部分。
rewrite ^/([0-9]+).html$ /index.html?a=$1 break;
proxy_pass http://tomcat;
}
flag标记:可选参数,用于控制重写行为的标记。以下是一些常见的flag标记:
last:停止当前的rewrite指令集,并将处理转交给下一个匹配的location。
break:停止当前的rewrite指令集,并立即执行新的URL重写。
redirect或permanent:执行永久重定向(301 Moved Permanently)。
redirect或temporary:执行临时重定向(302 Found)。
rewrite ^/([0-9]+).html$ /index.html redirect;
根据提供的 rewrite 规则,当访问 http://192.168.58.129/9529.html 时,地址栏会被重写为 http://192.168.58.129/index.html。因此,地址栏会发生变化。而break时候,不会变化。
2.1.2 权重轮询方式
如果在 upstream 中配置的server参数后追加 weight 配置,则会根据配置的权重进行请求分发。此策略可以与least_conn和ip_hash结合使用,适合服务器的硬件配置差别比较大的情况。
# 定义转发分配规则
upstream tomcat {
server iau.com weight=1; # 该台服务器接受1/6的请求量
server iau.com:8082 weight=2; # 该台服务器接受2/6的请求量
server 192.168.58.129:8081; weight=3; # 该台服务器接受3/6的请求量;
}
2.2 最小链接
轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果,适合请求处理时间长短不一造成服务器过载的情况。
# 定义转发分配规则
upstream myapp1 {
least_conn; # 把请求分派给连接数最少的服务器
server srv1.com;
server srv2.com:8088;
server 192.168.0.100:8088;
}
2.3 ip hash
这个方法确保了相同的客户端的请求一直发送到相同的服务器,这样每个访客都固定访问一个后端服务器。
如用户需要分片上传文件到服务器下,然后再由服务器将分片合并,这时如果用户的请求到达了不同的服务器,那么分片将存储于不同的服务器目录中,导致无法将分片合并,该场景则需要使用ip hash策略。
需要注意的是,ip_hash不能与backup同时使用,另外当有服务器需要剔除,必须手动down掉,此模式适合有状态服务,比如session。
# 定义转发分配规则
upstream myapp1 {
ip_hash; # #保证每个请求固定访问一个后端服务器
server srv1.com;
server srv2.com:8088;
server 192.168.0.100:8088;
}
3. 负载均衡实验
1.安装测试tomcat,成功后;部署两台tomcat服务器分别设置为8081,8082端口,在webapp下创建test文件夹,创建index目录,分别输入不同内容,予以区分不同端口。配置tomcat的默认页面为test目录下的页面。
2.配置nginx配置文件,定义请求转发方式,普通轮询,权重轮询,least_conn, in-hash请求固定方式。修改后需要重新启动nginx。
3.访问页面 http://192.168.58.129/test/index.html。
4【动静分离?】
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。适合中小型企业。
Nginx通过反向代理的方式实现动静分离。当客户端发出请求时,Nginx接收到请求后,会根据预先配置的动静分离规则,将请求转发给后端服务器。动静分离规则可以根据文件扩展名、请求路径等条件进行匹配,从而实现不同的处理逻辑。
动静分离的核心思想是将静态资源缓存到Nginx服务器上,减少对后端服务器的请求次数。当客户端请求静态资源时,Nginx可以直接从缓存中返回,而不需要将请求转发给后端服务器。这样可以大幅降低后端服务器的负载,提高系统的性能和响应速度。
配置:首先打静态文件放置到前置代理服务器nginx
server {
listen 80; # nginx监听的端口
server_name localhost;
location / {
# 使用tomcat分配规则,即刚自定义添加的upstream节点
# 将所有请求转发到tomcat服务器组中配置的某一台服务器上
proxy_pass http://tomcat;
# root html;
#index index.html index.htm;
}
#上一个location 直接将请求转发到目标服务器,无法获取静态资源,添加location获取静态资源
location ~*/(js)|(html)|(img) { #正则表达式~开头和~*开头分别表示区分大小写和不区分大小写
root html;
index index.html index.htm;
}
}
5【防盗链?】
1、Nginx Referer模块
HTTP Referer是Header的一部分,当浏览器向Web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器借此可以获得一些信息用于处理。例如防止未经允许的网站盗链图片、文件等。因此HTTP Referer头信息是可以通过程序来伪装生成的,所以通过Referer信息防盗链并非100%可靠,但是,它能够限制大部分的盗链情况。
nginx模块ngx_http_referer_module通常用于阻挡来源非法的域名请求。当一个请求头的Referer字段中包含一些非正确的字段,这个模块可以禁止这个请求访问站点。构造Referer的请求很容易实现,所以使用这个模块并不能100%的阻止这些请求。
参数说明:
none:请求头缺少Referer字段,即空Referer
blocked:请求头Referer字段不为空(即存在Referer),但是值被代理或者防火墙删除了,这些值不以“http://”或“https://”开头,通俗点说就是允许“http://”或"https//"以外的请求。表示Referer值被防火墙进行伪装。
server_names:Referer请求头白名单。
arbitrary string:任意字符串,定义服务器名称或可选的URI前缀,主机名可以使用*号开头或结尾,Referer字段中的服务器端口将被忽略掉。
regular expression:正则表达式,以“~”开头,在“http://”或"https://"之后的文本匹配。
server {
listen 80 ;
server_name localhost;
# 拦截非法referer,添加白名单
valid_referers none www.iau.com img.iau.com ;
if ($invalid_referer) {
#如果需要回一张错误提示静态图片
#return ^/ /img/error.png break;
return 401;
}
#请求失败页面转发
location /401.html {
root html;
}
}
上面配置合法的Referer为 www.abc.com / img.abc.com 和 无Referer(浏览器直接访问,就没有Referer) ; 其他非法Referer请求过来时, $invalid_referer 值为1 , 就return 403 , 或者重定向到一个403图片。
6 【keepalived】
1. 简介:Keepalived是Linux下一个轻量级别的高可用解决方案。高可用:广义来讲,是指整个系统的高可用行;狭义的来讲就是主机的冗余和接管。
解决单点故障
组件免费
可以实现高可用HA机制(主备)(high ability)
基于VRRP协议
利用keepalive实现一个虚拟ip(vip)在两台代理服务器上漂移。防止单点服务器故障问题。
- 安装
yum install -y keepalived
- 修改配置文件
vim /etc/keepalived/
! Configuration File for keepalived
global_defs {
router_id ip129
}
#VRRP协议
vrrp_instance iau {
state MASTER
#ens160
interface eth160
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
#虚拟ip
virtual_ipaddress {
192.168.58.58
}
}
4. systemctl start keepalived.service
5. ip addr 查看虚拟ip
keepalived,ningx单独运行,当nginx故障后,keepalived无法监听,所以配置nginx监听脚本,当nginx故障,叫停keepalived服务。
高级用法:配置nginx监听脚本