软负载是基于服务器安装的特定软件,比如:nginx实现负载均衡。
硬负载均衡是基于固定的硬件实现负载均衡,比如:F5。
在nginx.conf配置文件中配置如下:
server {
listen 80;
server_name www.mayikt.com; #请求的域名
#
location / {
proxy_pass http://127.0.0.1:8080; #将请求转发到这个域名
index index.html index.htm;
}
}
Nginx负载均衡提供上游服务器(真实业务逻辑访问的服务器),负载均衡、故障转移、失败重试、容错、健康检查等。
当上游服务器(真实业务逻辑访问的服务器)发生故障时,可以转移到其他上游服务器(真实业务逻辑访问的服务器)。
upstream 主要配置如下:
IP地址和端口号:配置上游服务器的IP地址和端口
###定义上游服务器(需要被nginx真实代理访问的服务器) 默认是轮训机制
upstream backServer{
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
server {
listen 80;
server_name www.mayikt.com;
location / {
### 指定上游服务器负载均衡服务器
proxy_pass http://backServer;
index index.html index.htm;
}
}
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
upstream backserver {
server 192.168.0.14;
server 192.168.0.15;
}
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。backup备用服务器,服务器全部崩溃后启动
upstream backserver {
server 192.168.0.14 weight=3;
server 192.168.0.15 weight=7;
server 192.168.0.15 weight=7 backup;
}
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
upstream backserver {
ip_hash;
server 192.168.0.14:88;
server 192.168.0.15:80;
}
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream backserver {
server server1;
server server2;
fair;
}
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
upstream somestream {
hash $request_uri;
server 192.168.244.1:8080;
server 192.168.244.2:8080;
server 192.168.244.3:8080;
server 192.168.244.4:8080;
}
server {
listen 8081 default;
server_name test.csdn.net;
charset utf-8;
location /get {
proxy_pass http://somestream;
}
}
上述同样也是一个极简的监听8081端口的nginx服务,当请求url为/get时,会走url_hash;同样配置了upstream模块,hash $request_uri表明了是按照url规则进行hash策略。
区别:alias后面必须要用“/”结束,否则会找不到文件的。而root可有可无。
两个命令的作用:都是指定静态文件的目录。
页面中请求的ajax地址如果与页面请求地址域名和端口、协议不同的话,浏览器采用安全策略,请求能够正常到达服务器端,但是无法获取响应结果。
响应头设置允许跨域权限 response.setHeader(“Access-Control-Allow-Origin”, “*”); 适合于小公司
使用jsonp解决网站跨域问题 缺点:只能支持Get请求 模拟脚本提交。
使用Nginx搭建API网关保持域名和端口一致 Location
使用微服务中的Zuul网关
HttpClient实现转发 缺点:重复发送两次请求
配置案例:
使用Nginx搭建API网关保持域名和端口一致。下面配置根据请求路径的不同将请求转发给不同的域名、端口去处理。
location /b {
proxy_pass http://192.168.18.190:8081/;
index index.html index.htm;
}
location /a {
proxy_pass http://192.168.18.190:8080/;
index index.html index.htm;
}
实际开发中前后端分离
通过指定模式来与客户端请求的URI相匹配,基本语法如下:location [=||*|^~|@] pattern{……}
~ #区分大小写的正则匹配
~* #不区分大小写的正则匹配
^~ #普通字符匹配,如果此选项匹配成功,忽略其他匹配选项,一般用来匹配目录
= #普通字符精确匹配
1、没有修饰符 表示:必须以指定模式开始(也就是请求链接以kaico开头),如:
location /kaico{
}
如下匹配正确:
http://baidu.com/kaico/abc
http://baidu.com/kaico/abc?p1
如下匹配错误:
http://baidu.com/abc/kaico/
http://baidu.com/abc/kaicode
2、=表示:必须与指定的模式精确匹配(也就是请求链接必须一致)
location =/kaico{
}
如下匹配正确:
http://baidu.com/kaico
http://baidu.com/kaico?p1
如下匹配错误:
http://baidu.com/kaico/
http://baidu.com/kaicode
3、~ 表示:指定的正则表达式要区分大小写
location ~ ^/abc$ {
……
}
如下匹配正确:
http://baidu.com/abc
http://baidu.com/abc?p1=11&p2=22
如下匹配错误:
http://baidu.com/ABC
http://baidu.com/abc/
http://baidu.com/abcde
4、^~ 表示:指定的正则表达式区分大小写,如果此选项匹配成功,忽略其他匹配选项(停止向下搜索),一般用来匹配目录
location ^~ /images/ {
# 匹配任何以 /images/ 开始的查询并且停止搜索,不检查正则表达式。
[ configuration C ]
}
5、~* 表示:指定的正则表达式不区分大小写
location ~* ^/abc$ {
……
}
如下匹配正确:
http://baidu.com/abc
http://baidu..com/ABC
http://baidu..com/abc?p1=11&p2=22
如下匹配错误:
http://baidu..com/abc/
查找顺序和优先级
1:带有“=“的精确匹配优先
2:没有修饰符的精确匹配
3:正则表达式按照他们在配置文件中定义的顺序
4:带有“^~”修饰符的,开头匹配
5:带有“~” 或“~*” 修饰符的,如果正则表达式与URI匹配
6:没有修饰符的,如果指定字符串与URI开头匹配