反向代理

反向代理(reverse proxy) 方式是指用代理服务器来接受Internet上的连接请求, 然后将
请求转发给内部网络中的上游服务器, 并将从上游服务器上得到的结果返回给Internet上请求
连接的客户端, 此时代理服务器对外的表现就是一个Web服务器。 充当反向代理服务器也是
Nginx的一种常见用法(反向代理服务器必须能够处理大量并发请求)

由于Nginx具有“强悍”的高并发高负载能力, 因此一般会作为前端的服务器直接向客户端提供静态文件服务。 但也有一些复杂、 多变的业务不适合放到Nginx服务器上, 这时会用Apache、 Tomcat等服务器来处理。 于是, Nginx通常会被配置为既是静态Web服务器也是反向代理服务器 , 不适合Nginx处理的请求就会直接转发到上游服务器中处理。


与其他反向代理服务器相比的不同点:
当客户端发来HTTP请求时, Nginx并不会立刻转发到上游服务器, 而是先把用户的请求(包括HTTP包体) 完整地接收到Nginx所在服务器的硬盘或者内存中, 然后再向上游服务器发起连接, 把缓存的客户端请求转发到上游服务器。 而Squid等代理服务器则采用一边接收客户端请求, 一边转发到上游服务器的方式。

缺点是延长了一个请求的处理时间,并增加了用于缓存请求内容的内存和磁盘空间。 而优点则是降低了上游服务器的负载, 尽量把压力放在Nginx服务器上。

Nginx的这种工作方式为什么会降低上游服务器的负载呢? 通常, 客户端与代理服务器之间的网络环境会比较复杂, 多半是“走”公网, 网速平均下来可能较慢, 因此, 一个请求可能要持续很久才能完成。 而代理服务器与上游服务器之间一般是“走”内网, 或者有专线连接, 传输速度较快。

Squid等反向代理服务器在与客户端建立连接且还没有开始接收HTTP包体时, 就已经向上游服务器建立了连接。 例如, 某个请求要上传一个1GB的文件, 那么每次Squid在收到一个TCP分包(如2KB) 时, 就会即时地向上游服务器转发。 在接收客户端完整HTTP包体的漫长过程中, 上游服务器始终要维持这个连接, 这直接对上游服务器的并发处理能力提出了挑战。

Nginx则不然, 它在接收到完整的客户端请求(如1GB的文件) 后, 才会与上游服务器建立连接转发请求, 由于是内网, 所以这个转发过程会执行得很快。 这样, 一个客户端请求占用上游服务器的连接时间就会非常短, 也就是说, Nginx的这种反向代理方案主要是为了降低上游服务器的并发压力。

负载均衡的基本配置

作为代理服务器, 一般都需要向上游服务器的集群转发请求。 这里的负载均衡是指选择一种策略, 尽量把请求平均地分布到每一台上游服务器上。使得每台服务器的资源得到合理应用。

nginx的负载均衡算法默认使用基于权重的轮询算法。

配置
upstream块

语法:upstream name {…}
默认:无
上下文:http

upstream块定义了一个上游服务器的集群, 便于反向代理中的proxy_pass使用。

例子:

upstream orderService{#可以配置域名,也可以配置域名加端口号,这里没有端口号就是默认80端口。server orderService1.example.com;server orderService2.example.com;server orderService3.example.com;
}
server

这里的server不是server块,而是一个配置项。

语法:server name [parameters]
上下文:upstream

server配置项指定了一台上游服务器的名字, 这个名字可以是域名、 IP地址端口、 UNIX
句柄等, 在其后还可以跟下列参数。

weight = number :配置向这台上游服务器进行请求转发的权重。默认为1,是为了使用轮询算法的负载均衡配置的,比如有三台上游服务器集群,权重分别为1、2、3,则如果6个请求,就会有1个请求转发到权重为1的服务器上,2个请求转发到权重为2的服务器上。3个请求转发到权重为3的服务器上。

max_fails=number :该选项与fail_timeout配合使用,指在fail_timeout时间内,如果向当前的上游服务器转发失败的次数超过number次,则认为在当前的fail_timeout时间段内这台上游服务器不可用。 max_fails默认为1, 如果设置为0, 则表示不检查失败次数。

fail_timeout=time: fail_timeout表示该时间段内转发失败多少次后就认为上游服务器暂时不可用, 用于优化反向代理功能。 它与向上游服务器建立连接的超时时间、 读取上游服务器的响应超时时间等完全无关。 fail_timeout默认为10秒。

