Apache - 如果没有互联网连接,服务器将无法通过 /etc/hosts 进行解析

Apache - 如果没有互联网连接,服务器将无法通过 /etc/hosts 进行解析

我已经在本地机器(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.devresources.dev网站都是我创建的,并且之前的设置都是默认的。

对于localhostagroplasticos.devresources.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浏览器,然后检索图像。

然而问题来了,网站已成功安装如果有网络连接。如果我没有连接,那么:

  1. 访问http://localhost/(出现示例的、从未修改的“它有效”屏幕)。
  2. 不能访问http://resources.dev/(服务器没有安装它;http 客户端(例如浏览器或 ActionScript 加载器)无法访问这样的 URL)。
  3. 不能访问http://agroplasticos.dev/(服务器没有安装它;http 客户端也是一样)。
  4. 运行时我收到此错误日志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: 行指定尝试各种名称解析服务的顺序。默认为:

  1. 首先检查 /etc/hosts 文件。如果该文件提供了相关主机名的 IP 地址,则使用该地址。

  2. 否则,请尝试 mdns4_minimal,只有当名称以 .local 结尾时,它才会尝试通过多播 DNS 解析名称。如果确实如此,但没有找到这样的 mDNS 主机,则 mdns4_minimal 将返回 NOTFOUND。对 NOTFOUND 的默认名称服务切换响应是尝试下一个列出的服务,但 [NOTFOUND=return] 条目会覆盖该响应并停止搜索,名称未解析。

  3. 然后尝试指定的 DNS 服务器。如果名称不是以 .local 结尾,则此操作几乎会立即发生,如果以 .local 结尾,则根本不会发生。如果删除 [NOTFOUND=return] 条目,nsswitch 将尝试通过单播 DNS 查找未解析的 .local 主机。这通常是一件坏事,因为它会向永远无法解析它们的 Internet DNS 服务器发送许多此类请求。显然,这种情况经常发生。

  4. 最后的 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,因为它更受欢迎且更容易完成此操作。

相关内容