nginx 反向代理时,如果后端有多台服务器,就可以实现负载均衡。

实现原理:把多台服务器用 upstream 绑定在一起并起一个组名,然后 proxy_pass 指向该组。

ngx_http_upstream_module 官方文档地址:http://nginx.org/en/docs/http/ngx_http_upstream_module.html

upstream 的上下文是 http

实现过程

例,有两台后端服务器,专门用来存放图片信息

① 编辑 /usr/local/nginx/conf/nginx.conf,添加两个 server 段,分别监听 81 端口 和 82 端口,都指向 /usr/local/nginx/html 目录:

[root@localhost nginx]# vim conf/nginx.conf

nginx.conf 添加:

    server {
listen ;
server_name localhost;
root html;
access_log logs/-access.log main;
} server {
listen ;
server_name localhost;
root html;
access_log logs/-access.log main;
}

注:为了方便观察日志,两个 server 单独设置 access.log 目录。

保存退出。平滑重启 nginx。

此时访问 http://192.168.254.100:81/nginx.png 和 http://192.168.254.100:82/nginx.png:

② 在 http 段中添加一段 上游服务器,命名为 imageserver:

    upstream imageserver{
server 192.168.254.100:81 weight=1 max_fails=2 fail_timeout=3;
server 192.168.254.100:82 weight=1 max_fails=2 fail_timeout=3;
}

注:

weight = 1 表示权重为 1

max_fails = 2 表示 最多 2 次连续连不上服务器就不再进行连接

fail_timeout = 3 表示 3 秒连不上服务器就算失效

③ 把之前配置的 location ~ image 注释:

        location ~ image {
# root /var/www/;
# expires 1d;
# index index.html;
}

把之前配置的 location ~* \.(jpg|jpeg|png|gif) 中的缓存注释

        location ~* \.(jpg|jpeg|png|gif){
expires 1d;
}

④ 在 location ~* \.(jpg|jpeg|png|gif) 段中进行配置,如果遇到图片,则转发给 imageserver:

        location ~* \.(jpg|jpeg|png|gif){
#expires 1d;
proxy_pass http://imageserver;
}

保存退出。平滑重启 nginx。

⑤ 再次访问 http://192.168.254.100/ecshop/index.php,观察访问日志:

81-access.log:

82-access.log:

⑥ 清空 81-access.log 和 82-access.log

[root@localhost nginx]# echo > logs/-access.log
[root@localhost nginx]# echo > logs/-access.log

单独访问 ecshop 下某张图片,例如 http://192.168.254.100/ecshop/themes/default/images/logo.gif

81-access.log:

82-access.log 为空:

再次强刷该图片页面 http://192.168.254.100/ecshop/themes/default/images/logo.gif

再次查看两个日志文件:

可以多次测试,查看日志。

负载均衡的算法是针对后端服务器的顺序逐个请求。也有其他负载均衡的算法(例如使用第三方模块 ngx_http_upstream_consistent_hash)。

⑦ 观察本机 ip:192.168.254.1

再观察 access.log

访客的 ip 是 192.168.254.1,没有问题。

再观察负载均衡的日志:

访客的 ip 变成了前端服务器的 ip 地址,而不是真实的访客地址。

解决方案:

在 nginx.conf 的 location 段中,加入 X-Forwarder-For 信息:

        location ~* \.(jpg|jpeg|png|gif){
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://imageserver;
}

此时再次刷新 ecshop,查看负载均衡日志:

http 头信息中就有了访客的真实 ip。

