亚马逊EC2实例上的多个虚拟主机:无法访问任何其他虚拟主机比默认

我有一个使用Apache 2.4运行Ubuntu 14.04的Amazon EC2实例。 我已经为Apacheconfiguration了3个虚拟主机,全部仅用于HTTPS。

问题是,当我尝试从互联网上访问Web服务器时,不知何故主机名会丢失,而且Apache会尝试从默认主机提供页面,而不pipe我通过哪个主机名访问它。

/etc/apache2/sites-enabled/default-ssl.conf:

<VirtualHost *:80> ServerName monitor.mydomain.net Redirect / https://monitor.mydomain.net </VirtualHost> <VirtualHost *:443> ServerAdmin webmaster@localhost ServerName monitor.mydomain.net DocumentRoot /usr/share/nagios3/htdocs <Directory /> Options FollowSymLinks AllowOverride None allow from all </Directory> <Directory /usr/share/nagios3/htdocs> Options Indexes FollowSymLinks MultiViews Options +ExecCGI AllowOverride None Order allow,deny allow from all </Directory> ScriptAlias /cgi-bin/nagios3 /usr/lib/cgi-bin/nagios3 ScriptAlias /nagios3/cgi-bin /usr/lib/cgi-bin/nagios3 Alias /stylesheets /etc/nagios3/stylesheets <DirectoryMatch (/usr/share/nagios3/htdocs|/usr/lib/cgi-bin/nagios3|/etc/nagios3/stylesheets)> Options FollowSymLinks DirectoryIndex index.php index.html AllowOverride AuthConfig <IfVersion < 2.3> Order Allow,Deny Allow From All </IfVersion> <IfVersion >= 2.3> Require all denied </IfVersion> AuthName "Nagios Access" AuthType Basic AuthUserFile /etc/nagios3/htpasswd.users <RequireAny> Require valid-user </RequireAny> </DirectoryMatch> ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ <Directory "/usr/lib/cgi-bin"> AllowOverride None Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch Order allow,deny Allow from all </Directory> ErrorLog ${APACHE_LOG_DIR}/nagios_error.log LogLevel warn CustomLog ${APACHE_LOG_DIR}/nagios_access.log combined SSLEngine on SSLCertificateKeyFile /etc/ssl/private/a-wildcard.key SSLCertificateFile /etc/ssl/certs/a-wildcard+dhparam.pem SSLCertificateChainFile /etc/ssl/certs/gd_bundle-g2-g1.crt <FilesMatch "\.(cgi|shtml|phtml|php)$"> SSLOptions +StdEnvVars </FilesMatch> <Directory /usr/lib/cgi-bin> SSLOptions +StdEnvVars </Directory> BrowserMatch "MSIE [2-6]" \ nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0 BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown </VirtualHost> 

/etc/apache2/sites-enabled/timetracker.conf:

 <VirtualHost timetracker.mydomain.net:80> ServerName timetracker.mydomain.net Redirect / https://timetracker.mydomain.net </VirtualHost> <VirtualHost timetracker.mydomain.net:443> ServerAdmin [email protected] ServerName timetracker.mydomain.net DocumentRoot /var/www/kimai <Directory /> Options FollowSymLinks AllowOverride None </Directory> <Directory /var/www/kimai> Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny allow from all </Directory> ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ <Directory "/usr/lib/cgi-bin"> AllowOverride None Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch Order allow,deny Allow from all </Directory> ErrorLog ${APACHE_LOG_DIR}/timetracker_error.log LogLevel warn CustomLog ${APACHE_LOG_DIR}/timetracker_access.log combined SSLEngine on SSLCertificateKeyFile /etc/ssl/private/a-wildcard.key SSLCertificateFile /etc/ssl/certs/a-wildcard+dhparam.pem SSLCertificateChainFile /etc/ssl/certs/gd_bundle-g2-g1.crt <FilesMatch "\.(cgi|shtml|phtml|php)$"> SSLOptions +StdEnvVars </FilesMatch> <Directory /usr/lib/cgi-bin> SSLOptions +StdEnvVars </Directory> # MSIE 7 and newer should be able to use keepalive BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown </VirtualHost> 

