haproxy ssl 终止在 http 上有效,但在 https 上失败并出现 503 - 在 Virtualbox apache2 ubuntu 18.04 后端服务器上

haproxy ssl 终止在 http 上有效,但在 https 上失败并出现 503 - 在 Virtualbox apache2 ubuntu 18.04 后端服务器上

我刚刚开始研究 haproxy,我的目标是建立一个SSL 终止负载均衡器,前端是 ubuntu,后端是 lamp (ubuntu)(目前)。前端和后端机器都是我的虚拟机上的 18.04 ubuntu。我使用的是 Windows 10,以防万一

在过去的几天里,我查阅了大量文档和答案,但仍然无法解决这个问题。

这两个工作正常:

  1. 如果我通过以下方式访问网站,后端服务器可以顺利提供服务http通过浏览器(http://mysite.testing)
  2. 如果我直接通过后端服务器的 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 假定您打算对流量到达的bindHAProxy 上的可能端口frontend和后端的目标端口进行 1:1 等效映射,因此到达 80 的流量将流向 80 上的服务器,而到达 443 的流量将流向 443 上的服务器。这很少是您想要的,您通常会将所有流量发送到单个端口,如下所示:

server tad108 192.168.56.108:80

保留初始端口的能力对于其他应用程序来说具有一些有趣的可能性,但对于 HTTP 和 HTTPS 很少有用,因为在 中mode httpserver预计会使用 TLS 或不使用 TLS,这取决于是否ssl配置了该选项。

您还可以使用偏移量来保留端口。

<port> 是可选的端口规范。如果设置,所有连接都将发送到此端口。如果未设置,将使用客户端连接的相同端口。端口也可以以“+”或“-”为前缀。在这种情况下,服务器的端口将通过将此值添加到客户端的端口来确定。

http://cbonte.github.io/haproxy-dconv/1.8/configuration.html#server

(这里使用的“客户端端口”是指客户端连接到的端口,而不是客户端 TCP 堆栈上的源端口。)

相关内容