前端代理怎么设置之负载均衡
以下部分内容由小红书(www.xiaohongshutuiguang.cn)转载提供
我们先来看张图吧:
使用集群是网站解决高并发、海量数据问题的常用手段。当一台服务器的处理能力、存储空间不足时,不要企图去换更强大的服务器,对大型网站而言,不管多么强大的服务器,都满足不了网站持续增长的业务需求。这种情况下,更恰当的做法是增加一台服务器分担原有服务器的访问及存储压力。通过负载均衡调度服务器,将来自浏览器的访问请求分发到应用服务器集群中的任何一台服务器上,如果有更多的用户,就在集群中加入更多的应用服务器,使应用服务器的负载压力不再成为整个网站的瓶颈。
那么下面,我们来看下,如何通过nginx服务器,配置集群。首先,我们需要在nginx服务器,同过不同的端口号,创建几个node服务。node服务的代码类似这样:
varhttp = require( 'http' );varserver =http.createServer(function ( request ,response ){
response.end('server3 000');
} );
server.listen( 3000 ,function(){
console.log( 'HTTP服务器启动中,端口:3000' );
});
然后,nginx中可以这样配置:
http{
upstream zhufeng {
server 127.0.0.1:3000weight=10;
server 127.0.0.1:4000;
server 127.0.0.1:5000;
}
server {
location / {
proxy_pass http://zhufeng; }
}
}
然后呢,安装一下pm2:
yuminstallpm2 -g
如果太慢的话,可以试试淘宝源。这里就不说怎么配置了哦。然后安装好pm2后,通过pm2启动各个node服务。pm2是一个node应用的进程管理器。
然后,可以通过以下命令来启动和查看node服务进程:
# 启动node服务
pm2 start xxx.js name xxx
# 查看当前服务
pm2 list
后端服务器调试状态:
状态描述
down当前的服务器不参与负载均衡
backup当其它节点都无法使用时的备份的服务器
max_fails允许请求失败的次数,到达最大次数就会休眠
fail_timeout经过max_fails失败后,服务暂停的时间,默认10秒
max_conns限制每个server最大的接收的连接数,性能高的服务器可以连接数多一些
例子:
upstream webserver{
server localhost:3000 down;
server localhost:4000 backup;
server localhost:5000max_fails=1fail_timeout=10s;
}
分配方式:
类型种类
轮询(默认)每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除
weight(加权轮询)指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况
ip_hash每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题
least_conn哪个机器上连接数少就分发给谁
url_hash(第三方)按访问的URL地址来分配 请求,每个URL都定向到同一个后端 服务器上(缓存)
fair(第三方)按后端服务器的响应时间来分配请求,响应时间短的优先分配
正定义hashhash自定义key
例子:
upstream webserver{
ip_hash;
server 127.0.0.1:3000;
}
upstream webserver{
least_conn;
server 127.0.0.1:3000;
}
upstream webserver{
url_hash;
server 127.0.0.1:3000;
}
upstream webserver{
fair;
server 127.0.0.1:3000;
}
upstream webserver{
hash $request_uri;
server 127.0.0.1:3000;
}
三、其他
一)缓存
首先啊,缓存有很多种,比如之前学过的浏览器缓存,还有应用服务器缓存,代理缓存,客户端缓存等等等等。我们可以在nginx中使用prxoy_cache来设置代理缓存。
http{
# 缓存路径 目录层级 缓存空间名称和大小 失效时间为7天 最大容量为10g
proxy_cache_path /data/nginx/cache levels=1:2keys_zone=cache:100m inactive=60m max_size=10g;
}
稍微复杂点的方式如下:
if($request_uri ~ ^/cache/(login|logout)) {
set $nocache 1;
}
location / {
proxy_pass http://webserver; }
location ~ ^/cache/ {
proxy_cache cache;
proxy_cache_valid 200206304301302 60m; # 对哪些状态码缓存,过期时间为60分钟
proxy_cache_key $uri; #缓存的维度
proxy_no_cache $nocache;
proxy_set_header Host $host:$server_port; #设置头
proxy_set_header X-Real-IP $remote_addr; #设置头
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #设置头
proxy_pass http://127.0.0.1:6000;}
然后呢,上面的各个字段的含义如下:
键值含义
proxy_cache使用名为cache的对应缓存配置
proxy_cache_valid 200 206 304 301 302 10d;对httpcode为200的缓存10天
proxy_cache_key $uri定义缓存唯一key,通过唯一key来进行hash存取
proxy_set_header自定义http header头,用于发送给后端真实服务器
proxy_pass指代理后转发的路径,注意是否需要最后的/
二)location
它的使用其实就是正则表达式,但是语法规则会有些特性,正则我就不在这里多说,咱们直接看下location的语法:
location仅匹配URI,忽略参数
前缀字符串
常规
= 精确匹配
^~ 匹配上后则不再进行正则表达式的匹配
正则表达式
~ 大小写敏感的正则表达式匹配
~*忽略大小写的正则表达式匹配
内部调转
用于内部跳转的命名location @
Syntax location [=|~|~*|^~] uri {...}
location @name{...}
default -Context server,location
匹配的优先级,按照上面的顺序,从上到下,最上面的优先级最高,我们来看个实际的例子:
location ~ /T1/$ {
return 200'匹配到第一个正则表达式';
}
location ~* /T1/(\w+)$ {
return 200'匹配到最长的正则表达式';
}
location ^~ /T1/ {
return 200'停止后续的正则表达式匹配';
}
location /T1/T2 {
return 200'最长的前缀表达式匹配';
}
location /T1 {
return 200'前缀表达式匹配';
}
location = /T1 {
return 200'精确匹配';
}
/T1// 精确匹配/T1/// 停止后续的正则表达式匹配/T1/T2// 匹配到最长的正则表达式/T1/T2/// 最长的前缀表达式匹配/t1/T2// 匹配到最长的正则表达式