Ssl

HTTP & HTTPS Apache 重定向到內部 IP 虛擬機

  • October 14, 2016

這是我的基本設置:

路由器將埠的 80 和 443 轉發到執行 apache 的 Ubuntu Server 14.04。效果很好。

在 Ubuntu 伺服器上執行多個虛擬機 (QEMU/KVM)。虛擬機處於橋接模式,因此它們有自己的內部 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 的傳入請求,並將它們轉發到位於 192.168.1.64 的 Zabbix VM。因此埠 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>

內部 VM 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 傳遞給另一個服務 SSL 的伺服器比它的價值更麻煩。你最好讓它在主 apache 伺服器上處理。這樣更容易。這是我為五個子域之一所做的範例。我已經刪除了與您的問題無關的任何額外配置選項。

<VirtualHost *:80>
   ServerAdmin example@gmail.com
   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 example@gmail.com
   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>

引用自:https://serverfault.com/questions/749768