我有几个socket.io实例,在HAProxy下运行身份验证,我需要强制认证请求和套接字连接转到同一个实例.我已根据对SO问题的答案设置了HAProxy,并进行了一些修改,如下所示:
global
maxconn 4096 # Total Max Connections. This is dependent on ulimit
nbproc 2
defaults
mode http
frontend all 0.0.0.0:80
timeout client 86400000
default_backend www_backend
acl is_websocket hdr(Upgrade) -i WebSocket
acl is_websocket hdr_beg(Host) -i ws
use_backend socket_backend if is_websocket
backend www_backend
balance url_param sessionId
option forwardfor # This sets X-Forwarded-For
timeout server 30000
timeout connect 4000
server server1 localhost:8081 weight 1 maxconn 1024 check
server server2 localhost:8082 weight 1 maxconn 1024 check
server server3 localhost:8083 …Run Code Online (Sandbox Code Playgroud) nginx 是一个杀手级静态文件服务器.
它可以服务node.js,如在这个例子中,但是以有限的方式.
但nginx是显然无法给代理websockets.
我发现可能有用的唯一方法就是按照本文使用HAProxy前端- 但它是从2011年10月6日开始的.
这必须是一个常见问题,但我找不到一个非常常见的解决方案.
(有关完整的解决方案和详细信息,请参阅https://github.com/bangkok-maco/barebone-node)
ip测试架构:
global
maxconn 4096
nbproc 2
daemon
# user nobody
log 127.0.0.1 local1 notice
defaults
mode http
# listen on 127.0.0.12:80
frontend app
bind 127.0.0.12:80
mode tcp
timeout client 86400000
default_backend www_backend
acl is_chat hdr_dom(Host) chat …Run Code Online (Sandbox Code Playgroud) 我有Ubuntu 12.04LTS在运行.我的网络服务器是Tomcat 7.0.42,我使用HAProxy作为代理服务器.我的应用程序是一个使用websockets的servlet应用程序.
有时当我请求我的页面时,我会在某些资源上出现"502 Bad Gateway"错误,而不是一些资源.我认为这与我的HAProxy配置有关,如下所示:
global
maxconn 4096 # Total Max Connections. This is dependent on ulimit
nbproc 1
defaults
mode http
option http-server-close
option httpclose
# option redispatch
no option checkcache # test against 502 error
frontend all 0.0.0.0:80
timeout client 86400000
default_backend www_backend
acl is_websocket hdr(Upgrade) -i WebSocket
acl is_websocket hdr_beg(Host) -i ws
use_backend socket_backend if is_websocket
backend www_backend
balance roundrobin
option forwardfor # This sets X-Forwarded-For
timeout server 30000
timeout connect 4000
server apiserver localhost:8080 weight …Run Code Online (Sandbox Code Playgroud) 我最近将一组node.js更改推送到Openshift上的应用程序.该应用程序在我的本地计算机上运行良好,非常接近Openshift部署的vanilla示例.Openshift haproxy日志有这个最后一行:
[fbaradar-hydrasale.rhcloud.com日志]> [警告] 169/002631(93881):服务器快递/本地齿轮是DOWN,原因:Layer4连接问题,信息: "连接被拒绝",检查持续时间:0毫秒.剩下0个活动服务器和0个备份服 0个会话处于活动状态,0个队列正在运行,0个队列正在运行
nodejs.log具有此最后一行,并且在此行之前没有错误消息: DEBUG: Program node server.js exited with code 8
我搜索了高低,似乎找不到任何有类似问题的人或提示如何解决这个问题.显然,上述结果在尝试通过Web访问应用程序时,503服务不可用.
我有两个HAProxy实例.两个实例都启用了统计信息并且工作正常.
我试图将两个实例的统计数据合并为一个,以便我可以使用单个HAProxy来查看前/后端统计信息.我试图在两个haproxy实例的同一端口上使用stats监听器,但这不起作用.我已尝试使用套接字接口,但这仅报告其中一个接口.
有任何想法吗?
我的一个haproxy配置文件如下所示:
global
daemon
maxconn 256
log 127.0.0.1 local0 debug
log-tag haproxy
stats socket /tmp/haproxy
defaults
log global
mode http
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
frontend http-in
bind *:8000
default_backend servers
log global
option httplog clf
backend servers
balance roundrobin
server ws8001 localhost:8001
server ws8002 localhost:8002
log global
listen admin
bind *:7000
stats enable
stats uri /
Run Code Online (Sandbox Code Playgroud)
除了前/后端服务器IP不同之外,其他haproxy配置是相同的.
我在我的PHP应用程序中将Ratchet(http://socketo.me/)用于websockets。我有多个运行该应用程序的虚拟机,每个虚拟机还托管websocket服务。通过HAProxy将请求传递到这些虚拟机之一。同样,当前用户还在为应用程序连接的同一节点上使用websocket服务。
现在我与websocket服务器互相讨论有问题。例如:
进行此类消息传递的良好实践是什么?我有一些想法,但不确定该怎么走:
如果将新节点连接到云,则第一个和第二个选项的伸缩性都不太好。第三个选项将导致一些滞后,因为有必要检查来自其他节点的消息是否在数据库循环中。
还有其他选择来处理这种情况吗?感谢您的回答!
我有一个HAproxy 1.5设置,可以在几个Web服务器前卸载SSL(这样,它们只处理HTTP)
我的SSL证书是通配符,我们根据FQDN平衡不同的后端.
我的前端配置如下所示:
...
frontend my-frontend
bind ip:443 ssl crt /var/etc/haproxy/wildcard_cert.pem
mode http
log global
option httplog
option forwardfor
use_backend my-backend if { ssl_fc_sni my.domain.org }
use_backend my-backend2 if { ssl_fc_sni my2.domain.org }
acl is-domain hdr(host) -i my.domain.org
acl is-domain2 hdr(host) -i my2.domain.org
use_backend my-backend if is-domain
use_backend my-backend2 if is-domain2
...
Run Code Online (Sandbox Code Playgroud)
特殊选项ssl_fc_sni可用于SSL卸载以访问SNI值(其中选项req_ssl_sni适用于SSL传递)
http://cbonte.github.io/haproxy-dconv/configuration-1.5.html#ssl_fc_sni
我想知道ssl_fc_sni是否比HTTP Header提取ACL执行得更快?HAProxy是否有机会在读取HTTP内容之前提取SNI值并使用它,提取Host:Header并计算我的第二个ACL?
或者性能是一样的?
谢谢,
我遇到问题,有时HaProxy选择错误的SSL证书。场景是这样,我有3个域:
domain1.com
domain2.com
domain3.com
Run Code Online (Sandbox Code Playgroud)
每个域都使用同一个后端,所有SSL终止都发生在负载平衡器上。另外,每个域在指定的pem文件夹中都有其pem文件。
有时domain2.com会尝试使用domain1.com证书,其他域也是如此。一个简单的刷新就可以修复它,但是不可以。这是我的配置:
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
daemon
maxconn 10048
tune.ssl.default-dh-param 2048
defaults
log global
mode http
option forwardfor
option http-server-close
option httplog
option dontlognull
timeout connect 5000
timeout client 2000000
timeout server 2000000
frontend http_front
bind *:80
stats uri /haproxy?stats
reqadd X-Forwarded-Proto:\ http
default_backend http_back
frontend www-https
bind *:443 ssl crt /etc/ssl/pems/ #All PEMs here, in …Run Code Online (Sandbox Code Playgroud) 我在后端服务器应用程序前面设置了HAProxy以启用HTTPS.我已经读过我需要设置的内容X-Forward-Proto https.
在haproxy.cfg文件中,我尝试在前端执行以下操作:
frontend haproxy
bind :8443 ssl crt frontend/server.pem
reqadd X-Forwarded-Proto:\ https
default_backend my-backend
Run Code Online (Sandbox Code Playgroud)
这似乎使它工作 - 例如,我可以登录到我的后端服务器并导航到不同的页面.如果我没有proto选项,我只能登录但不能导航到任何其他页面.
现在我在后端添加选项(从前端删除):
backend my-backend
http-request add-header X-Forwarded-Proto https if { ssl_fc }
server my-backend 127.0.0.1:9000
Run Code Online (Sandbox Code Playgroud)
它也有效,我可以导航我的后端服务器应用程序中的不同页面.
那么这是正确的方法呢?在前端或后端还是没关系?