所以根据haproxy作者,谁知道关于http的一两件事:
发明了Keep-alive是为了在CPU速度慢100倍时降低服务器上的CPU使用率.但是没有说的是,持久连接消耗大量内存,而除了打开它们的客户端之外,任何人都无法使用.今天在2009年,CPU非常便宜,根据架构或价格,内存仍然限制在几千兆字节.如果一个站点需要保持活着,那么就存在一个真正的问题.高负载站点通常会禁用keep-alive以支持最大数量的并发客户端.没有保持活动的真正缺点是获取对象的延迟略有增加.浏览器将非keepalive站点上的并发连接数加倍,以弥补这一点.
这符合其他人的经验吗?即没有保持活力 - 结果现在几乎不值得注意?(它可能值得注意的是,使用websockets等 - 无论如何,无论保持活动状态如何,连接都保持"开放" - 对于响应速度非常快的应用程序).对于远离服务器的人来说效果是否更大 - 或者在加载页面时是否有许多工件要从同一主机加载?(我认为像CSS,图像和JS这样的东西越来越多地来自缓存友好的CDN).
思考?
(不确定这是否是serverfault.com的事情,但我不会发帖,直到有人告诉我把它移到那里).
我正在使用HAProxy进行负载平衡,只希望我的网站支持https.因此,我想将端口80上的所有请求重定向到端口443.
我该怎么做?
编辑:我们想在https上重定向到相同的网址,保留查询参数.因此,http://foo.com/bar将重定向到https://foo.com/bar
我对我的haproxy配置有疑问:
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
log 127.0.0.1 syslog emerg
maxconn 4000
quiet
user haproxy
group haproxy
daemon
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
mode http
log global
option abortonclose
option dontlognull
option httpclose
option httplog
option forwardfor
option redispatch
timeout connect 10000 # default 10 second time out if a backend is not found
timeout client 300000 # 5 min timeout for …Run Code Online (Sandbox Code Playgroud) 当使用SSL连接到HAProxy服务器时,我会出现随机出现的连接失败.我已经确认这些故障发生在JDK版本1.7.0_21和1.7.0_25上,但不是1.7.0_04或1.6.0_38.
例外是
Exception in thread "main" javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
at sun.security.ssl.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:397)
at SSLTest2.main(SSLTest2.java:52)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Run Code Online (Sandbox Code Playgroud)
这些故障仅在使用TLS SSL上下文而非默认上下文时发生.以下代码在循环中运行了一千次,并且在循环完成之前发生了故障(大约2%的连接失败):
SSLContext sslcontext = SSLContext.getInstance("TLS");
sslcontext.init(null, null, null);
SSLSocketFactory factory = sslcontext.getSocketFactory();
SSLSocket socket = (SSLSocket)factory.createSocket("myserver", 443);
//socket.startHandshake();
SSLSession session = socket.getSession();
session.getPeerCertificates();
socket.close();
Run Code Online (Sandbox Code Playgroud)
但是,如果我以这种方式创建SSL上下文,我在上面提到的任何Java版本上都没有连接失败:
SSLSocketFactory factory = (SSLSocketFactory)SSLSocketFactory.getDefault();
Run Code Online (Sandbox Code Playgroud)
第一种方式使用SSLContextImpl$TLS10Context和后来使用SSLContextImpl$DefaultSSLContext.查看代码,我没有看到任何会导致异常发生的差异.
为什么我会得到失败以及使用getDefault()呼叫的优点/缺点是什么?
注意:首先使用Apache HttpClient(版本4)看到了异常.此代码是再现HttpClient所遇问题的最小子集.
这是我在添加时看到的错误-Djavax.net.debug=ssl:
main, READ: TLSv1 Alert, length = 2
main, RECV TLSv1 ALERT: fatal, …Run Code Online (Sandbox Code Playgroud) 我们已经在亚马逊EC2上与HAProxy争夺了几天; 到目前为止,这种体验一直很好,但我们仍然在努力从软件负载均衡器中挤出更多性能.我们并不完全是Linux网络高手(我们通常是.NET商店),但我们到目前为止仍然拥有自己的,试图设置适当的ulimits,检查内核消息和tcpdumps是否存在任何异常情况.到目前为止,我们达到了大约1,700个请求/秒的平台,此时客户端超时比比皆是(我们一直在使用和调整httperf以此目的).一位同事和我正在收听最新的Stack Overflow播客,其中Reddit创始人注意到他们的整个站点都运行在一个HAProxy节点上,并且到目前为止它还没有成为瓶颈.确认!要么以某种方式没有看到许多并发请求,我们正在做一些可怕的错误,或者EC2的共享性质限制了Ec2实例的网络堆栈(我们使用的是大型实例类型).考虑到Joel和Reddit创始人都认为网络可能是限制因素这一事实,我们看到的限制是否可能?
任何想法都非常感谢!
编辑事实上,实际问题看起来并不是负载均衡器节点!罪魁祸首实际上是运行httperf的节点,在这个例子中.由于httperf为每个请求构建并断开套接字,因此它在内核中花费了大量的CPU时间.当我们提高请求率时,TCP FIN TTL(默认为60秒)会使套接字保持太长时间,并且ip_local_port_range的默认值对于此使用方案来说太低了.基本上,在客户端(httperf)节点持续创建和销毁新套接字几分钟后,未使用的端口数量用尽,后续"请求"在此阶段出错,产生的请求数/秒数较少且数量较多错误.
我们也看过nginx,但我们一直在使用RighScale,他们已经有了HAProxy的插件脚本.哦,当然,除非证明是绝对必要的,否则我们的截止日期太紧了[当然].幸运的是,在AWS上允许我们并行测试使用nginx的另一个设置(如果有保证),并在稍后进行切换.
此页面相当好地描述了每个sysctl变量(在这种情况下调整了ip_local_port_range和tcp_fin_timeout).
我可以想象两个设置:
负载平衡然后缓存
+-- Cache server #1 (varnish) -- App server #1
/
Load Balancer (haproxy)-+---- Cache server #2 (varnish) -- App server #2
\
+-- Cache server #3 (varnish) -- App server #3
Run Code Online (Sandbox Code Playgroud)
缓存然后负载平衡
+-- App server #1
/
Cache Server (varnish) --- Load Balancer (haproxy) --+---- App server #2
\
+-- App server #3
Run Code Online (Sandbox Code Playgroud)
第一个设置的问题是有多个缓存,这会浪费大量内存并使缓存更加复杂.
第二个设置的问题是可能会出现性能损失和两个单点故障(varnish和haproxy)而不是一个(haproxy)?
我很想接受第二种设置,因为haproxy和varnish都应该快速而稳定:您的意见是什么?
我正在使用HAProxy将子域上的请求发送到node.js应用程序.
我无法让WebSockets工作.到目前为止,我只能让客户端建立WebSocket连接,但之后很快就会出现断开连接.
我在ubuntu上.我一直在使用的各种版本socket.io和node-websocket-server.客户端是Safari或Chrome的最新版本.HAProxy版本是1.4.8
这是我的HAProxy.cfg
global
maxconn 4096
pidfile /var/run/haproxy.pid
daemon
defaults
mode http
maxconn 2000
option http-server-close
option http-pretend-keepalive
contimeout 5000
clitimeout 50000
srvtimeout 50000
frontend HTTP_PROXY
bind *:80
timeout client 86400000
#default server
default_backend NGINX_SERVERS
#node server
acl host_node_sockettest hdr_beg(host) -i mysubdomain.mydomain
use_backend NODE_SOCKETTEST_SERVERS if host_node_sockettest
backend NGINX_SERVERS
server THIS_NGINX_SERVER 127.0.0.1:8081
backend NODE_SOCKETTEST_SERVERS
timeout queue 5000
timeout server 86400000
server THIS_NODE_SERVER localhost:8180 maxconn 200 check
Run Code Online (Sandbox Code Playgroud)
我已经浏览了网络和邮件列表但无法获得任何建议的解决方案.
(ps这可能是针对serverfault,但是还有其他的HAProxy问题,所以我选择在这里发帖)
有没有办法在重新启动HaProxy服务之前验证HaProxy haproxy.cfg文件?例如:较大的haproxy.cfg文件中可能存在小的拼写/语法错误.我搜索了几个论坛,但无法找到与验证haproxy.cfg文件有关语法错误的任何内容.
截至目前,我在将更改上载到Production Server之前,在开发人员计算机上使用了试错法.
提前致谢..
我是HAProxy的新手,我有一个关于HAProxy配置的问题,这有助于我在采取正确方法时做出关键决定.这将极大地帮助我决定架构.
我有3个应用程序.比方说app1,app2,app3.
每个应用程序由URL区分如下:
www.example.com/app1/123 -> app1
www.example.com/app2/123 -> app2
www.example.com/app3/123 -> app3
Run Code Online (Sandbox Code Playgroud)
我打算在2个不同的地区拥有每个应用的2个实例:
Region 1 - app1, app2, app3
Region 2 - app1, app2, app3
Run Code Online (Sandbox Code Playgroud)
我看到2种方法来配置这个,但我不确定这是最好的做法:
方法1:让HAProxy1首先使用url模式区分请求.来自HAProxy1的请求将被路由到另一个HAProxy服务器,以设置单个应用程序(在本例中为3个HAProxy服务器),以实现负载平衡.
方法2:有一个很好的HAProxy服务器,它按方法1中的说明执行这两个操作.也就是说,具有根据url隔离请求的配置,然后通过单独的过滤器传递每个请求,就像为每个应用程序设置的内容一样,以实现负载平衡.
我不确定haproxy是否支持方法2.任何想法或建议非常感谢.请稍微说清楚.
Tomcat 8.5,这将是默认的Spring Boot 1.4,(将在明天发布)支持http2.
如何http2在Spring Boot应用程序中启用?
haproxy ×10
http ×2
java ×2
ssl ×2
amazon-ec2 ×1
architecture ×1
http2 ×1
https ×1
keep-alive ×1
node.js ×1
redirect ×1
routing ×1
scaling ×1
spring-boot ×1
tomcat ×1
varnish ×1
webserver ×1
websocket ×1