我正在建立一个网站,托管于sparrowthenerd.空间,我试图让它使用多个子域,这样我就可以从同一个 IP 地址运行 NextCloud、OctoPrint 和一般网页。据我所知,这可以通过 Apache2 中的 VirtualHosts 来实现。但是,除非我从我的 conf 文件中删除 virtualhost 标记(如下),否则在启用 CloudFlare 的情况下会出现 SSL 握手错误,而在未启用 CloudFlare 的情况下会出现 SSL 协议错误。
我在 Debian 11 Bullseye 上使用 Apache2 v2.4.52。Web 服务器是自托管的,并通过代理在端口 9999 上使用 NodeJS(我认为这是正确的术语?)。
#<VirtualHost xxx:xx:xx:xxx:443>
ServerAdmin webmaster@localhost
ServerName sparrowthenerd.space
DocumentRoot /var/www/sparrowthenerd
ProxyPass /.well-known/ !
ProxyPass / http://localhost:9999/
ProxyPassReverse / http://localhost:9999/
ProxyPreserveHost On
SSLEngine on
SSLProtocol all -SSLv2
SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5
SSLCertificateFile /etc/apache2/ssl/sparrowthenerd.space.pem
SSLCertificateKeyFile /etc/apache2/ssl/sparrowthenerd.space.key
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory /var/www>
AllowOverride none
Order Allow,Deny
Allow from all
</Directory>
#</VirtualHost>
当虚拟主机标签未注释时,我会收到错误。当它们被注释时,我不会收到错误,但我也无法添加额外的子域。我正在使用带有 Cloudflare SSL 证书的 CloudFlare 代理服务器。如果您需要更多信息,请告诉我,我很乐意提供!
答案1
您的指令中不应包含 IP 地址VirtualHost
。您应该让 Apache 绑定到那里的所有接口:
<VirtualHost *:443>
答案2
事实证明我是个白痴,我将内部端口 80 转发到外部端口 443,因此服务器接收的是 HTTP 请求而不是 HTTPS,并抛出了错误。