6

我正在运行 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 1 maxconn 1024 check

    backend socket_backend
        balance roundrobin
        option forwardfor # This sets X-Forwarded-For
        timeout queue 5000
        timeout server 86400000
        timeout connect 86400000
        server apiserver localhost:8080 weight 1 maxconn 1024 check

为了防止 502 错误,我必须进行哪些更改?

4

3 回答 3

2

首先,启用 haproxy 日志记录。它会简单地告诉你它为什么给出 502。我的猜测是后端“localhost:8080”根本无法跟上或无法在 4000 毫秒“超时连接 4000”内获得连接。

于 2013-09-10T16:40:14.967 回答
0

您可能已经超出了 HAProxy 中的一些默认限制。尝试将以下内容添加到全局部分:

tune.maxrewrite 4096
tune.http.maxhdr 202
于 2016-03-09T22:01:21.120 回答
-1

你应该用这些替换你的默认值:

# Set balance mode
balance random
# Set http mode
mode http
# Set http keep alive mode (https://cbonte.github.io/haproxy-dconv/2.3/configuration.html#4)
option http-keep-alive
# Set http log format
option httplog
# Dont log empty line
option dontlognull
# Dissociate client from dead server
option redispatch
# Insert X-Forwarded-For header
option forwardfor

不要使用 http-server-close,这可能是您的问题的原因。

Keep-alive 将与双方的客户端和服务器建立连接。它也适用于 websockets。

如果您在服务器上启用检查,您还需要使用以下内容对其进行配置:

# Enable http check
option httpchk
# Use server configuration
http-check connect default
# Use HEAD on / with HTTP/1.1 protocol for Host example.com
http-check send meth HEAD uri / ver HTTP/1.1 hdr Host example.com
# Expect status 200 to 399
http-check expect status 200-399
于 2020-11-20T03:49:50.707 回答