502 Bad Gateway HAproxy

时间:2013-09-04 13:25:20

标签: linux tomcat ubuntu proxy haproxy

我正在运行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错误?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

tune.maxrewrite 4096
tune.http.maxhdr 202

答案 2 :(得分:0)

您应该使用以下内容替换默认设置:

# 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,这很可能是造成问题的原因。

保持活动状态将在两侧与客户端和服务器建立连接。 它也可以与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