您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
nginx-nginx实现负载均衡
发布时间:2017-11-23 12:25:36编辑:雪饮阅读()
反向代理后端如果有多台服务器,自然可形成负载均衡,
但proxy_pass如何指向多台服务器?
把多台服务器用 upstream指定绑定在一起并起个组名,
然后proxy_pass指向该组
给/ecshop的location设置默认文档,否则每次访问都要加index.php:
location /ecshop {
rewrite "goods-(\d{1,7})\.html" /ecshop/goods.php?id=$1;
rewrite "article-(\d{1,7})\.html" /ecshop/article.php?id=$1;
rewrite category-(\d+)-b(\d+)-min(\d+)-max(\d+)-attr([\d\.]+)-(\d+)-(\w+)-(\w+)\.html /ecshop/category.php?id=$1&brand=$2&price_min=$3&price_max=$4&filter_attr=$5&page=$6&sort=$7&order=$8;
rewrite category-(\d+)-b(\d+)-min(\d+)-max(\d+)-attr([\d\.]+).*\.html /ecshop/category.php?id=$1&brand=$2&price_min=$3&price_max=$4&filter_attr=$5;
rewrite category-(\d+)-b(\d+)\.html /ecshop/category.php?id=$1&brand=$2;
index index.php;
}
建立两个用于负载均衡所有站内图片的服务器:
server {
listen 81;
server_name localhost;
root html;
access_log logs/81-access.log main;
}
server {
listen 82;
server_name localhost;
root html;
access_log logs/82-access.log main;
}
这两个服务器的根目录和主服务器根目录,但是主服务器仅请求图片时才通过这两个服务器解析。这两个服务器的日志也分开放,是为了后面观察负载均衡效果来判断是否成功配置好负载均衡而准备的。
配置上游服务器组:
upstream imgserver {
server 192.168.101.108:81 weight=1 max_fails=2 fail_timeout=3;
server 192.168.101.108:82 weight=1 max_fails=2 fail_timeout=3;
}
这个上游服务器组中的组成员都是本地的服务器,为了节省实验成本,所以采用不同的端口来模仿真实的不同的服务器。
weight是权重,负载均衡时如果有优先级问题,则可以通过权重来选择由谁来处理当前的请求。
max_fails最大尝试失败次数,当次数
fail_timeout max_fails次失败后,暂停的时间。
如果某台服务器在fail_timeout时间内出现了max_fails次连接失败,那么nginx就会认为那个服务器已经挂掉,从而在 fail_timeout时间内不再去查询它,fail_timeout的默认值是10s,max_fails的默认值是1(这意味着一发生错误就认为服务器挂掉),如果把max_fails设为0则表示对该节点的检查取消。
为图片请求的location添加负载均衡:
location ~* \.(jpg|jpeg|gif|png)$ {
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://imgserver;
}
第一行给请求头中添加X-Forwarded-For,将获取的客户端的ip赋值于X-Forwarded-For。由于负载均衡的原理实质上就是反向代理,这样做可以使得最终处理本次请求的那个服务器能正确的获取到真实客户端的ip,若没有X-Forwarded-For则无法获取到真实客户端ip,最多只能获取到未负载均衡之前的当前服务器的ip,因为负载均衡过程中当前服务器又被当做客户端了,用该服务器做客户端以真实客户端的请求做为自己的请求去向负载均衡的服务器组中组成员服务器进行请求。
既然负载均衡的原理是反向代理。那么之前使用反向代理让apache来处理php的location中应该也要加上X-Forwarded-For,否则php也无法获取到真实客户端ip。
location ~ \.php$ {
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://192.168.101.108:8080;
}
测试负载均衡:
利用echo空内容重定向文件的方法来清除两个日志文件内容,然后不断强制刷新nginx访问页面,同时观察这两个文件的内容的改变,如果一会儿81文件的内容增多,82的内容不变,一会82的内容增多,81的内容不变。则负载均衡成功。
清空命令如
echo > /usr/local/nginx/logs/81-access.log
echo > /usr/local/nginx/logs/82-access.log
查询命令如
tail /usr/local/nginx/logs/81-access.log
tail /usr/local/nginx/logs/82-access.log
默认的均衡的算法很简单,就是针对后端服务器的顺序,逐个请求.
请求到最后一个服务器之后再有请求就又回到第一个服务器,如此往复循环下去。
也有其他负载均衡算法,如一致性哈希,需要安装第3方模块.
关键字词:nginx,负载均衡
上一篇:nginx-nginx日志管理
下一篇:nginx-nginx信号量