我正在使用 Debian 具有规范名称的服务器(在/etc/hostname
反向 DNS 中定义)server.example.com
root@server:~# uname -a
Linux server.example.com 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt11-1 (2015-05-24) x86_64 GNU/LinuxApache/2.4.10 (Debian) 服务器位于 server.example.com 端口 80
现在我安装了 apache2 并做了一些基本配置。然后我将 VirtualHosts 添加到 中,并/etc/apache2/sites-available
在 中使用符号链接。除了之外sites-enabled
,一切都运行良好。当我尝试在资源管理器中访问该 URI 时,我获得了默认虚拟主机的内容(未指定)。如果我将的 ServerName 更改为其他名称(例如)并重新加载 apache 配置,那么我就可以毫无问题地访问 URI。我想知道 VirtualHost 与机器的规范名称相同有什么问题。VirtualHost
ServerName server.example.com
ServerName
server.example.com.conf
test.example.com
ServerName
此外,server.example.com.conf
包含和文件夹。默认 VirtualHost 包含DocumentRoot /var/www/subs/server
,其中没有文件夹。但是,当我尝试访问 时,我可以进入,而 会带我。index.html
munin
DocumentRoot /var/www/html
munin
http://server.example.com/munin
/var/www/subs/server/munin
http://server.example.com/index.html
/var/www/html/index.html
最后,当我输入Redirect 404 /
默认的 VirtualHost 时,404
当我尝试访问时,http://server.example.com/
我将得到http://server.example.com/munin
添加了 VirtualHosts 的配置
/etc/apache2/sites-available/forum.example.com.conf
:
# Working subdomain configuration
<VirtualHost *:80>
ServerName forum.example.com
ServerAdmin [email protected]
DocumentRoot /var/www/subs/forum
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
/etc/apache2/sites-available/server.example.com.conf
:
# Not working server.example.com configuration
<VirtualHost *:80>
ServerName server.example.com
ServerAdmin [email protected]
DocumentRoot /var/www/subs/server
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
/etc/apache2/sites-available/default.conf
:
# Default VirtualHost configuration
<VirtualHost *:80>
ServerAdmin [email protected]
DocumentRoot /var/www/html
#Redirect 404 /
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
root@server:~# apache2ctl -t
语法 OK
添加输出 root@server:~# apache2 -S
[Tue Aug 11 11:07:32.705684 2015] [core:warn] [pid 20215] AH00111: Config variable ${APACHE_LOCK_DIR} is not defined
[Tue Aug 11 11:07:32.706119 2015] [core:warn] [pid 20215] AH00111: Config variable ${APACHE_PID_FILE} is not defined
[Tue Aug 11 11:07:32.706250 2015] [core:warn] [pid 20215] AH00111: Config variable ${APACHE_RUN_USER} is not defined
[Tue Aug 11 11:07:32.706406 2015] [core:warn] [pid 20215] AH00111: Config variable ${APACHE_RUN_GROUP} is not defined
[Tue Aug 11 11:07:32.706566 2015] [core:warn] [pid 20215] AH00111: Config variable ${APACHE_LOG_DIR} is not defined
(... repeating few more times)
[Tue Aug 11 11:07:32.744292 2015] [core:warn] [pid 20215] AH00111: Config variable ${APACHE_LOG_DIR} is not defined
AH00526: Syntax error on line 74 of /etc/apache2/apache2.conf:
Invalid Mutex directory in argument file:${APACHE_LOCK_DIR}
尽管,
/etc/apache2/apache2.conf:74:Mutex file:${APACHE_LOCK_DIR} default
/etc/apache2/envvars:21:export APACHE_LOCK_DIR=/var/lock/apache2$SUFFIX
运行后/etc/apache2/envvar
我通过执行得到这个apache2 -S
VirtualHost configuration:
*:80 is a NameVirtualHost
default server server.example.com (/etc/apache2/sites-enabled/default.conf:1)
port 80 namevhost server.example.com (/etc/apache2/sites-enabled/default.conf:1)
port 80 namevhost download.example.com (/etc/apache2/sites-enabled/download.example.com.conf:1)
port 80 namevhost example.com (/etc/apache2/sites-enabled/example.com.conf:1)
alias www.example.com
port 80 namevhost forum.example.com (/etc/apache2/sites-enabled/forum.example.com.conf:1)
port 80 namevhost forumold.example.com (/etc/apache2/sites-enabled/forumold.example.com.conf:1)
port 80 namevhost forumtest.example.com (/etc/apache2/sites-enabled/forumtest.example.com.conf:1)
port 80 namevhost mail.example.com (/etc/apache2/sites-enabled/mail.example.com.conf:1)
port 80 namevhost ro.example.com (/etc/apache2/sites-enabled/ro.example.com.conf:1)
port 80 namevhost server.example.com (/etc/apache2/sites-enabled/server.example.com.conf:1)
port 80 namevhost anotherexample.com (/etc/apache2/sites-enabled/anotherexample.com.conf:1)
alias www.anotherexample.com
ServerRoot: "/etc/apache2"
Main DocumentRoot: "/var/www/html"
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
在基于 debian 的发行版上,默认虚拟主机根本没有指定 ServerName,这实际上意味着它最终以系统主机名作为其 ServerName。
因为它是第一个列出的,所以它将覆盖任何后续的具有相同 ServerName 的虚拟主机。
我建议禁用附带的默认虚拟主机并添加自己的指定服务器名称但不使用您感兴趣的服务器名称的虚拟主机。
答案2
来自 apache-doc:如果未指定 ServerName,则服务器会尝试通过对 IP 地址执行反向查找来推断主机名。如果 ServerName 中未指定端口,则服务器将使用传入请求中的端口。为了获得最佳可靠性和可预测性,您应该使用 ServerName 指令指定明确的主机名和端口。
+
本质上,主服务器被视为构建每个虚拟主机的“默认”或“基础”。但这些主服务器定义在配置文件中的位置基本上无关紧要——当发生最终合并时,主服务器的整个配置都已被解析。因此,即使主服务器定义出现在虚拟主机定义之后,也可能会影响虚拟主机定义。