HTTP和HTTPS Apacheredirect到内部IP虚拟机

这是我的基本设置:

路由器转发端口的80和443运行Apache的Ubuntu服务器14.04。 很好用。

在Ubuntu服务器上运行多个虚拟机(QEMU / KVM)。 虚拟机处于桥接模式,所以它们有自己的内部IP地址。

我想将子域的所有stream量redirect到VM的处理。

例如:

sub1.example.com – > VM1

sub2.example.com – > VM2

sub3.example.com – > VM3

我想这个转发SSL请求到虚拟机进行处理。

目前我得到redirect循环或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。 所以端口80redirect到虚拟机运行良好。

谢谢你的帮助!

编辑3:

我仍然失去了一些东西(再次,我是一个新手:))

这里是我所有的虚拟主机:

广域网 – > 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. 

思考?

试图让Apache将SSL传递给另一台服务器的服务器是比它的价值更麻烦。 你最好在主apache服务器上处理它。 这样就更简单了。 以下是我为五个子域中的一个所做的一个示例。 我已经拿出了任何与您的问题无关的额外configuration选项。

 <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> 

如果您没有自己的DNS服务器,则需要使用虚拟机的IP地址replace主机名。 如果你使用主机名,那么apache将在启动时通过其ip地址parsing并replace主机名。 如果没有本地dns服务器,那么这将创build一个循环,因为apache将使用公共dns服务器,它将主机名parsing为您的公共ip并将http请求发回给自己。

如果您没有本地dns服务器,并且不想设置它,只需将虚拟机的IP地址replace为主机名即可。 这也将加速启动Apache,因为它不需要parsingDNS名称。

所以你的虚拟主机应该看起来像这样

 <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>