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. Android之Tab类总结

    本文主要包括以下Tab类实现方式 FragmentTabHost+Fragment实现 传统的ViewPager实现 FragmentManager+Fragment实现 ViewPager+Frag ...

  2. struts2 标签问题----日期显示

    对于要显示按照自己的意愿进行显示的话: <s:date name="date" format="yyyy-MM-dd HH:mm:ss.SSS" /> ...

  3. php 抽象类、接口和构析方法

    <?php /*class Ren { public static $color; static function Show() { Car::$name; self::$color; } } ...

  4. C#(去、过滤)掉字符中的换行符

    本文介绍的方法需要先导入命名空间:usingSystem.Text.RegularExpressions; 字符串里所有的的换行符都去掉:textStr = Regex.Replace(textStr ...

  5. poj 1088 dp **

    链接:点我 记忆化搜索很好写 #include<cstdio> #include<iostream> #include<algorithm> #include< ...

  6. 错误解决error while loading shared libraries: libXXX.so.X: cannot open shared object file: No such file

    转自:http://blog.csdn.net/david_xtd/article/details/7625626 前提:ubuntu-debug机器上向SVN提交了pdu-IVT,想在别的普通机器上 ...

  7. CC2540开发板学习笔记(八)—— 看门狗

    一.功能: 防止程序跑飞,使得系统重新进入工作状态,即一种复位操作吧. 但需要不停地喂狗= =(就是不断的执行某种操作),假如说你的程序跑到了不知道哪里去的错误时,即不会实现喂狗,就会发生复位,程序就 ...

  8. Jquery用途

    封装JS,开源,操作方便,提高开发效率. 轻量级,选择器强大,浏览器兼容.

  9. Redis String命令

        命令 解释 APPEND key value 如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾. 如果 key 不存在, APPEND ...

  10. POJ2396 Budget(有源汇流量有上下界网络的可行流)

    题目大概给一个有n×m个单元的矩阵,各单元是一个非负整数,已知其每行每列所有单元的和,还有几个约束条件描述一些单元是大于小于还是等于某个数,问矩阵可以是怎样的. 经典的流量有上下界网络流问题. 把行. ...