HTTP 和 HTTPS Apache 重定向至内部 IP 虚拟机

HTTP 和 HTTPS Apache 重定向至内部 IP 虚拟机

这是我的基本设置:

路由器将端口 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.comhttps://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>

相关内容