Haproxy 网关错误 502

问题描述 投票:0回答:2

所以我在 Jetty servlet 前面使用 HAProxy。 目前的目标只是概念验证以及所有配置完成后的负载和压力测试。 但是我在配置 haproxy 时遇到问题。我知道这不是我的应用程序的问题,因为我正在运行 nginx(tengine) 并且一切正常。所以它必须与 haproxy 配置有关,否则 haproxy 的工作方式不适合我的需求。

所以我的客户尝试做的是使用两个不同的连接连接到 haproxy 并保持它们打开:

  1. 连接分块流模式进行上传。
  2. 以普通模式连接,建立下载通道。

这是我的 haproxy.conf 文件的样子:

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

# Default SSL material locations
# ca-base /etc/ssl/certs
# crt-base /etc/ssl/private

# Default ciphers to use on SSL-enabled listening sockets.
# For more information, see ciphers(1SSL).
ssl-default-bind-ciphers kEECDH+aRSA+AES:kRSA+AES:+AES256:RC4-SHA:!kEDH:!LOW:!EXP:!MD5:!aNULL:!eNULL
maxconn 2048

defaults
log global
mode    http
option forwardfor
option http-server-close
option  httplog
option  dontlognull
timeout connect 5000
timeout client  50000
timeout server  50000
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
stats enable
stats uri /stats
stats realm Haproxy\ Statistics
stats auth user:password

frontend www-http
   bind *:80
   reqadd X-Forwarded-Proto:\ http
   default_backend www-backend

frontend www-https
   bind *:443 ssl crt /etc/haproxy/server.pem
   reqadd X-Forwarded-Proto:\ https
   default_backend www-backend

backend www-backend
    redirect scheme https if !{ ssl_fc }
    server www-1 localhost:8080 check maxconn 2048

这是我尝试访问端口 443 时日志的内容:

9月17日11:10:18 xxxxx-pc haproxy[15993]: 127.0.0.1:32875 [17/Sep/2014:11:10:18.464] www-https~ www-backend/www-1 0/0/0 /-1/1 502 212 - - PH-- 0/0/0/0/0 0/0 "GET /test HTTP/1.1"

知道问题可能是什么吗? 配置有问题还是?

谢谢。

java servlets nginx jetty haproxy
2个回答
7
投票

PH 表示 haproxy 拒绝了来自后端的标头,因为它格式错误。 http://www.haproxy.org/download/1.4/doc/configuration.txt

PH - 代理阻止了服务器的响应,因为它无效, 不完整、危险(缓存控制)或与安全过滤器匹配。 无论如何,HTTP 502 错误都会发送到客户端。一种可能 导致此错误的原因是 HTTP 标头名称中的语法无效 包含未经授权的字符。这也是可能的,但相当 罕见的是,代理阻止了来自的分块编码请求 在服务器响应之前,客户端由于语法无效。在这个 在这种情况下,HTTP 400 错误将发送到客户端并在 日志。


0
投票

我一直在寻找一种非常类似的情况,其中一些(不是全部)来自 Geoserver 后端服务的请求被返回为 500 内部服务器错误,并且 Geoserver 在过去一直工作完美。 HAProxy 在其日志中将此记录为 PH--。 Geoserver 的日志中没有任何内容。

对我来说,事实证明,我过度急切地使用标头进行调试是罪魁祸首,在减少/删除其中大部分标头后,问题就停止了。

HAProxy 文档仅声明当后端 HTTP 响应不符合标准时它会返回 PH,这显然是错误的。当缓冲区溢出或耗尽时,它也会执行此操作。也许是 HTTP 状态代码 500 而不是 502 的差异。

另一种解决方案可能是在配置文件的

tune.bufsize
部分中为
tune.h2.header-table-size
tune.http.maxhdr
和/或
global
添加更大的值。

在我的情况下,当仅更改像这样的

tune.bufsize
值时,错误消失了(所有过度渴望的标头仍然存在):

global
   tune.bufsize 65536    # default 16384

但是我保留了默认值并删除了所有不必要的标头。

© www.soinside.com 2019 - 2024. All rights reserved.