我们有一个 Web 服务器和一个客户端,两者都是用 Go 编写的,可以相互交互。我们希望 HAProxy 在服务器的多个实例之间负载平衡请求,但它不起作用。当服务器仍在运行时,客户端将始终连接到同一服务器。
如果我查看“netstat -anp”的输出,我可以看到客户端和服务器之间通过 HAProxy 建立了持久连接。我尝试将响应中的连接标头设置为“关闭”,但这根本不起作用。
不用说,我对此完全感到困惑。我的第一个问题是,这是客户端、服务器还是 HAProxy 的问题吗?如何强制客户端断开连接?我是否遗漏了一些与此相关的内容?Curl 工作正常,所以我知道 HAProxy 可以进行负载平衡,但curl 在完成后也会完全关闭,因此我怀疑是持久连接导致了我的问题,因为客户端和服务器长时间运行。
仅供参考,我在服务器上使用 go-martini。
谢谢。
我们在AWS上部署了一个应用程序。在前面,AWS 负载均衡器接受所有传入的 HTTP 请求;EC2 实例直接位于该平衡器后面。在单个实例上,HAproxy 接收所有请求,然后委托给基于 Java 的真实应用程序服务器(在我们的特殊情况下,haproxy 和业务应用程序服务器位于同一个 EC2 实例上,haproxy 不扮演负载平衡角色,仅用于中继http请求,也就是说haproxy和应用服务器是一一映射的)。
当我们尝试启动对此系统的 http 调用时:
要求
GET /token HTTP/1.1
Host: xxx.xxx.xxx.xxx
Run Code Online (Sandbox Code Playgroud)
回复
HTTP/1.1 403 Forbidden
X-Forwarded-Proto: https
X-Forwarded-For: xxx.xxx.xxx.xxx
X-Forwarded-Port: 443
X-Forwarded-Host: xx.xx.xx.xxx
Date: Wed, 09 Dec 2015 22:04:06 GMT
Server: WSO2-PassThrough-HTTP
Run Code Online (Sandbox Code Playgroud)
根据我的理解,X-Forwarded-*应该只出现在服务器端,以便服务器在中间有代理时识别传入请求的来源。我不知道为什么这些标题也出现在响应中。这让我担心内部 IP 会泄露给潜在的恶意客户端。
以下是haproxy设置的代码片段:
frontend worker
bind :443 ssl crt xxx crt xxx crt xx accept-proxy no-sslv3 no-tls-tickets
mode http
acl forwarded hdr_cnt(X-Forwarded-Host) gt 0
acl trusted src 127.0.0.0/24
capture request header X-Forwarded-For len 64
default_backend …Run Code Online (Sandbox Code Playgroud) 我使用 haproxy 作为 mariadb galera 集群的 banlancer,它可以正常连接并执行一些操作,但几秒钟后我想再次进行一些搜索,但在查询错误期间丢失了连接。请参阅下图的错误。
这是我的 haproxy.cfg
defaults
log global
mode tcp
option tcplog
option dontlognull
option http-server-close
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 50000ms
timeout server 50000ms
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
Run Code Online (Sandbox Code Playgroud)
以及 haproxy.cfg 中 mariadb 集群的余额
listen mariadb_cluster_writes 0.0.0.0:50613
## A failover pool for writes to ensure writes only hit one node at a time.
mode tcp
#option httpchk
option tcpka
option mysql-check …Run Code Online (Sandbox Code Playgroud) 我正在尝试思考在与常规流量不同的端口上进行 haproxy 运行状况检查的优缺点。
如果服务器过载,则在不同端口上进行健康检查可能会将服务器标记为已启动,即使在过载时也是如此。我认为这是一件好事,因为让服务器脱机可能会使过载问题变得更糟,但我想确认这是有道理的。不过,我似乎找不到关于权衡的任何好的文档,并且想知道是否有人对权衡有很好的分析。
我有一种情况,我想使用 haproxy 将所有 http 请求重定向到 https 请求。假设我有一台安装了 haproxy 的服务器 x 和一台运行实际服务的服务器 y(使用 ssl)。现在,我希望 haproxy 接受 http 请求并通过 https 将其转发到后端服务器。有点像这样:
用户 <--(http)--> haproxy <--(https)--> 实际服务
到目前为止我所做的是,前端接受端口 8080 中的 http 连接,并将其发送到其默认后端,在后端我已添加“ssl verify none”。
使用此功能,我可以从 http 加载页面,但每当我提交请求(例如登录)时,响应都会来自 http url,但没有任何效果。
我不知道这是否可能。
如果我需要提供更多详细信息,请告诉我。
对此的任何了解都会非常友善。
提前致谢。
我希望让 HAProxy 设置自定义标头并记录它。
下面是我的 haproxy.cfg 的配对示例(我省略了一些我认为与我的问题无关的 SSL 详细信息和多个后端)
global
log 127.0.0.1 local0 debug
defaults
log global
stats enable
option httplog
frontend httpFrontendi
mode http
bind *:80
http-request add-header Foo Bar
capture request header Foo len 64
log-format Foo\ %[capture.req.hdr(0)]\ %hr\ %hrl\ %hs\ %hsl
default_backend backend_api
redirect scheme https code 301 if !{ ssl_fc }
backend backend_api
mode http
balance roundrobin
option httpchk HEAD /api/test_db HTTP/1.0
server backend_api1 ip:80 check inter 5s rise 2 fall 3
Run Code Online (Sandbox Code Playgroud)
我调用代理:
curl 127.0.0.1 …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Haproxy 1.6.3 2015/12/25粘性会话。我根据haproxy 手册做了所有事情,但是,不幸的是,检查客户端浏览器时,我发现没有添加 cookie(平衡器必须在第一个请求后在响应中返回 cookie,但它什么都不返回我,并且什么也没发生(没有饼干))。其他一切都完美无缺,但 cookie 不行。我附上了我的 haproxy.cfg:
global
log /dev/haproxy/log local0
log /dev/haproxy/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
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
stats enable
stats auth user:pass
stats uri /haproxy_stats
option httpchk HEAD / HTTP/1.0
option redispatch
balance roundrobin
frontend frontend_http
bind *:80
option forwardfor
default_backend …Run Code Online (Sandbox Code Playgroud) 我已经在集群中部署了带有 Kerberos 的 NiFi,并且为了访问 UI,我使用了 haproxy。我可以通过单个节点 URL 访问 NiFi UI,但它无法与 loadbalncer URL 配合使用并出现以下错误
系统错误
请求包含无效的主机标头
我认为它可以通过 nifi.web.proxy.host 和 nifi.web.proxy.context.path 参数来修复。我尝试使用这两个参数,但问题仍然存在。
HAProxy 中 Nginx pass_proxy 的等价物是什么
location /{
proxy_pass https://WebApplication.azurewebsites.net;
}
Run Code Online (Sandbox Code Playgroud)
我尝试测试此配置,但是当我指向具有以下配置的任何后端服务器时收到 404,而不在 root 上使用 ACL,例如使用自签名证书
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
log /dev/log local0
log /dev/log local1 notice
user haproxy
group haproxy
maxconn 16000
stats socket /var/lib/haproxy/stats level admin
tune.bufsize 32768
tune.maxrewrite 1024
tune.ssl.default-dh-param 2048
daemon
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout …Run Code Online (Sandbox Code Playgroud) 我最近收到了一个用于 haproxy SSL 终止的签名证书。为了让 haproxy 使用它,我需要将 jks 文件转换为 pem 文件。首先,我将收到的 cer 文件转换为 crt,因为我之前遇到过错误,haproxy 无法在 pem 文件中找到 crt 文件。对所有证书执行此操作:
$ openssl x509 -inform PEM -in <CER file here> -out <CRT output file>
Run Code Online (Sandbox Code Playgroud)
然后我将根证书、中间证书和服务证书导入到已经拥有私钥的密钥库:
keytool -importcert -file $CERT -alias $ALIAS -keystore test.jdk
Run Code Online (Sandbox Code Playgroud)
然后我将 jsk 文件转换为 p12 文件,然后将其转换为 pem 文件:
$ keytool -importkeystore -srckeystore test.jks -destkeystore test.p12 -srcstoretype jks -deststoretype pkcs12
Enter destination keystore password:
Re-enter new password:
$ openssl pkcs12 -in test.p12 -out test.pem
Enter Import Password:
MAC verified OK
Enter PEM …Run Code Online (Sandbox Code Playgroud)