这是我的基本设置:
路由器转发端口的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>