这是我的基本设置:
路由器将端口 80 和 443 转发到运行 apache 的 Ubuntu Server 14.04。效果很好。
在 Ubuntu 服务器上运行多个虚拟机 (QEMU/KVM)。VM 处于桥接模式,因此它们有自己的内部 IP 地址。
我想将子域的所有流量重定向到虚拟机进行处理。
前任:
sub1.example.com-> VM1
sub2.example.com-> VM2
sub3.example.com-> VM3
我希望将 ssl 请求转发到 VM 进行处理。
目前,无论我尝试什么,我都会收到重定向循环或 SSL 错误。我可以让非 SSL 工作,但我不确定如何设置 Ubuntu 服务器来处理和转发 HTTP 和 HTTPS 请求。
编辑:
以下是我当前的虚拟主机文件:
<VirtualHost *:80>
ServerName sub1.example.com
ProxyPreserveHost On
ProxyPass / http://192.168.1.78/
ProxyPassReverse / http://192.168.1.78/
</VirtualHost>
<VirtualHost *:443>
ServerName sub1.exmaple.com
ProxyPreserveHost On
ProxyPass / http://192.168.1.78/
ProxyPassReverse / http://192.168.1.78/
</VirtualHost>
我知道这是不正确的,但不知道该怎么做。主服务器将接收来自http://sub1.example.com和https://sub1.example.com
编辑2:
我忘了说我使用这个来为非 SSL 工作:
<VirtualHost *:80>
ServerName zab.example.com # this forwards to my zabbix VM
ProxyPreserveHost on
ProxyPass / http://192.168.1.64/
ProxyPassReverse / http://192.168.1.64/
</VirtualHost>
这将接收对 zab.example.com 的传入请求并将其转发到我的 Zabbix VM 192.168.1.64。因此,端口 80 重定向到 VM 运行良好。
谢谢你的帮助!
编辑3:
我仍然缺少一些东西(再说一遍,我是新手:))
以下是我的所有虚拟主机:
WAN -> 192.168.1.66(主服务器)
<VirtualHost *:80>
ServerName file.example.com
redirect permanent / https://file.example.com/
</VirtualHost>
<VirtualHost *:443>
ServerName file.example.com
SSLEngine On
SSLCertificateFile /home/js/Seafile/file_ws_ee.crt
SSLCertificateKeyFile /home/js/Seafile/file.example.com.key
SSLCertificateChainFile /home/js/Seafile/GeoTrustDVSSLCAG4.cer
SSLProxyEngine On
ProxyPreserveHost off
ProxyRequests off
ProxyPass / http://file.example.com/
ProxyPassReverse / http://file.example.com/
</VirtualHost>
内部虚拟机 192.168.1.78(运行 Seafile)
<VirtualHost *:80>
ServerName file.example.com
redirect permanent / https://file.example.com/
</VirtualHost>
<VirtualHost *:443>
ServerName file.example.com
DocumentRoot /var/www
Alias /media /home/js/Seafile/seafile-server-latest/seahub/media
SSLEngine On
SSLCertificateFile /home/js/Seafile/file_ws_ee.crt
SSLCertificateKeyFile /home/js/Seafile/file.example.com.key
SSLCertificateChainFile /home/js/Seafile/GeoTrustDVSSLCAG4.cer
RewriteEngine On
<Location /media>
Require all granted
</Location>
#
# seafile fileserver
#
ProxyPass /seafhttp http://127.0.0.1:8082
ProxyPassReverse /seafhttp http://127.0.0.1:8082
RewriteRule ^/seafhttp - [QSA,L]
#
# seahub
#
RewriteRule ^/(media.*)$ /$1 [QSA,L,PT]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /seahub.fcgi/$1 [QSA,L,E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
</VirtualHost>
运行 wget file.example.com 的结果为:
HTTP request sent, awaiting response... 301 Moved Permanently
Location: https://file.example.com/ [following]
20 redirections exceeded.
有什么想法吗?
答案1
尝试让 apache 将 SSL 传递到另一台提供 SSL 的服务器会得不偿失。最好在主 apache 服务器上处理。这样更简单。以下是我为我的五个子域之一所做的示例。我删除了与您的问题无关的任何额外配置选项。
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName sentinel.example.net
ServerAlias sentinel
RewriteEngine On
RewriteRule ^(.*) https://%{HTTP_HOST}/$1
</VirtualHost>
<VirtualHost *:443>
# SSL
SSLEngine On
SSLCertificateFile /etc/pki/tls//web/sentinel.pem
SSLCertificateKeyFile /etc/pki/tls/web/sentinel.key
SSLCertificateChainFile /etc/pki/tls/startssl/startssl.pem
# Basics
ServerAdmin [email protected]
ServerName sentinel.example.net
ServerAlias sentinel
# Proxy
ProxyPreserveHost Off
ProxyRequests off
SSLProxyEngine On
ProxyPass / http://sentinel.example.net/ timeout=60
ProxyPassReverse / http://sentinel.example.net/ timeout=60
</VirtualHost>
答案2
如果您没有自己的 DNS 服务器,则需要用虚拟机的 IP 地址替换主机名。如果您使用主机名,则 apache 将在启动时解析主机名并将其替换为其 IP 地址。如果没有本地 DNS 服务器,则这将创建一个循环,因为 apache 将使用公共 DNS 服务器将主机名解析为您的公共 IP,并将 http 请求发送回自身。
如果您没有本地 DNS 服务器,并且不想设置它,只需用虚拟机的 IP 地址替换主机名。这也会加快 apache 的启动速度,因为它不需要解析 DNS 名称。
所以你的虚拟主机应该是这样的
<VirtualHost *:80>
ServerName file.example.com
redirect permanent / https://file.example.com/
</VirtualHost>
<VirtualHost *:443>
ServerName file.example.com
SSLEngine On
SSLCertificateFile /home/js/Seafile/file_ws_ee.crt
SSLCertificateKeyFile /home/js/Seafile/file.example.com.key
SSLCertificateChainFile /home/js/Seafile/GeoTrustDVSSLCAG4.cer
SSLProxyEngine On
ProxyPreserveHost on
ProxyRequests off
ProxyPass / http://192.168.1.78/
ProxyPassReverse / http://192.168.1.78/
</VirtualHost>