- 浏览: 488513 次
- 性别:
- 来自: 济南
文章分类
最新评论
-
effort0829:
更重要的是可以通过 URL打开特定的资源,然而再windows ...
【转载】自定义URL Protocol 协议 -
追梦人zxy:
mark。我记得cglib代理的话就用set注入
通过CGLIB实现AOP的浅析(顺便简单对比了一下JDK的动态代理) -
zacry:
这个问题最近也困扰了我很久,我是从一个老项目里迁移代码时遇到的 ...
通过CGLIB实现AOP的浅析(顺便简单对比了一下JDK的动态代理) -
bo_hai:
netfork 写道哎,大家都回家过中秋节了,自己的问题,自己 ...
Struts 2中验证失败后,radio回复到默认值的问题 -
greatghoul:
看不出有什么严重的,加上 <%- %> 不就可以了 ...
不要在erb中加注释,后果很严重
原文地址:http://salogs.com/2010/05/nginx-http%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86%E7%9A%84%E7%9B%B8%E5%85%B3%E5%8F%82%E6%95%B0%E6%B5%8B%E8%AF%95/
关于ChsHttpProxyModule的说明:
http://wiki.nginx.org/NginxChsHttpProxyModule#proxy_connect_timeout
测试目的
(1)弄清楚HTTP Upstream 模块中Server指令的max_fails 与fail_timeout 参数的关系、它们对后端服务器健康情况的检查起到了什么作用、它们的取值对Http proxy模块中的其它指令是否有直接或间接的影响等……
(2)测试HTTP Proxy模块中proxy_next_upstream、proxy_connect_timeout、proxy_read_timeout、 proxy_send_timeout指令的作用、对nginx性能的影响、对后端服务器响应的处理等……
测试方法
本文测试不会使用压力测试,所有的测试都是通过浏览器手动刷新来实现的。后端服务器使用简单的php程序来实现。
测试环境
Nginx
负载均衡/
反向代理服务器
系统:CentOS 5.4 64bit
Nginx:0.7.65
IP:192.168.108.10
后端web
服务器
系统:CentOS 5.4 64bit
Web环境:apache+php
Web-1 IP:192.168.108.163
Web-2 IP:192.168.108.164
本次测试主要针对HTTP Upstream和HTTP Proxy模块进行,下面测试环境中http upstream 和http proxy模块参数的初始化设置,后文会针对测试的参数进行相应的修改:
upstream test {
server 192.168.108.163 ;
server 192.168.108.164:80 ;
}
server {
listen 80 ;
server_name .test.com;
index index.php index.html index.htm;
location / {
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_404;
proxy_connect_timeout 10s;
proxy_read_timeout 2s;
#proxy_send_timeout 10s;
proxy_pass http:// test ;
}
}
…
提出server指令后面的参数部分,以下摘抄nginx wiki 内容
语法:server name [parameters ]
parameters 包含:
·weight = NUMBER - 设置服务器权重,默认为1。
·max_fails = NUMBER - 在一定时间内(这个时间在fail_timeout参数中设置)检查这个服务器是否可用时产生的最多失败请求数,默认为1,将其设置为0可以关闭检查,这 些错误在proxy_next_upstream或fastcgi_next_upstream(404错误不会使max_fails增加)中定义。
·fail_timeout = TIME - 在这个时间内产生了max_fails所设置大小的失败尝试连接请求后这个服务器可能不可用,同样它指定了服务器不可用的时间(在下一次尝试连接请求发起 之前),默认为10秒,fail_timeout与前端响应时间没有直接关系,不过可以使用proxy_connect_timeout和 proxy_read_timeout来控制。
·down - 标记服务器处于离线状态,通常和ip_hash一起使用。
·backup - (0.6.7或更高)只用于本服务器,如果所有的非备份服务器都宕机或繁忙。
关于 max_fails参数的理解 : 根据上面的解释,max_fails 默认为1 ,fail_timeout 默认为10 秒,也就是说,默认情况下后端服务器在10 秒钟之内可以容许有一次的失败,如果超过1 次则视为该服务器有问题,将该服务器标记为不可用。等待10 秒后再将请求发给该服务器,以此类推进行后端服务器的健康检查。但如果我将max_fails 设置为0 ,则代表不对后端服务器进行健康检查,这样一来fail_timeout 参数也就没什么意义了。那若后端服务器真的出现问题怎么办呢?上文也说了,可以借助proxy_connect_timeout 和proxy_read_timeout 进行控制。
下面介绍http proxy模块中的相关指令:
proxy_next_upstream
语法: proxy_next_upstream [error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off]
确定在何种情况下请求将转发到下一个服务器。转发请求只发生在没有数据传递到客户端的过程中。
proxy_connect_timeout
后端服务器连接的超时时间_发起握手等候响应超时时间
proxy_read_timeout
连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理(也可以说是后端服务器处理请求的时间)
proxy_send_timeout
后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据
proxy_pass
这个指令设置被代理服务器的地址和被映射的URI
开始测试
情况 1 :后端程序执行时间超过或等于 proxy_read_timeout 设置值, max_fails=0 关闭后端服务器健康检查。
Nginx配置修改内容 | server 192.168.108.163 max_fails = 0; server 192.168.108.164 max_fails = 0; proxy_next_upstream error timeout proxy_read_timeout 2s |
后端web服务器 | |
Web1 test.php | Web2 test.php |
<?php header('RS:Web1'); $t = 2 ; sleep($t); echo "sleep {$t}s<br>"; echo "web-1<br>"; ?> |
<?php header('RS:Web2'); $t = 5 ; sleep($t); echo "sleep {$t}s<br>"; echo "web-2<br>"; ?> |
备注:
我这里的两台后端web服务器,他们的主页文件均为一个test.php程序,该程序分别sleep了2秒和5秒,等于和超过了 proxy_read_timeout的时间,[max_fails=0] 即关闭后端服务器健康检查。[proxy_next_upstream error timeout] 说明碰到错误或超时的情况切到下一个后端服务器。如此设置后利用curl命令对nginx发起连接请求,看nginx会作何反应。 |
|
测试开始:
(1)curl -I -w %{time_total}:%{time_connect}:%{time_starttransfer} www.test.com/test.php
4.008:0.002:4.007 说明: 连续请求3次后得到的http返回结果是一样的,均为504 Gateway Time-out 错误。这种情况只有在后端服务器都有问题的时才会出现这个错误,很显然我这里的proxy_read_timeout设置的时间太短,后端程序还没来得及 把程序执行完,nginx就迫不及待的将请求甩给upstream定义的另一台服务器上了,当发现另外一台服务器同样2秒没有返回后,nginx这回没有 服务器可用,只有返回504 Gateway Time-out 。这也是为什么最后的time_total时间是4秒。(经查看两台web服务器的访问日志得知,均有一条访问记录,且返回代码为200,说明nginx 确实来过,但没有等到执行完成就匆匆的离去了)如果我有3台服务器,在保证任何不变的情况下,time_total时间一定会是6秒,因为nginx会一 个接一个的将3台服务器都走一遍。 ----------------------------------------------------------------------------------------------------------------------- 好了,确认是我proxy_read_timeout设置时间太短后,我将它的值设置为3秒,再通过curl命令访问: (2)curl -I -w %{time_total}:%{time_connect}:%{time_starttransfer} www.test.com/test.php 5.042:0.005:5.042 说明:通过3次连续请求,得到的结果是一样的,RS:Web1 也就是说我这三次的请求都甩到了web1上。但我web1中的程序只需要2秒后就可以返回结果,但为什么我通过nginx代理后时间总是我的 程序执行时间+proxy_read_timeout时间呢? ----------------------------------------------------------------------------------------------------------------------- 继续将proxy_read_timeout设置为4s (3)curl -I -w %{time_total}:%{time_connect}:%{time_starttransfer} www.test.com/test.php 6.004:0.000:6.004 三次请求后结果也是一样,这次花的时间更长了,但确实是程序执行时间+proxy_read_timeout 时 间。但为什么每次都需要6秒呢?按照upstream中定义的权重应该是平分请求的,最起码应该有2秒的时候。经过分析得知:最终返回给用户请求的是 web1,那么当再次请求的时候一定会分给web2,由于web2是sleep 5秒的,因此经过proxy_read_timeout的时间(4s)后会跳到web1,结果还是web1返回的请求,所花时间就是nginx在web2 等待的时间+web1执行的时间,以此类推下一次nginx自然的还会分给web2……。如果有更多的后端web,则判断下一个请求服务器可以看当前返回 给最终用户的是那台服务器,然后根据upstream中定义的顺序向下查询(权重一样的情况) |
|
结论:
(1)上面的三次测试分别将proxy_read_timeout的值设置为2s、3s、4s的情况进行的。最终的测试结果也都在后面做了解释与说 明。由于我关闭了后端服务器的健康检查(max_fails=0)因此判断后端服务器情况的唯一依据便是proxy_read_timeout参数,如果 这个参数设置得过小,但后端程序的执行或多或少会超过这个时间的话,这种情况nginx的效率是非常低的。 (2)上面的测试都是后端服务器正常但执行超时的情况下nginx根据proxy_read_timeout和 proxy_next_upstream的值来选择下一个服务器,那如果我后端服务器直接报错的情况呢?可以想到如果报错信息在 proxy_next_upstream 中有定义的话nginx还会跳到下一台服务器。否则直接将保存信息返回给nginx从而最终呈献给用户 |
情况2:打开后端服务器健康检查,测试程序执行时间超过或等于proxy_read_timeout值或后端服务器直接报错的情况
Nginx配置修改内容 | server 192.168.108.163 max_fails = 1
; server 192.168.108.164 max_fails = 1 ; proxy_next_upstream error timeout http_500 http_502 http_504 proxy_read_timeout 2s |
后端web服务器 | |
Web1 test.php | Web2 test.php |
<?php header('RS:Web1'); $t = 2 ; sleep($t); echo "sleep {$t}s<br>"; echo "web-1<br>"; ?> |
<?php header('RS:Web2'); header('http/1.1 500 Internal Server Error '); #$t = 5 ; #sleep($t); echo "sleep {$t}s<br>"; echo "web-2<br>"; ?> |
备注:
开启了后端服务器健康检查 |
|
测试开始:
(1 )连续测试三次结果如下: curl -I -w %{time_total}:%{time_connect}:%{time_starttransfer} www.test.com/test.php 2.005:0.001:2.005 curl -I -w %{time_total}:%{time_connect}:%{time_starttransfer} www.test.com/test.php 0.001:0.001:0.001 curl -I -w %{time_total}:%{time_connect}:%{time_starttransfer} www.test.com/test.php 2.005:0.001:2.005 说明: 第1次请求所用时间是2秒,web1执行超时,web2返回了500错误,upstream没有更多的后端,因此nginx直接把504扔出来了,同时标记web2,web1不可用。查看后端2台web服务器的访问日志,均有nginx代理的访问记录。 (2)修改 proxy_read_timeout 3s
连续访问6次后结果以及2台web服务器的日志情况 2.003:0.001:2.002 访问日志 Web1
Web2 [18/May/2010:15:30:00 说明: 由访问日志可知: |
|
结论:
(1
)
proxy_next_upstream参数很有用,他可以避免很多错误 |
发表评论
-
CentOS 6.0下vncserver安装配置
2012-09-24 23:04 1967原创作品,允许转载,转载时请务必以 ... -
试用了一下windows下的nginx-0.8.52
2010-09-29 22:27 1513在windows 2003 server 32bit下,ngi ... -
试用一下Evolution,不错
2010-05-30 18:51 1290装了个Ubuntu 10,用了一下自带的邮件客户端Evolut ... -
玩了一会ubuntu10
2010-05-29 21:14 1104今后主要就用这个了。。。 -
【转载】监视Tomcat宕机并重启Tomcat
2010-02-24 00:12 3844下面的代码从网上找的,稍加了点注释。 /** * 监 ... -
几个Web服务器
2010-01-23 18:01 1056Windows平台下 Apache的proxy_mod下,千万 ... -
Downloads - LightTPD for Windows
2010-01-23 01:14 1035http://en.wlmp-project.net/down ... -
让进程在Linux后台运行
2009-10-21 01:19 1231在Linux中,如果要让进程在后台运行,一般情况下,我们在命令 ... -
Mercurial资料收集
2009-10-12 21:09 12291、下载 http://mercurial.berkwood. ... -
spawn-fcgi换位置了
2009-10-12 16:51 1271http://www.lighttpd.net/2009/2/ ... -
WARNING: unknown config-key: url.redirect (ignored)
2009-09-23 23:03 2538If you see this error 引用WARNING ... -
qmail安装配置完毕
2009-09-22 17:14 1468顺着以下的教程终于把qmail安装配置完毕。 http://w ... -
SLES安装后,sda与sdb乱套的话
2009-09-19 16:23 2475在使用usb软驱或usb模拟软件安装raid1时,如果是自定义 ... -
SuSE Linux Enterprise Server 11 最重要的两个盘
2009-09-19 16:09 4697注:我装的是基于x86的64位系统。 1、SLES-11-D ... -
S5000VSA/SATA/RAID1/SuSE U盘安装RAID驱动
2009-09-18 14:42 10031!!!千万注意:如果你有幸读到这篇文章,中间如果有任何问题或危 ... -
SUSE 防火墙设置之端口开放篇
2009-07-27 14:43 4845SUSE默认的防火墙设置为禁止所有外来联结。如果你想开放某个端 ... -
SUSE Linux Desktop Gnome桌面快捷键整理
2009-07-27 14:35 1385整理了一些常用的SuSE Linux Gnome桌面快捷键,希 ... -
no such file to load -- openssl (RuntimeError)终极解决
2009-07-25 17:08 10343从昨天起,试着安装SUSE ... -
[cvsnt] Re: cvs [server aborted]: cannot rename file......Permission denied"
2009-07-22 20:09 2126http://www.cvsnt.org/pipermail/ ... -
在Windows Server 2003中启用Windows XP的桌面主题
2009-06-30 21:11 2529打开“开始→运行”,键入“Services.msc ”,选 ...
相关推荐
Nginx的负载均衡和反向代理Nginx的负载均衡和反向代理Nginx的负载均衡和反向代理Nginx的负载均衡和反向代理Nginx的负载均衡和反向代理
第6章_Nginx_HTTP负载均衡和反向代理的配置与优化
在Win7 64位系统上安装Nginx,可以利用其强大的负载均衡和反向代理功能,优化网站性能并提升可用性。** ### 一、Nginx的安装 1. **下载Nginx安装包**:首先,你需要从Nginx官方网站获取适用于Windows 64位系统的...
nginx 负载均衡 反向代理 nginx 负载均衡 反向代理 nginx 负载均衡 反向代理
nginx的负载均衡和反向代理的demo,springboot版本,访问ip即可在页面展示服务器的ip和端口。
### Nginx配置负载均衡与反向代理知识点详解 #### 一、理解负载均衡与反向代理 在深入了解本文档中的具体配置之前,我们首先来了解一下负载均衡与反向代理的基本概念。 **负载均衡**是一种分布式系统设计的技术,...
Nginx实现负载均衡 web均衡负载 webservice负载均衡 Nginx实现负载均衡配制全说明 为了多台后台的web、webservice服务能均衡负载,可以使用nginx进行处理 1)配置文件全配制ok 2)有两个完整的web服务做例子,可以...
在本文中,我们将深入探讨Nginx的负载均衡和反向代理功能。 1. **Nginx反向代理** 反向代理是指Nginx作为前端服务器,接收来自客户端的HTTP请求,然后将这些请求转发给后端的Web服务器处理。反向代理的主要作用是...
在Nginx配置文件中,`http`、`server`和`location`块可以设置负载均衡和反向代理的相关参数。例如,创建一个反向代理配置: ```nginx http { upstream backend { server backend1.example.com weight=3; server ...
基于lua的nginx自定义负载均衡基于lua的nginx自定义负载均衡
然后,在服务器块中定义了负载均衡规则,将所有请求代理到`http://backend`。 #### 四、Nginx基本操作 1. **启动Nginx** - 使用以下命令启动Nginx。 ```bash /usr/local/nginx/sbin/nginx ``` 2. **停止Nginx...
3.找到D:\nginx\conf下nginx.conf文件用记事本打开 在文段末尾大括号前加上 include proxy.conf;(就是加载刚刚新建的那个文件(注意路径)) 4.进入cmd 进入D盘: d: 进到nginx文件夹下:cd nginx 启动nginx.exe:...
nginx 四层代理测试 及SLB负载均衡功能配置测试 本文档旨在介绍nginx 四层代理测试 及SLB负载均衡功能配置测试的详细结果和结论。通过对nginx 四层代理和SLB负载均衡功能的测试,我们可以了解到其在实际应用中的优...
【nginx入门】nginx反向代理与负载均衡教程
Nginx 负载均衡和反向代理配置和优化 DNS 轮询方式: 介绍: DNS 轮询是指一个域名可以绑定到多个的 ip 服务器上, 用户在访问的时候 dns轮询访问这几个 ip 的服务器, 达到负载均衡的目的. 可以使用 linux 命令 dig ...
**Nginx 搭建与使用** ...总结来说,Nginx 提供了强大的反向代理和负载均衡能力,能够有效地构建高效、稳定且可扩展的 Web 应用架构。结合适当的高可用策略,Nginx 可以成为企业级服务的关键组件,确保服务的稳定运行。
Nginx 1.8 是一个高性能的 HTTP 和反向代理服务器,广泛应用于网站的负载均衡配置中。负载均衡是网络服务中的一个重要概念,它的主要目的是通过分散网络流量,提高系统的响应速度和可用性,避免单个服务器过载。在 ...
1.1 Nginx不仅是一个出色的web软件,其七层代理和负载均衡也是相当出色。Nginx做前端代理,当用户请求服务时,可以根据url进行判断,然后分配到不同的后台webserver上。 1.2 Nginx的负载均衡实现原理:首先在http...