我正在尝试以反向代理模式配置 haproxy (1.5.8),链接到托管在旧 Unix 服务器上的某种虚拟主机。haproxy 将位于 DMZ 中,而 Web 服务器将位于 LAN 中。
基本上我想要:
https://a.domain.com/lo -> http://a.b.c.d:5000/lo
https://a.domain.com/lp -> http://a.b.c.d:5500/lp
默认情况下,如果我尝试连接到http://abcd:5000/,如果我打开,将显示网页http://abcd:5000/lo。
frontend ft1
mode http
option forwardfor
bind *:443 ssl crt /etc/ssl/certs.pem
use_backend bk_Lo if { path_beg /lo }
use_backend bk_Lp if { path_beg /lp }
default_backend bk_Lo
backend bk_Lo
mode http
server lo a.b.c.d:5000
backend bk_Lp
mode http
server lp a.b.c.d:5500
但我不知道如何正确地重写 URL,结果总是出现 503 错误。使用 haproxy 是否可行?有人能指点我如何解决这个问题吗?
感谢您的帮助。
达夫龙
答案1
您需要将其添加到您的后端部分:
http 请求设置标头主机 abcd
frontend ft1
mode http
option forwardfor
bind *:443 ssl crt /etc/ssl/certs.pem
use_backend bk_Lo if { path_beg /lo }
use_backend bk_Lp if { path_beg /lp }
default_backend bk_Lo
backend bk_Lo
mode http
server lo a.b.c.d:5000
**http-request set-header Host a.b.c.d**
backend bk_Lp
mode http
server lp a.b.c.d:5500
**http-request set-header Host a.b.c.d**
答案2
global
log 127.0.0.1 local0
maxconn 2000
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
defaults
log global
option dontlognull
option redispatch
retries 3
timeout connect 5000s
timeout client 1200000s
timeout server 1200000s
frontend http_proxy
mode http
bind *:443 ssl crt /etc/ssl/cert_for_a.pem crt /etc/ssl/cert_for_b.pem
option httplog
option http-server-close
acl a_domain_url hdr_beg(host) a.domain.com
use_backend bk_Lo if { path_beg /lo }
acl work_url hdr_beg(host) b.domain.com
use_backend bk_Lp if { path_beg /lp }
backend bk_Lo
mode http
server lo a.b.c.d:5000
backend bk_Lp
mode http
server lo a.b.c.d:5500