我在 Digital Ocean 有一个 VPS,运行 ubuntu 14.04 和 apache 2.4.7,DNS 也在 DO 中管理。
我有一个域名,我们称之为 thedomain.com,我一直在尝试与主域名一起配置 3 个子域名(thedomain.com、calis.thedomain.com、orlybg.thedomain.com、fubar.thedomain.com)。
我无法正确配置我的 apache 的虚拟主机,在浏览器中无论配置到哪个域/子域,我总是得到相同 vhost 的响应(我可以通过 apache 日志知道)和浏览器中的输出。
主域名和 3 个子域名是 A 记录 www 是 CNAME,这是我的区域文件:
$ORIGIN thedomain.com.
$TTL 1800
thedomain.com. IN SOA ns1.digitalocean.com. hostmaster.thedomain.com. 1422028092 10800 3600 604800 1800
thedomain.com. 1800 IN NS ns1.digitalocean.com.
thedomain.com. 1800 IN NS ns2.digitalocean.com.
thedomain.com. 1800 IN NS ns3.digitalocean.com.
thedomain.com. 1800 IN A 104.236.80.93
www.thedomain.com. 1800 IN CNAME thedomain.com.
orlybg.thedomain.com. 1800 IN A XXX.XXX.XX.XX
fubar.thedomain.com. 1800 IN A XXX.XXX.XX.XX
calis.thedomain.com. 1800 IN A XXX.XXX.XX.XX
我有主主机和 3 个子域作为 4 个独立的虚拟主机文件,我已启用以下 3 个:
calis.thedomain.com.conf
<VirtualHost *:80>
ServerName calis.thedomain.com
DocumentRoot /var/www/html/calis
<Directory /var/www/html/calis>
# enable the .htaccess rewrites
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error_calis.log
CustomLog ${APACHE_LOG_DIR}/access_calis.log combined
</VirtualHost>
域名.com.conf
<VirtualHost *:80>
ServerName thedomain.com
DocumentRoot /var/www/html/thedomain
<Directory /var/www/html/thedomain>
# enable the .htaccess rewrites
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
orlybg.thedomain.com.conf
<VirtualHost *:80>
ServerName orlybg.thedomain.com
DocumentRoot /var/www/html/myproject
<Directory /var/www/html/myproject>
# enable the .htaccess rewrites
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error_orlybg.log
CustomLog ${APACHE_LOG_DIR}/access_orlybg.log combined
</VirtualHost>
我使用 a2ensite 启用 vhosts,启用了 vhost_alias.load,用多种方式重启/重新加载 apache,但都失败了。我发现 NameVirtualHost 指令未在我的 apache 版本中使用,我以前有一个带有 ServerName localhost 的 conf 文件,因此看不到“无法可靠地确定服务器的完全限定域名”错误,但我禁用了它。
apachectl -S
VirtualHost configuration:
*:80 is a NameVirtualHost
default server calis.thedomain.com (/etc/apache2/sites-enabled/calis.thedomain.com.conf:1)
port 80 namevhost calis.thedomain.com (/etc/apache2/sites-enabled/calis.thedomain.com.conf:1)
port 80 namevhost thedomain.com (/etc/apache2/sites-enabled/thedomain.com.conf:1)
port 80 namevhost orlybg.thedomain.com (/etc/apache2/sites-enabled/orlybg.thedomain.com.conf:1)
ServerRoot: "/etc/apache2"
Main DocumentRoot: "/var/www"
Main ErrorLog: "/var/log/apache2/error.log"
Mutex watchdog-callback: using_defaults
Mutex rewrite-map: using_defaults
Mutex default: dir="/var/lock/apache2" mechanism=fcntl
Mutex mpm-accept: using_defaults
PidFile: "/var/run/apache2/apache2.pid"
Define: DUMP_VHOSTS
Define: DUMP_RUN_CFG
User: name="www-data" id=33
Group: name="www-data" id=33
我不知道下一步该怎么做,我已经尝试了好几天了。如果能得到任何帮助我都会非常感激,谢谢!
答案1
除了这个问题我还有两点建议
- 添加
ServerName
Apache 为请求提供服务的主机的 FQDN。这将帮助您避免很多麻烦。 - 如果所有子域都有不同的 IP 地址,则使用基于 IP 的虚拟化而不是基于名称的虚拟化。
您的VirtualHost
配置看起来很完美,而且似乎不会产生问题。
如果在包含最具体的匹配 IP 地址和端口组合的虚拟主机集合中未找到匹配的 ServerName 或 ServerAlias,则将使用匹配的第一个列出的虚拟主机。
通常,VirtualHost
会根据Host:
HTTP 标头选择不同的部分,如果没有与标头VirtualHost
匹配的部分Host:
,则第一个部分将被视为默认部分,并将被提供。而这又取决于您在浏览器中发出请求的方式。您可以使用curl
命令检查它,以确定是什么导致了问题,如下所示。
$ curl -L http://localhost -H 'Host: thedomain.com'
这应该返回来自的文档/var/www/html/thedomain
。
$ curl -L http://localhost -H 'Host: orlybg.thedomain.com'
这应该返回来自的文档/var/www/html/myproject
。
这里-H
我们可以选择发送自定义 http 标头,因此这里我们使用它来发送Host:
http 标头。
答案2
最后,我的一个朋友发现我在 vhosts 中输入了错误,于是他在 /etc/hosts 中添加了一些包含域名和服务器 IP 的条目
thedomain.com XXX.XXX.XX.XX
www.thedomain.com XXX.XXX.XX.XX
orlybg.thedomain.com XXX.XXX.XX.XX
calis.thedomain.com XXX.XXX.XX.XX