我刚刚开始研究 haproxy,我的目标是建立一个SSL 终止负载均衡器,前端是 ubuntu,后端是 lamp (ubuntu)(目前)。前端和后端机器都是我的虚拟机上的 18.04 ubuntu。我使用的是 Windows 10,以防万一
在过去的几天里,我查阅了大量文档和答案,但仍然无法解决这个问题。
这两个工作正常:
- 如果我通过以下方式访问网站,后端服务器可以顺利提供服务http通过浏览器(http://mysite.testing)
- 如果我直接通过后端服务器的 IP 地址访问网站,后端服务器可以毫无问题地为网站提供服务(http://192.168.56.108)
注意:后端服务器上没有 SSL 证书。但我在 haproxy 机器上设置了一个 mkcert,运行正常 - 全部为绿色锁
什么不起作用/问题:
当我访问https通过 haproxy 访问网站(https://mysite.testing )该页面向我展示了503服务不可用 - 没有可用的服务器来处理此请求
我的设置:
我已将此行添加到我的hosts 文件,这就是我访问 mysite.testing 的方式:
192.168.56.105 mysite.testing
我的haProxy配置文件文件 :
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
stats timeout 30s
user haproxy
group haproxy
daemon
# Default SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
ssl-default-bind-options no-sslv3
tune.ssl.default-dh-param 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
frontend FrontEnd_Http
bind *:80
reqadd X-Forwarded-Proto:\ http
default_backend My_Web_Servers
frontend FrontEnd_Https
bind 192.168.56.105:443 ssl crt /etc/haproxy/ssl/mysite.testing.pem
mode http
#reqadd X-Forwarded-Proto:\ https
default_backend My_Web_Servers
backend My_Web_Servers
mode http
balance roundrobin
server tad108 192.168.56.108
listen stats
bind :32700
stats enable
stats uri /
stats auth admin:admin
我的apache2 配置文件(/etc/apache2/sites-enabled):
<VirtualHost *:80>
ServerName mysite.testing
ServerAlias www.mysite.testing
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html/mysite.testing/public_html
ErrorLog /var/www/html/mysite.testing/logs/error.log
CustomLog /var/www/html/mysite.testing/logs/access.log combined
<Directory />
Options FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
问题 :
- 什么原因可能导致 503 ?
- 这是后端 apache2 服务器的问题还是我的前端 haproxy.cfg 的问题?
- 我该如何解决这个问题,以便网站能够正常工作 https://mysite.testing没有 503?
非常感谢你的阅读 :)
答案1
当您配置server
如下内容时...
server tad108 192.168.56.108
...您还没有告诉 HAProxy 服务器使用哪个端口来接受流量,因此 HAProxy 假定您打算对流量到达的bind
HAProxy 上的可能端口frontend
和后端的目标端口进行 1:1 等效映射,因此到达 80 的流量将流向 80 上的服务器,而到达 443 的流量将流向 443 上的服务器。这很少是您想要的,您通常会将所有流量发送到单个端口,如下所示:
server tad108 192.168.56.108:80
保留初始端口的能力对于其他应用程序来说具有一些有趣的可能性,但对于 HTTP 和 HTTPS 很少有用,因为在 中mode http
,server
预计会使用 TLS 或不使用 TLS,这取决于是否ssl
配置了该选项。
您还可以使用偏移量来保留端口。
<port>
是可选的端口规范。如果设置,所有连接都将发送到此端口。如果未设置,将使用客户端连接的相同端口。端口也可以以“+”或“-”为前缀。在这种情况下,服务器的端口将通过将此值添加到客户端的端口来确定。http://cbonte.github.io/haproxy-dconv/1.8/configuration.html#server
(这里使用的“客户端端口”是指客户端连接到的端口,而不是客户端 TCP 堆栈上的源端口。)