When To Run HAProxy in HTTP or TCP Modes
Overview:
This guide shows how to configure HAProxy to run in HTTP mode (Layer 7 proxy mode) or TCP mode (Layer 4 proxy mode) in Linux.
Page Contents
What you need to know
HAProxy supports two load balancing modes: TCP or Layer 4 proxy mode and HTTP mode or Layer 7 proxy mode. The mode parameter is used to define whether HAProxy operates as a simple TCP proxy or if it can inspect incoming traffic’s higher-level HTTP messages. The mode setting can be added in the default, frontend, or backend sections.
Note: If all or most of your frontend and backend sections use the same mode, you should consider specifying the mode setting in the defaults section to avoid repetition.
This guide assumes that you:
- understand the OSI (Open Systems Interconnection) model,
- already have HAProxy installed on your Linux server, and
- have root access or can run commands using the sudo command.
Run HAProxy in HTTP Mode (Layer 7 Proxy Mode)
When HAProxy is configured to run in the HTTP mode, it has access to several HTTP-specific options in relation to a request and response. This enables you to configure HAProxy to process a request as required; it can perform routing based on any information discovered in the HTTP request, including URL path, query string, and HTTP headers. For example, you can configure it to choose different backends based on the domain or URL in the HTTP request.
You can use this mode to deploy HAProxy as a gateway to the Internet for your web applications. For example, you can deploy HAProxy in front of other web servers or reverse proxies such as NGINX or Apache.
Sample Configuration
In this sample configuration, the mode setting is defined in the defaults section:
global maxconn 50000 log 127.0.0.1 local2 chroot /var/lib/haproxy stats socket /run/haproxy/admin.sock user haproxy group haproxy mode 660 level admin expose-fd listeners stats timeout 30s user haproxy group haproxy daemon ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384 ssl-default-bind-options ssl-min-ver TLSv1.2 ssl-dh-param-file /etc/ssl/terp/dhparam defaults log global mode http option httplog option dontlognull timeout http-request 10s timeout connect 10s timeout client 30s timeout server 30s 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 listen stats bind *:8500 stats enable stats hide-version stats uri /monitor stats realm Haproxy\ Statistics stats refresh 5s frontend backend_svrs http-response del-header Proxy mode http bind *:80 bind *:443 ssl crt /etc/ssl/example.com.pem alpn h2,http/1.1 redirect scheme https code 301 if !{ ssl_fc } option forwardfor http-response set-header Strict-Transport-Security max-age=63072000 default_backend nginx_svrs backend nginx_svrs mode http option httpchk HEAD / default-server check maxconn 50000 server nginx_svr1 10.1.1.10:80 server nginx_svr2 10.1.1.15:80
Run HAProxy in TCP Mode (Layer 4 Proxy Mode)
In this mode, HAProxy does not inspect the HTTP headers in the packet; it simply allows a request to be forwarded directly to backend servers. It just serves as a messenger, passing messages back, and Because it is just concerned with transit, proxying in this mode lightweight and fast.
This mode is best suited for load-balancing services that communicate over TCP such as database traffic to PostgreSQL, MySQL, Redis servers, and more.
Sample Configuration
The following is a sample configuration for deploying HAProxy as a PostgreSQL database cluster load balancer. The cluster is created and managed using Patroni which has API endpoints for monitoring cluster status and performing health checks via HTTP.
Here, the mode configuration parameter is defined in the defaults section:
global maxconn 5000 defaults log global mode tcp retries 2 timeout client 30m timeout connect 4s timeout server 30m timeout check 5s listen stats mode http bind *:6050 stats enable stats uri / listen primary_dbsvr bind *:5432 option httpchk OPTIONS /master http-check expect status 200 default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions server dbsvr1 10.1.1.51:5430 check port 8008 server dbsvr2 10.1.1.52:5430 check port 8008 server dbsvr3 10.1.1.53:5430 check port 8008 listen standbys_dbsvrs balance roundrobin bind *:5433 option httpchk OPTIONS /replica http-check expect status 200 default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions server dbsvr1 10.1.1.51:5430 check port 8008 server dbsvr2 10.1.1.52:5430 check port 8008 server dbsvr3 10.1.1.53:5430 check port 8008
Whenever you make changes to your HAProxy configuration, ensure that the configuration is valid by running this command:
#haproxy -c -f /etc/haproxy/haproxy.cfg OR $sudo haproxy -c -f /etc/haproxy/haproxy.cfg
Then restart the HAProxy service and ensure that it is running fine by checking the service status, as follows:
#systemctl restart haproxy #systemctl status haproxy
Conclusion
That’s all I prepared for you concerning this topic. You can share your thoughts or questions about this guide via the comment form below.
Reference: https://www.haproxy.com/blog/layer-4-and-layer-7-proxy-mode