Nginx 笔记与总结(16)nginx 负载均衡的更多相关文章

  1. 001/Nginx高可用模式下的负载均衡与动静分离(笔记)

    Nginx高可用模式下的负载均衡与动静分离 Nginx(engine x)是一个高性能的HTTP和反向代理服务器,具有内存少,并发能力强特点. 1.处理静态文件.索引文件以及自动索引:打开文件描述符缓 ...

  2. nginx之rewrite重写,反向代理,负载均衡

    rewrite重写(伪静态): 在地址栏输入xx.com/user-xxx.html, 实际上访问的就是xxx.com/user.php?id=xxx rewrite就这么简单 附上ecshop re ...

  3. 使用nginx sticky实现基于cookie的负载均衡【转】

    在多台后台服务器的环境下,我们为了确保一个客户只和一台服务器通信,我们势必使用长连接.使用什么方式来实现这种连接呢,常见的有使用nginx自带的ip_hash来做,我想这绝对不是一个好的办法,如果前端 ...

  4. (转载)Nginx/LVS/HAProxy三种主流负载均衡软件的对比

    原地址:http://www.ha97.com/5646.html PS:Nginx/LVS/HAProxy是目前使用最广泛的三种负载均衡软件,本人都在多个项目中实施过,参考了一些资料,结合自己的一些 ...

  5. nginx Win下实现简单的负载均衡(1)nginx搭建部署

    快速目录: 一.nginx Win下实现简单的负载均衡(1)nginx搭建部署 二.nginx Win下实现简单的负载均衡(2)站点共享Session 三.nginx Win下实现简单的负载均衡(3) ...

  6. 在Linux上使用Nginx为Solr集群做负载均衡

    在Linux上使用Nginx为Solr集群做负载均衡 在Linux上搭建solr集群时需要用到负载均衡,但测试环境下没有F5 Big-IP负载均衡交换机可以用,于是先后试了weblogic的proxy ...

  7. nginx作反向代理,实现负载均衡

    nginx作反向代理,实现负载均衡按正常的方法安装好 ngixn,方法可参考http://www.cnblogs.com/lin3615/p/4376224.html其中作了反向代理的服务器的配置如下 ...

  8. LVS + keepalived + nginx + tomcat 实现主从热备 + 负载均衡

    前言 首先声明下,由于这两天找资料,看了不少博客 ,但是出于不细心,参考者的博客地址没有记录下来,所有文中要是出现了与大家博客相同的地方,那么请大家在评论区说明并附上博客地址,我好引用进来:这里表示抱 ...

  9. Nginx + Memcached 实现Session共享的负载均衡

    session共享 我们在做站点的试试,通常需要保存用户的一些基本信息,比如登录就会用到Session:当使用Nginx做负载均衡的时候,用户浏览站点的时候会被分配到不同的服务器上,此时如果登录后Se ...

  10. 使用nginx sticky实现基于cookie的负载均衡

    在多台后台服务器的环境下,我们为了确保一个客户只和一台服务器通信,我们势必使用长连接.使用什么方式来实现这种连接呢,常见的有使用nginx自带的ip_hash来做,我想这绝对不是一个好的办法,如果前端 ...

随机推荐

  1. 昂贵的聘礼(poj 1062)

    Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低 ...

  2. icon上添加数字提醒

    使用viewbadger包: package com.jingle.vierbagerstudy; import android.app.Activity; import android.os.Bun ...

  3. Android之SurfaceView

    SurfaceView也是继承了View,但是我们并不需要去实现它的draw方法来绘制自己,为什么呢? 因为它和View有一个很大的区别,View在UI线程去更新自己:而SurfaceView则在一个 ...

  4. 如何在postgresql中模拟oracle的dual表,来测试数据库最基本的连接功能?

    还好,网上弄到的,,没有dual的数据库,可以试图用select函数不带from数据表的方式来实现返回值. 一段测试代码: try: conn = psycopg2.connect(database= ...

  5. google地图引入网页

    <script src=);//指定坐标,缩放级别,setcenter 设置地图中心位置             //var mapControl = new GMapTypeControl() ...

  6. ThinkPHP的增、删、改、查

    一.创建操作 在ThinkPHP使用add方法新增数据到数据库. 使用方法如下: $User = M()->; $data[););')->delete();

  7. hdu 2795 线段树(纵向)

    注意h的范围和n的范围,纵向建立线段树 题意:h*w的木板,放进一些1*L的物品,求每次放空间能容纳且最上边的位子思路:每次找到最大值的位子,然后减去L线段树功能:query:区间求最大值的位子(直接 ...

  8. ava中Class.forName的作用浅谈

    转自:http://www.jb51.net/article/42648.htm Class.forName(xxx.xx.xx) 返回的是一个类 一.首先你要明白在java里面任何class都要装载 ...

  9. Android SQLite总结(一) (转)

    Android SQLite总结(一)  郑海波 2012-08-21 转载请声明:http://blog.csdn.net/nuptboyzhb/article/details/7891887 前言 ...

  10. matlab练习程序(图像马赛克)

    处理原理就是将邻域像素平均值赋给邻域中的所有像素. 这里将处理方法分为了带线条和不带线条,带线条处理后的视觉效果要好些. 原图: 处理结果(不带线条): 处理结果(带线条): 代码处理的是带线条的情况 ...