down: 表示所在的上游服务器永久下线, 只在使用ip_hash配置项时才有用。

backup: 在使用ip_hash配置项时它是无效的。 它表示所在的上游服务器只是备份服务
器, 只有在所有的非备份上游服务器都失效后, 才会向所在的上游服务器转发请求。

ip_hash

语法:ip_hash;
默认:无
上下文:upstream

在有些场景下, 我们可能会希望来自某一个用户的请求始终落到固定的一台上游服务器中。 例如, 假设上游服务器会缓存一些信息, 如果同一个用户的请求任意地转发到集群中的任一台上游服务器中, 那么每一台上游服务器都有可能会缓存同一份信息, 这既会造成资源的浪费, 也会难以有效地管理缓存信息。 ip_hash就是用以解决上述问题的, 它首先根据客户端的IP地址计算出一个key, 将key按照upstream集群里的上游服务器数量进行取模, 然后以取模后的结果把请求转发到相应的上游服务器中。 这样就确保了同一个客户端的请求只会转发到指定的上游服务器中。比如没有使用分布式session,而是只在某台节点上保存了某个客户端的session,则使用ip_hash就可以确保每次访问都会到同一台节点上。

ip_hash与weight(权重) 配置不可同时使用。 如果upstream集群中有一台上游服务器暂时不可用, 不能直接删除该配置, 而是要down参数标识, 确保转发策略的一贯性。

upstream的一些变量
变量名 意义
$upstream_addr 处理请求的上游服务器地址,也就是转发到的上游服务器地址
$upstream_cache_status 表示是否命中缓存,取值范围MISS、EXPIRED、UPDATING、STALE、HIT
$upstream_status 上游服务器返回的HTTP响应状态码
$upstream_response_time 上游服务器的响应时间,进度到毫秒
$upstream_http_$HEADER HTTP的头部值,比如 upstream_http_token 表示 token头

可以在access_log的日志格式中加入这些变量。

反向代理的基本配置

介绍反向代理的基本配置项。

配置
proxy_path

语法:proxy_path URL
默认:无
上下文:location 、if

此配置项将当前请求反向代理到URL参数指定的服务器上, URL可以是主机名或IP地址加端口的形式。

例子:

proxy_pass http://localhost:8080/uri

还可以使用上面负载均衡配置的upstream