当然,该域名已被匿名。

在浏览器中testingURL会给我:

monitor.mydomain.net – > monitor.mydomain.net Nagios页面timetracker.mydomain.net – > 也是monitor.mydomain.net的Nagios页面 ,它应该是从timetracker.mydomain.net提供的Kimai页面。

在我通过monitor.mydomain.net访问页面之后,这是日志文件nagios_acces.log:

  188.194.164.71 - nagiosadmin [10/Oct/2016:19:08:35 +0000] "GET / HTTP/1.1" 200 6389 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0 Iceweasel/38.2.0" 188.194.164.71 - nagiosadmin [10/Oct/2016:19:08:36 +0000] "GET /side.php HTTP/1.1" 200 1429 "https://monitor.mydomain.net/" "Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0 Iceweasel/38.2.0" 188.194.164.71 - nagiosadmin [10/Oct/2016:19:08:36 +0000] "GET /main.php HTTP/1.1" 200 1917 "https://monitor.mydomain.net/" "Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0 Iceweasel/38.2.0" 

当我通过timetracker.mydomain.com访问站点时,我在同一个日志文件中获得这些行:

 188.194.164.71 - nagiosadmin [10/Oct/2016:19:12:19 +0000] "GET / HTTP/1.1" 200 1018 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0 Iceweasel/38.2.0" 188.194.164.71 - nagiosadmin [10/Oct/2016:19:12:20 +0000] "GET /side.php HTTP/1.1" 200 1429 "https://timetracker.mydomain.net/" "Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0 Iceweasel/38.2.0" 188.194.164.71 - nagiosadmin [10/Oct/2016:19:12:20 +0000] "GET /main.php HTTP/1.1" 200 1917 "https://timetracker.mydomain.net/" "Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0 Iceweasel/38.2.0" 188.194.164.71 - nagiosadmin [10/Oct/2016:19:12:20 +0000] "GET /images/favicon.ico HTTP/1.1" 200 1178 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0 Iceweasel/38.2.0" 

请注意,这些行也出现在监视器的日志文件中 ; timetracker的实际日志文件保持为空

有人向我build议,Amazon EC2实例可能位于反向代理的后面,以某种方式丢弃原始HTTP请求的主机名。

这是真的吗?如果是这样,我该如何解决?

提前感谢!

编辑:这整个configuration已经从另一个服务器,它正在工作完美的预期。 两个服务器上的/ etc / apache2目录是完全相同的,当然除了第二级域名。 唯一的区别是原来的服务器是Debian Jessie,而新的服务器是Ubuntu 14.04。

这是因为AWS的networking环境。 你的EC2实例看起来像有2个IP分配(私有的一个公共的一个),但实际上EC2 分配了私有IP 。 公共IP指向VPC之前的一个巨大的NAT设备,它知道如何将公共IP映射到您的EC2实例。 这是AWS的奇怪之一。

这是你的问题的根源。 正如你所看到的,你的默认虚拟主机被声明为<VirtualHost *:80><VirtualHost *:443> ,这意味着对于Apache来说就像“在Apache正在侦听的每个接口上扫描请求,并寻找Host头等于monitor.mydomain.net(在ServerName指令中设置)“。 这没关系,您的请求正在通过您的私有IP(由于NAT设备)和一切正在工作。

但是在你的第二个虚拟主机中,你声明的是<VirtualHost timetracker.mydomain.net:80> 。 作为<VirtualHost timetracker.mydomain.net:443> ,这意味着在apache语言中“扫描所有通过IP timetracker.mydomain.net接口的请求并寻找Host header timetracker.mydomain.net”。 问题是您的EC2 与timetracker.mydomain.net的IP没有接口,因为IP指向了AWS NAT设备,而不是您的EC2实例,所以从未使用此规则。

你必须重新configuration所有的虚拟主机来侦听*:80和*:443,并用ServerName指令定义你的站点。 不幸的是,你无法直接在你的EC2上使用你的公共IP。 AWS有这个,因为他们想dynamic地改变IP和EC2实例的映射。