我目前在服务器 1(端口 80 和 443)上使用 apache(Ubuntu),它有多个域名和一个通配符 SSL 证书。目前一切运行正常。
我想在服务器 1 上设置 haproxy,将发往 domain_name_1 的流量路由到服务器 2(该服务器没有 SSL 证书),并且所有发往其他 domain_name 的流量都应从 haproxy 转发到服务器上的 apache1我做了各种更改,例如在服务器 1 上安装 haproxy 并使其监听端口 80 和 443,将服务器 1 上的 apache 更改为监听新端口(8888 和 9999),但仍然出现以下问题:
domain_name_1 的流量已正确发送到服务器 2,SSL 也正常工作。问题在于,所有其他应发送到服务器 1 上的 apache 的域都返回了 Web 浏览器错误 503,查看 haproxy 日志时,我发现了许多 SSL 握手错误。
我读到过一些文章说可能是 SSL 证书问题、haproxy sni 问题或 Apache 配置文件问题,但我真的很困惑,过去几天一直在苦恼。
这是我现在的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
tune.ssl.default-dh-param 2048
# Default SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
# SSL settings
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->
ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
ssl-default-bind-options ssl-min-ver TLSv1.0 no-tls-tickets
defaults
log global
mode http
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 settings
frontend http-in
bind *:80
mode http
acl is_theysback hdr(host) -i domain_name_1.com
use_backend theysback_backend if is_theysback
default_backend apache_backend
frontend https-in
bind *:443 ssl crt /etc/webmin/letsencrypt-fullnew.pem
acl is_theysback hdr(host) -i domain_name_1.com
use_backend theysback_backend if is_theysback
default_backend apache_backend_ssl
# Backends - IP of SERVER 2
backend theysback_backend
server server2 77.88.99.66:80 check
backend apache_backend
server apache1 localhost:8888
backend apache_backend_ssl
server apache1 localhost:9999 ssl ca-file /etc/webmin/letsencrypt-ca.pem
######################################################
在上面的配置中我使用这个 crt 进行 ssl 绑定:
/etc/webmin/letsencrypt-fullnew.pem
创建方式如下:
sudo cat /etc/webmin/letsencrypt-ca.pem /etc/webmin/letsencrypt-cert.pem /etc/webmin/letsencrypt-key.pem > /etc/webmin/letsencrypt-fullnew.pem
里面有:
-----开始证书----- ......... -----结束证书----- -----开始证书----- ......... -----结束证书----- -----开始证书----- ......... -----结束证书----- -----开始证书----- ......... -----结束证书----- -----开始私钥----- ......... -----结束私钥-----
######################################################
这存在问题的域的 apache 配置(503 SSL 握手错误):
已启用站点的域-1-应该停留在服务器-1 上,并已发送到 APACHE.conf
<VirtualHost *:8888>
ServerAdmin admin@domain_name_2.com
ServerName domain_name_1.com
ServerAlias www.domain_name_1.com
DocumentRoot /var/www/theysback/public_html
<Directory /var/www/theysback/public_html>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
RewriteEngine on
RewriteCond %{SERVER_NAME} =domain_name_1.com [OR]
RewriteCond %{SERVER_NAME} =www.domain_name_1.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
站点已启用域-2-应该停留在服务器-1 上-已发送到 APACHE.conf
<IfModule mod_ssl.c>
<VirtualHost *:9999>
ServerAdmin admin@domain_name_2.com
ServerName domain_name_2.com
DocumentRoot /var/www/theysbacksubdomain/public_html
<Directory /var/www/theysbacksubdomain/public_html>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
SSLCertificateFile /etc/webmin/letsencrypt-cert.pem
SSLCertificateKeyFile /etc/webmin/letsencrypt-key.pem
SSLCACertificateFile /etc/webmin/letsencrypt-ca.pem
# IP of SERVER 1
ProxyPreserveHost On
ProxyPass / http://44.22.99.33:7000/
ProxyPassReverse / http://44.22.99.33:7000/
#
</VirtualHost>
<VirtualHost *:8888>
DocumentRoot /var/www/theysbacksubdomain/public_html
ServerName domain_name_2.com
<Directory /var/www/theysbacksubdomain/public_html>
Options None
Require all granted
</Directory>
RewriteEngine on
RewriteCond %{SERVER_NAME} =domain_name_2.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
</IfModule>
任何建议都非常欢迎