正常请求:客户端(发送请求)——》服务器(接收请求并获取数据)——》数据库(获取数据给服务器)——》服务器(拿到数据返回到客户端)——》客户端(接收数据前端显示);
负载均衡原理:客户端(发送请求)——》服务器(nginx)(接收请求转发给服务器)——》服务器A(接收请求并获取数据)——》数据库(获取数据给服务器)——》服务器A(拿到数据返回到客户端)——》客户端(接收数据前端显示);
理解:
负载均衡即分发请求,当发送请求给服务器A后,A将请求转发给B或者C,然后由B或者C处理获取返回数据给客户端,Nginx转发条件默认轮询;
优点:
1、客户端无感觉,所有基础配置均在服务器中完成
2、处理请求高并发,请求由不同的服务器负载,降低服务器崩溃几率
3、服务器暴露在外的只有Nginx的服务器ip,转发的目标服务器不会暴露
缺点:
1、成本增加(负担不起那是你的问题,不是程序的)
2、由于每次请求转发的服务器都可能不一样,所以Session中存储数据无法每次都请求到
即:常见的登录用户数据不能存到Session中,(适用于所有服务器缓存)
解决方式:可将常用数据存入Redis中、iphash等。。。(暂时只知道这一种,有其他的方式欢迎留言讨论)
Nginx负载均衡配置:
#设定负载均衡的服务器列表
upstream tomcat {
server ip:端口号;
}
//例子:
upstream tomcat {
server 127.0.0.1:8080;
}
server
{
listen 80;
server_name myadmin;
index index.html index.htm index.php;
root /www/server/myadmin;
#error_page 404 /404.html;
include enable-php.conf;
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 12h;
}
location ~ /\.
{
deny all;
}
//主要配置
location / {
#拦截你向当前配置nginx的服务器请求转发到负载均衡配置的服务器列表中的服务器
proxy_pass http://tomcat;
#配置默认访问页,这里就会访问到tomcat里面的那个index.html文件里面
index index.html;
}
access_log /www/wwwlogs/access.log;
}
Nginx的location规则:
语法:location [=||*|^~] /uri/ { … }
例子:location / {} : 匹配所有请求
= 严格匹配。如果请求匹配这个location,那么将停止搜索并立即处理此请求
~ 区分大小写匹配(可用正则表达式)
~* 不区分大小写匹配(可用正则表达式)
!~ 区分大小写不匹配
!~* 不区分大小写不匹配
^~ 如果把这个前缀用于一个常规字符串,那么告诉nginx 如果路径匹配那么不测试正则表达式
负载均衡模式:
1、轮询:根据访问时间将请求逐一发送给不同的服务器
2、ip_hash:每个请求按访问IP的hash结果分配,同一个IP客户端固定访问一个后端服务器。可以保证来自同一ip的请求被打到固定的机器上,可以解决session问题。
3、url_hash:按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器。后台服务器为缓存的时候效率。
4、fair:更加智能的负载均衡算法。使用需要下载upstream_fair
模块
down:不参与负载,不会转发到该服务器
backup:备份机器,当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器
但不可与ip_hash同时配置,因为ip_hash会只访问一台服务器
例子:
#设定负载均衡服务器列表
upstream tomcat {
#后端服务器访问规则
ip_hash; #添加参数支持哈希,不可与backup同时使用
server 127.0.0.1:8080 weight=1; #server1 权重,权重越高负载越大
server 127.0.0.1:8080 down; #server2 不参与负载
server 127.0.0.1:8090 backup; #server3 备份机
}
server {
listen 80; //拦截端口80
server_name myadmin; //配置多个站点或站点的多个二级域名
location / {
proxy_pass http://tomcat;
}
}