【问题标题】:Can't resolve domain names in php under apacheapache下无法解析php中的域名
【发布时间】:2014-07-14 03:00:13
【问题描述】:

我对此一无所知。我在我的服务器(一个亚马逊 ec2 实例)上运行 apache,我似乎无法解析 php.ini 中的域名。例如 fopen('http://www.google.com', 'r') 将抛出“php_network_getaddresses: getaddrinfo failed: Name or service not known”,但如果我将 url 更改为 google 的 IP 地址之一,它将正常工作。在远程服务器上 Ping www.google.com 也可以正常工作,所以我知道“外部系统”没有问题。

奇怪的是,我已经让这台服务器启动并运行了一段时间,没有任何问题,我想不出我所做的任何事情都可能导致这种情况。

在我的 php.ini 中,我有 allow_url_fopen = On 并且为了确保它被应用,我从有这个问题的同一个脚本运行 phpinfo() 并且 allow_url_fopen 实际上是打开的。

还有什么我应该尝试的想法吗?某种文件权限问题会导致这种情况吗?因为我确实在我的 webapp 中更改了一些文件权限,并且我想可能是我输入了错误的内容并意外更改了应用程序外部某些文件的权限/所有权。它极不可能,但我想不出我在系统上所做的任何其他事情可能会阻止它工作。

【问题讨论】:

  • 如果我从服务器上的命令行运行 php 脚本域名解析很好,所以我猜它与 apache 有关系?
  • 我在网上发现了一堆有同样问题的人的帖子。对于他们中的大多数人来说,重新启动服务器可以解决它,但对我来说不是。对于其他人来说,这是一个权限问题,但我确保 /etc/resolv.conf 对每个人都有读取权限,并且无论如何我都以 root 身份运行 Apache...
  • Apache 或内核日志中是否有任何内容?或者,作为一种解决方法,您可以使用 net_dns2PHPDNS 进行自己的 DNS 查找。
  • SELinux 政策怎么样? setsebool -P nis_enabled 1, setsebool -P httpd_can_network_connect 1.

标签: php linux apache dns


【解决方案1】:

我在开发中遇到了同样的问题,只发生在apache下执行php,但是直接用php,就可以了!

php filetest.php

然后我检查了我的 apache 状态,并在日志中看到了这个:

Mar 12 13:01:08 arch-linux apachectl[6847]: AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::6aa3:c4ff:fe...is message

经过一番搜索,我找到了它:

http://tutorialforlinux.blogspot.com.br/2013/10/solve-problem-ah00558-when-restarting.html

这是准确的问题,然后我在我的 httpd.conf 中更改了这个:

#ServerName www.example.com:80

到这里:

ServerName localhost

成功了,现在我可以在apache下解析php中的dns了。

抱歉我的英语不好,我想详细说明一下。

【讨论】:

    【解决方案2】:

    我遇到了同样的问题。

    httpd restart 主机解决问题后继续。 但是 httpd stop & start 解决了我的问题。

    【讨论】:

    • 谢谢,这也为我解决了一个问题。 service https graceful 没有帮助,但停止和开始就可以了。有谁知道这是为什么?
    【解决方案3】:

    (对不起,我没有足够的声望来添加 cmets)。在我看来,这可能与在 chrooted 环境中运行 Apache 有关。

    【讨论】:

      【解决方案4】:

      如果您有权限,请尝试将 /etc/resolv.conf 文件中的名称服务器更改为其他名称服务器。可能是你的 dns 缓存太旧了,

      或尝试通过在终端中运行以下命令来更改 SE Linux 策略:

      setsebool -P nis_enabled 1
      setsebool -P httpd_can_network_connect 1
      

      【讨论】:

        【解决方案5】:

        你确定是因为 Apache 吗?我要做的第一步是在终端中运行以下脚本。您应该会看到打印出的所有 HTML 文本:

        <?php
        $handle = @fopen("http://www.google.com", "r");
        if ($handle) {
            while (($buffer = fgets($handle, 4096)) !== false) {
                echo $buffer;
            }
            if (!feof($handle)) {
                echo "Error: unexpected fgets() fail\n";
            }
            fclose($handle);
        }
        

        如果这不起作用,下一步是检查您的 DNS 解析器是否正常工作。输出是什么

        host www.google.com
        

        做完这两个测试后,我们就可以决定往哪个方向前进了。

        【讨论】:

        • 谢谢,我已经进行了等效测试。从命令行运行带有 fopen 的 php 脚本可以正常工作。通过 apache 运行相同的脚本将失败,并显示“php_network_getaddresses: getaddrinfo failed: Name or service not known”
        • 尝试更改为 cUrl。 getaddrinfo 的一些实现被破坏了。
        【解决方案6】:

        你可以尝试使用file_get_contents:

        file_get_contents('http://www.google.com');
        

        fopenfile_get_contents 几乎等效,但并不总是在服务器上的相同配置下工作。

        【讨论】:

        • 谢谢,但它不是我想要开始工作的应用程序。 phpmyadmin、adminer、sqlbuddy 或任何 mysql 管理程序都无法访问我尝试连接的远程数据库。
        猜你喜欢
        • 1970-01-01
        • 2021-03-24
        • 2020-07-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-08
        • 1970-01-01
        相关资源
        最近更新 更多