Web服务之Nginx反向代理与负载均衡

一、代理

正向代理:

   正向代理是一个位于客户端和目标服务器之间的服务器,为了从目标服务器取得内容,客户端向代理发送一个请求并指定目标服务器,然后代理向目标服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。

作用:

  • 访问无法访问的服务器(翻墙,懂得)

  • 加速访问目标服务器(链路加速)

  • Cache缓存(访问加速)

  • 实现客户端访问授权

  • 隐藏访问者


反向代理:

反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。

作用:

  • 保护盒隐藏原始资源服务器

  • 实现负载均衡

  • 透明代理


二、Nginx反向代理

1.HTTP代理模块

 Nginx的HTTP代理模块为HTTP Proxy

http://www.howtocn.org/nginx:nginx%E6%A8%A1%E5%9D%97%E5%8F%82%E8%80%83%E6%89%8B%E5%86%8C%E4%B8%AD%E6%96%87%E7%89%88:standardhttpmodules:httpproxy#proxy_pass

   这个模块可以转发请求到其他的服务器。
   HTTP/1.0无法使用keepalive(后端服务器将为每个请求创建并且删除连接)。nginx为浏览器发送HTTP/1.1并为后端服务器发送HTTP/1.0,这样浏览器就可以为浏览器处理keepalive。

   注意当使用http proxy模块(甚至FastCGI),所有的连接请求在发送到后端服务器之前nginx将缓存它们,因此,在测量从后端传送的数据时,它的进度显示可能不正确。

   代理模块功能很强大,指令很多。

   这里只关注 proxy_pass 和 proxy_set_header

location / {
  proxy_pass        http://localhost:8000;
                #使用字段:location, location中的if字段
  proxy_set_header  X-Real-IP  $remote_addr;
                #代理服务器发代理给后端服务器的请求,默认不包含客户端主机ip
                #指令允许将发送到被目标服务器的请求头重新定义或者增加一些字段,这里定义的为添加客户机ip
}
#注:后端的httpd服务器配置文件只的日志文件定义修改才能显示客户端ip于日志文件中
#修改:LogFormat "%h %l %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
#为:LogFormat "%{X-Real-IP}i %l %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined


2.负载均衡

   负载均衡也是反向代理实现的,只是代理的的目标服务器为一组。然后通过负载均衡调度算法,根据不同的业务需求处理请求。

   Nginx通过 Upstream 模块实现负载均衡,定义目标服务器组、设置调度算法。

upstream backend {
  round-robin;
        #调度算法
  server   backend1.example.com weight=5;
        #设置服务器权重,默认为1(无法和ip_hash指令搭配使用)
  server   backend2.example.com :8080;
        #自定义端口
  server   backend3.example.com  down;
        #down - 标记服务器处于离线状态,通常和ip_hash一起使用。
        #backup - (0.6.7或更高)如果所有的非备份服务器都宕机或繁忙,则使用本服务器(无法和ip_hash指令搭配使用)。
  server   backend4.example.com  max_fails=3  fail_timeout=30s;
        #max_fails - 在一定时间内(fail_timeout定义)检查服务器最大失败请求数,默认为1,将其设置为0可以关闭检查
        #fail_timeout - max_fails次失败后,暂停服务的时间,默认为10s
  server   unix:/tmp/backend5;
        #可同时监听Unix socket的服务器。
}
server {
  location / {
    proxy_pass  http://backend;
        #反向代理
  }
}


#调度算法
1.round-robin 轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响。Weight 指定轮询权值,Weight值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下。
2.ip_hash :每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题。
3.fair :比上面两个更加智能的负载均衡算法。此算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块。
4.url_hash :此方法按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身是不支持url_hash的,如果需要使用这种调度算法,必须安装Nginx 的hash软件包。



本文出自 “潇洒哥是先知” 博客,请务必保留此出处http://hoolee.blog.51cto.com/7934938/1413522

Web服务之Nginx反向代理与负载均衡,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。