upstream orderService{....
}server{location / {proxy_pass http://orderService}
}

用户还可以把http转换为更加安全的https。

proxy_path https://192.168.18.125

默认请求下是不会转发HTTP的Host请求头的,也就是上游服务器默认是获取不到客户端的Host的值。如果需要转发,可以这样配置:

proxy_set_header Host $host;
proxy_method

语法:proxy_method method;
默认:无。
上下文:http、server、location

此配置表示转发时的协议方法名。

例子:

proxy_method POST;

上面配置,无论客户端无论以什么请求方法到nginx上,nginx都会以Post方法转发到上游服务器。

proxy_hide_header

语法:proxy_hide_header header
默认:无
上下文:http、server、location

Nginx会将上游服务器的响应转发给客户端, 但默认不会转发以下HTTP头部字段:
Date、 Server、 X-Pad和X-Accel-*。 使用proxy_hide_header后可以任意地指定哪些HTTP头部
字段不能被转发。 例如:

proxy_hide_header Cache-Control;
proxy_hide_header MicrosoftOfficeWebServer;

上面配置表示nginx转发上游服务器返回的响应给客户端时,不转发Cache-Control和MicrosoftOfficeWebServer头。

proxy_pass_header

语法:proxy_pass_header header
默认:无
上下文:http、server、location

与proxy_hide_header功能相反, proxy_pass_header会将原来禁止转发的header设置为允许
转发。

例子:

proxy_pass_header X-Accel-Redirect;
proxy_pass_request_body

语法:proxy_pass_request_body on|off
默认:proxy_pass_request_body on
上下文:http、server、location

作用为确定是否向上游服务器发送HTTP包体部分。

proxy_pass_request_headers

语法:proxy_pass_request_headers on|off
默认:proxy_pass_request_headers on
上下文:http、server、location

作用为确定是否向上游服务器转发HTTP请求头部。

Nginx核心模块ngx_http_proxy_module与nginx反向代理、负载均衡详解相关推荐

  1. Nginx反向代理负载均衡虚拟主机动静分离UrlRewrite防盗链

    文章目录 1. Nginx简介 1.1 Nginx背景 1.2 Nginx的优点 1.3 Nginx的功能特性及常用功能 2.Nginx安装 2.1 下载上传解压 1.2 安装 3.nginx核心概念 ...

  2. Nginx特性验证-反向代理/负载均衡/页面缓存/URL重定向

    原文发表于cu:2016-08-25 参考文档: Nginx 反向代理.负载均衡.页面缓存.URL重写等:http://freeloda.blog.51cto.com/2033581/1288553 ...

  3. 编译安装nginx并实现反向代理负载均衡和缓存功能

    一.编译安装nginx 1.下载 [root@ns1 ~]# wget http://nginx.org/download/nginx-1.10.0.tar.gz 2.解压 [root@ns1 ~]# ...

  4. Nginx反向代理 负载均衡sky

    Nginx服务部署 Nginx简介 Nginx (engine x) 是一个轻量级的.高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器.Nginx是由伊戈尔·赛索耶夫为俄罗 ...

  5. Nginx 反向代理 负载均衡 虚拟主机

    Nginx 反向代理 负载均衡 虚拟主机配置 通过本章你将学会利用Nginx配置多台虚拟主机,清楚代理服务器的作用,区分正向代理和反向代理的区别,搭建使用Nginx反向搭理和负载均衡,了解Nginx常 ...

  6. nginx 反向代理负载均衡 tomcat集群应用

    nginx 反向代理负载均衡 tomcat集群应用 环境介绍: 系统:centos5.8_64 192.168.0.201:nginx服务器 192.168.0.202:tomcat服务器 192.1 ...

  7. Nginx总结(安装,使用,正向代理,反向代理,负载均衡)

    目录 Nginx介绍与安装 一.Nginx简介 1.什么是ngnix 2.nginx应用场景 二.Nginx安装与启动 Nginx静态网站部署 一.静态⽹站的部署 二.配置虚拟主机 1.端⼝绑定 2. ...

  8. Nginx代理功能与负载均衡详解

    序言 Nginx的代理功能与负载均衡功能是最常被用到的,关于nginx的基本语法常识与配置已在上篇文章中有说明,这篇就开门见山,先描述一些关于代理功能的配置,再说明负载均衡详细. Nginx代理服务的 ...

  9. http反向代理之haproxy详解

    1.反向代理定义 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求 ...

最新文章

  1. linux rules.d文件
  2. 真给力!蚂蚁金服工程师总结的400道前端面试题提供下载
  3. boost::intrusive::set用法的测试程序
  4. IIS负载均衡-Application Request Route详解第五篇:使用ARR来配置试点项目
  5. 百旺智能编码_【百旺】票字版开票软件操作指南已为您备好,请查阅!
  6. org.xml.sax.SAXParseException; lineNumber: 11; columnNumber: 110; schema_reference.4: 无法读取方案文档
  7. beta分布的采样或抽样(java程序)
  8. 精灵说科技 java,Java动画动画(精灵)
  9. 获取客户端上次请求的URL
  10. Mysql备份策略-完成备份+增量备份shell
  11. 剑三 服务器维护,11月15日服务器例行维护公告 补偿部分服务器
  12. datatable高效写入mysql_如何将DataTable批量写入数据库
  13. MATLAB中定积分的求解
  14. Mysql数据库清空表中数据、删除表
  15. selenium滑块拖动验证(携程)
  16. 托福学习计划留学考研
  17. 微信新功能,最牛的不是“斗图”!
  18. vivado和modelsim联合仿真,提示giving up waiting on lock,error:verilog compiler exiting解决方法
  19. 今日头条内推码URQVEYM社招,校招,实习应有尽有
  20. 分享添加字幕最简单的方法 视频制作超简单

热门文章

  1. 无心剑《英语学习漫谈》
  2. 大数据学习笔记29:Hadoop压缩机制演示
  3. 安卓案例:演示广播接受者
  4. 14.图像透视——投影几何性质,平行线(Parallel Lines),消失点(Vanishing Point)_3
  5. 康乐php5.2_搭建PHP服务器调试环境套件下载-Easy2PHP5正式版下载[环境套件]-华军软件园...
  6. RELL软件测试初学者化妆品,浅析软件测试流程在高校软件测试工作室中的应用...
  7. mysql数据库 二十一练习题 及答案 (mysql练习题)
  8. android 获取是否连接wifi热点,android - 如何知道您是否已连接到Wifi热点/ Wifi / Wifi Direct - 堆栈内存溢出...
  9. php下xmlwriter,PHP实现基于XMLWriter操作xml的方法
  10. CPU高速缓存SRAM命中问题的总结与实验