我已经在本地机器(Ubuntu 13.10)中的当前 apache2 服务器中配置了许多虚拟主机。
这些是不同的本地站点,其域名设置在我的/etc/hosts
:
127.0.0.1 localhost
127.0.0.1 agroplasticos.dev
127.0.0.1 resources.dev
127.0.1.1 luismasuelli-inspiron14
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
其中agroplasticos.dev
和resources.dev
网站都是我创建的,并且之前的设置都是默认的。
对于localhost
、agroplasticos.dev
和resources.dev
,我在目录中有站点条目/etc/apache2/sites-enabled
(此目录中仅存在这 3 个条目),它们是指向 中相应文件的链接/etc/apache2/sites-available
:
agroplasticos.dev
好像:
<VirtualHost agroplasticos.dev:80>
ServerName agroplasticos.dev:80
ServerAdmin webmaster@localhost
DocumentRoot /var/www/agroplasticos
<Directory /var/www/agroplasticos>
Options Indexes FollowSymLinks MultiViews
AllowOverride all
Order allow,deny
allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/agroplasticos-error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/agroplasticos-access.log combined
</VirtualHost>
看起来resources.dev
像:
<VirtualHost resources.dev:80>
ServerName resources.dev:80
ServerAdmin webmaster@localhost
DocumentRoot /var/www/resources
<Directory /var/www/resources>
Options Indexes FollowSymLinks MultiViews
AllowOverride all
Order allow,deny
allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/resources-error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/resources-access.log combined
</VirtualHost>
最后但同样重要的localhost
一点是,如下所示:
<VirtualHost localhost:80>
ServerName localhost:80
ServerAdmin webmaster@localhost
DocumentRoot /var/www
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/>
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}/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
我期望如果我访问这些域名,它们将被解析为 127.0.0.1,并且它们由 apache 使用每个站点的不同设置提供服务。具体来说,resources.dev
这只是一个静态文件网站(它只有我通过 http 从我制作的程序/脚本外部加载的图像),所以我甚至不关心这样的网站是否使用 PHP。这意味着:我点击http://resources.dev/mirrorlings/images/sample.png
浏览器,然后检索图像。
然而问题来了,网站已成功安装如果有网络连接。如果我没有连接,那么:
- 我能访问
http://localhost/
(出现示例的、从未修改的“它有效”屏幕)。 - 我不能访问
http://resources.dev/
(服务器没有安装它;http 客户端(例如浏览器或 ActionScript 加载器)无法访问这样的 URL)。 - 我不能访问
http://agroplasticos.dev/
(服务器没有安装它;http 客户端也是一样)。 运行时我收到此错误日志
sudo service apache2 restart
:[Sun Jul 20 15:39:55 2014] [error] (111)Connection refused: Could not resolve host name localhost -- ignoring! [Sun Jul 20 15:39:55 2014] [error] (111)Connection refused: Could not resolve host name agroplasticos.dev -- ignoring! [Sun Jul 20 15:39:55 2014] [warn] The Alias directive in /etc/apache2/conf.d/phpmyadmin.conf at line 3 will probably never match because it overlaps an earlier Alias. [Sun Jul 20 15:39:55 2014] [error] (111)Connection refused: Could not resolve host name agroplasticos.dev -- ignoring! [Sun Jul 20 15:39:55 2014] [error] (111)Connection refused: Could not resolve host name localhost -- ignoring! [Sun Jul 20 15:39:55 2014] [error] (111)Connection refused: Could not resolve host name resources.dev -- ignoring! apache2: apr_sockaddr_info_get() failed for luismasuelli-inspiron14 apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName [Sun Jul 20 15:39:56 2014] [error] (111)Connection refused: Could not resolve host name localhost -- ignoring! [Sun Jul 20 15:39:56 2014] [error] (111)Connection refused: Could not resolve host name agroplasticos.dev -- ignoring! [Sun Jul 20 15:39:56 2014] [warn] The Alias directive in /etc/apache2/conf.d/phpmyadmin.conf at line 3 will probably never match because it overlaps an earlier Alias. [Sun Jul 20 15:39:56 2014] [error] (111)Connection refused: Could not resolve host name agroplasticos.dev -- ignoring! [Sun Jul 20 15:39:56 2014] [error] (111)Connection refused: Could not resolve host name localhost -- ignoring! [Sun Jul 20 15:39:56 2014] [error] (111)Connection refused: Could not resolve host name resources.dev -- ignoring! apache2: apr_sockaddr_info_get() failed for luismasuelli-inspiron14 apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
也不明白为什么这个日志会出现两次。你可以看到相同的行块重复出现,但延迟了一秒。
我的问题:既然我想要的是让 Apache 解析这些虚假域名为本地,为什么还需要网络连接/etc/hosts
?我必须配置什么才能允许本地、无网络解析?
我尝试在没有互联网连接的情况下进行开发,并且无法使用本/etc/hosts
地域解析到本地(环回)IP 地址来访问我的本地服务器。
答案1
看起来您的 resolv.conf 设置导致您的 hosts 文件被忽略。
最近的 ubuntu 使用 resolveconf 来管理 resolv.conf,因为它更适合处理存在多个连接的场景。
常规 resolvconf 文档 http://manpages.ubuntu.com/manpages/trusty/man8/resolvconf.8.html
使用此处接受的答案中的技术来重新生成 resolv.conf 设置 更改 /etc/network/interfaces 后,如何让 resolvconf 重新生成 resolv.conf?
答案2
还有一件事需要注意—— /etc/nsswitch.conf
。您可以指定主机名查找的优先级。我的 nsswitch.conf 文件中有以下行:
hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4
解释如下:
hosts: 行指定尝试各种名称解析服务的顺序。默认为:
首先检查 /etc/hosts 文件。如果该文件提供了相关主机名的 IP 地址,则使用该地址。
否则,请尝试 mdns4_minimal,只有当名称以 .local 结尾时,它才会尝试通过多播 DNS 解析名称。如果确实如此,但没有找到这样的 mDNS 主机,则 mdns4_minimal 将返回 NOTFOUND。对 NOTFOUND 的默认名称服务切换响应是尝试下一个列出的服务,但 [NOTFOUND=return] 条目会覆盖该响应并停止搜索,名称未解析。
然后尝试指定的 DNS 服务器。如果名称不是以 .local 结尾,则此操作几乎会立即发生,如果以 .local 结尾,则根本不会发生。如果删除 [NOTFOUND=return] 条目,nsswitch 将尝试通过单播 DNS 查找未解析的 .local 主机。这通常是一件坏事,因为它会向永远无法解析它们的 Internet DNS 服务器发送许多此类请求。显然,这种情况经常发生。
最后的 mdns4 条目表示,如果您指定的 DNS 服务器无法解析不以 .local 结尾的名称,则将尝试使用 mDNS。我认为这是为了在您未指定 .local TLD 时捕获 mDNS 主机,但我刚刚尝试过,它不起作用。我想我会研究一下。
来源:http://ubuntuforums.org/showthread.php?t=971693
通过更改此行中的顺序,您可以更改主机名解析的顺序。这也许可以解释 localhost 无法解析的事实。
答案3
您必须编辑 /etc/apache2/apache2.conf 文件并在全局配置部分添加您的域。
答案4
您的 Apache 配置看起来不错。如果您有互联网连接,这些将作为后备方案正常工作。
但你缺少的是本地 DNS 解析器,它可以将你的请求传输到本地服务器,而不是在全球互联网 DNS 上解析。有一个名为的迷你 DNS 服务器DNSMASQ。
您可以将其配置为将所有 .dev 域解析到您的环回地址,而无需咨询互联网的 DNS 服务器。
sudo apt-get install dnsmasq
您可以通过查看其文档找到必要的配置。
您还可以通过 PAC 文件实现此目的。不过我建议您坚持使用 dnsmasq,因为它更受欢迎且更容易完成此操作。