location正则表达式
-
nginx的localtion的作用是匹配路径的地址
-
location指令的作用是根据用户请求的URI来执行不同的应用,也就是根据用户请求的网站URL进行匹配,匹配成功即进行相关的操作。
-
location的语法:
(1)以=开头表示精确的匹配
(2)=/ 表示/后面的路径地址不能带任何字符串,否则匹配不上
(3)^~开头表示uri以某个常规字符串开头,不是正则匹配
(4)~开头表示区分大小写的正则匹配
(5)~*开头表示不区分大小写的正则匹配
(6)/ 通用匹配。如果没有其他的匹配,任何请求都会匹配到 -
跨域问题:
是由于域名或者端口号不同,浏览器的安全机制让其不能访问。但内部通信不存在跨域问题。这时候可以使用nginx进行访问,我们使用同一个域名同一个端口号搭建nginx网关进行访问,都访问同一个nginx,只不过location配置不同,根据不同的请求,利用nginx跳转到不同的server服务器上
如:
server {
listen 80;
server_name www.itmayiedu.com;
location /tomcat01/ {
# 这是一个IP地址(因为方便就没有配多个)
proxy_pass http://127.0.0.1:8080;
index index.html index.htm;
}
}
server {
listen 80;
server_name www.itmayiedu.com;
location /tomcat02/ {
# 这是另一个ip地址(应该和第一个不同,太麻烦所以没有配置)
proxy_pass http://127.0.0.1:8080;
index index.html index.htm;
}
}
注意:这里localtion /tomcat01/ 一定要在结束的时候加上/
- nginx可以做网关的作用,但如果同时有nginx和网关的话,nginx主要做的是反向代理,网关的作用是权限控制(黑名单,白名单,负载均衡等)
负载均衡的作用
- 负载均衡,建立在现有的网络结构之上,他提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽,增加吞吐量,加强网络数据处理能力,提高网络的灵活性和可用性。
- 负载均衡,Load Balance,其意思就是分摊到多个操作单元上执行,例如web服务器,FTP服务器,企业关键应用服务器和其他的关键人物服务器等,从而共同完成工作任务。
- 负载均衡就是,将所有的请求先到负载均衡器中,再由负载均衡器采用负载均衡算法(轮训,IP绑定,权重等策略)分发到不同实际的服务器中,这也就是服务器集群,集群的目的就是减轻单台服务器的压力
由上图:
(1)我们的请求是先到了LVS层,LVS会虚拟一个IP出来,再由LVS将请求发给nginx代理服务器
(2)LVS在传输层进行了负载均衡,Nginx在应用层做了负载均衡
(3)客户端先到LVS,再到Nginx,再由Nginx作为代理服务器,请求真实的服务器
负载均衡的缺点
- 使用负载均衡之后,实际用到的服务器会被集群多台,那么这个时候就会产生分布式的很多问题。比如:
(1)分布式session一致性
(2)分布式定时任务调度幂等性
(3)分布式全局生成ID
(4)分布式锁
…等等,一堆分布式问题
网络模型图
- 我们用的socket技术就是传输层的
四层和七层负载均衡的区别
- 负载均衡器分为四层负载均衡器和七层负载均衡器
- 四层负载均衡(就是说是网络的第四层,即传输层),在网络模型中的传输层中,主要基于TCP协议报文实现负载均衡(比如,LVS,F5(硬件负载均衡器),haproxy就是四层负载均衡器),使用改写报文源地址和目的地址方式
- 七层负载均衡(网络模型的第七层,即应用层),在网络模型中的应用层中,基于URL或者HTTP协议实现负载均衡,一般是针对web服务实现负载均衡的
- nginx目前是支持四层负载均衡和七层负载均衡的,1.9之后才开始支持4层负载均衡的。
upstream Server负载均衡
- upstream server翻译过来就是上游服务器,意思就是负载均衡服务器设置,就是说是真实访问的服务器
- 负载均衡算法:配置多个上游服务器(真实业务逻辑访问的服务器)的负载均衡机制
- 失败重试机制:当上游服务器(真实业务逻辑访问的服务器)出现超时或者服务器不存活的时候,是否考虑重试机制补偿
- 服务器心跳检测:当上游服务器(真实业务逻辑访问的服务器)监控检测,心跳检测。有TCP和HTTP协议两种。
不建议使用重试机制和心跳检测,重试机制可能发生重复问题,不保证幂等性;心跳检测一般由keepalive做,不由nginx实现。
Nginx配置负载均衡
- Nginx负载均衡提供上游服务器(真实业务逻辑访问的服务器),负载均衡,故障转移,失败重试,容错,健康检查等。当上游服务器发生故障的时候(就是真实业务逻辑访问的服务器发生故障的时候),可以转移到其他上游服务器(其他的真实服务器)
upstream Server配置
- upstream Server的主要配置是:IP地址和端口号(配置上游服务器的IP地址和端口号)
###定义上游服务器(需要被nginx真实代理访问的服务器) 默认是轮训机制
upstream backServer{
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
server {
listen 80;
server_name www.itmayiedu.com;
location / {
### 指定上游服务器负载均衡服务器
proxy_pass http://backServer;
index index.html index.htm;
}
}
- 默认采用的是轮训的机制,server端的访问变为proxy_pass http://upstream的名字
负载均衡算法
- 轮训(默认)
- 每一个请求按照时间顺序逐一分配到不同的后端服务,如果后端某台服务器死机,自动剔除故障系统,使用户的访问不受影响,服务器的配置相差不多的时候使用轮训机制。
- weight(轮训权值)
- weight的值越大分配到该服务器上的概率就越大,主要用于后端每台服务器性能不均衡的情况下,或者仅仅为在主从的情况下设置不同的权值,达到合理有效的利用主机资源。
- ip_hash
- 每个请求按照访问ip的哈希结果分配。使来自同一个IP的访客固定访问一台后端服务器。并且可以有效的解决动态网页存在session共享的问题。也叫作IP绑定
- fair
- 比weight,ip_hash更加智能的负载均衡算法,fair算法可以根据页面的大小和加载的时间长短,智能的进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身不支持fair,如果要使用这个,必须安装upstream_fair模块
- url_hash(第三方)
-
按照访问的URL的哈希结果来分配请求,使每一个URL定向到一台后端服务器,可以进一步的提高后端缓存服务器的效率。Nginx本身不支持url_hash,如果需要用,需要安装Nginx的hash包
-
举例说明:
(1)轮询,因为默认就是,我们无需加其他配置
###定义上游服务器(需要被nginx真实代理访问的服务器) 默认是轮训机制
upstream backServer{
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
server {
listen 80;
server_name www.itmayiedu.com;
location / {
### 指定上游服务器负载均衡服务器
proxy_pass http://backServer;
index index.html index.htm;
}
}
(2)权重(weight)
upstream backServer{
server 127.0.0.1:8080 weight=1;
server 127.0.0.1:8081 weight=2;
}
server {
listen 80;
server_name www.itmayiedu.com;
location / {
### 指定上游服务器负载均衡服务器
proxy_pass http://backServer;
index index.html index.htm;
}
}
(2)绑定IP(ip_hash)
upstream backServer{
server 127.0.0.1:8080 ;
server 127.0.0.1:8081 ;
ip_hash;
}
server {
listen 80;
server_name www.itmayiedu.com;
location / {
### 指定上游服务器负载均衡服务器
proxy_pass http://backServer;
index index.html index.htm;
}
}
故障转移
- Nginx在反向代理转发到真实服务器的时候(上游服务器),如果上游服务器(真实服务器)出现了down机或者有延迟超时的情况下,直接轮询下一台,轮询下一个节点(轮询的原因是配置的是轮询机制),不会再走已经down的真实服务器
- Nginx配置故障转移:
server {
listen 80;
server_name www.itmayiedu.com;
location / {
### 指定上游服务器负载均衡服务器
proxy_pass http://backServer;
### nginx与上游服务器(真实访问的服务器)超时时间 后端服务器连接的超时时间_发起握手等候响应超时时间
proxy_connect_timeout 1s;
### nginx发送给上游服务器(真实访问的服务器)超时时间
proxy_send_timeout 1s;
### nginx接受上游服务器(真实访问的服务器)超时时间
proxy_read_timeout 1s;
index index.html index.htm;
}
}