nginx 和 php | 无法解析主机名并与 FQDN 建立连接

nginx 和 php | 无法解析主机名并与 FQDN 建立连接

我不知道是什么原因导致了这个问题,nginx 配置还是 php 还是其他什么,但是:

我无法建立连接主机值下面列出的这些 php 函数设置为完整限定域名 (FQDN)喜欢http://www.domain.com或 www.domain.com问题全部消失如果我输入主机名 ip 例如192.2.8.1

例如:@fsockopen($host, $port, $errno, $errstr, 10) 
    无法建立连接当 $host = "www.somedomain.com"
    当 $host = "192.2.2.1" 时成功连接

列出的函数迄今为止都存在同样的问题

  • @fsockopen
  • @file_get_contents
  • 当主机为“www.somedomain.com”时,phpmailer 无法通过 SMTP 发送电子邮件,但当主机为“192.2.2.1”时可以成功发送邮件

在我将 FQDN 指向我的服务器之前,所有这些都运行良好,当我进行测试时,
所有这些都适用于运行 wammp 服务器的我的电脑上的 ip 和域,并且在同一个应用程序上,在同一个代码上,

我不是 100% 确定,但我猜这个问题是在我将我的域和 DNS 指向服务器后出现的?!

笔记 :此案例与服务器配置有关,我提供了 php 参考资料以更好地描述此案例

“反对者现在可以放心了,我已经彻底改变了描述”。

答案1

好的!经过一周的努力,终于解决了这个问题:

首先,这似乎是一个百年来非常流行的问题!

https://bugs.php.net/bug.php?id=11058
https://www.google.com/search?hl=es&ie=UTF-8&oe=UTF-8&q=php+php_network_getaddresses%3A+getaddrinfo+failed&meta=&gws_rd=ssl

一些人已经找到了自己的单独解决方案,但这肯定不是 PHP 错误。

本期内容涵盖:

  • 如果你无法连接@fsockopen
  • 如果不能满足于@file_get_contents
  • 如果你的 php 脚本无法发送电子邮件或连接到SMTP 服务器
  • 如果你无法 ping 你的域名或找不到 ping:不存在的域
  • 如果你不能敲你的服务器ip和获取getaddrinfo() 失败
  • 如果你有问题php_network_getaddresses直接地
  • 如果你的Wordpress抛出错误无法连接到 tcp://mydomain.com:80。错误 #0:php_network_getaddresses:getaddrinfo 失败:未知此主机。

--可能导致这些问题的事情--------------------------------------------------

[X]

首先要检查的是php.ini并确保这些属性已启用

allow_url_fopen = On
allow_url_include = On


[X]

创建 phpinfo() 文件[phpinfofile.com 万一] 并检查这些扩展是否已启用

OpenSSL
插座

特别是对于运行 xammp 或 wammp 的 Windows 用户,通过禁用 PHP_OpenSSL 扩展,您可能无法通过 @fsockopen 进行连接



[X]

现在最重要的部分是解析配置文件 通过运行打开 resolv.conf

sudo nano /etc/resolv.conf
  1. 删除注释,如果开头有注释行,则将其完全删除
  2. 更改名称服务器,即使它们没有问题,也只需更改它们的顺序,这有助于清除 DNS 缓存(如果有旧缓存)



[X]

强烈建议您/etc/resolv.conf 不是符号链接指向一些目录,通常在/run/resolvconf/或等等..你可以运行

ls -la /etc/resolv.conf
看看结果是什么,如果它是这样的

-rw-r----- 1 根 根 ` ` /etc/resolv.conf --------> /run/resolvconf/resolv.conf

如果您有 ftp 访问权限,请下载 /etc/resolv.conf,然后将服务器上的当前文件重命名为 /etc/resolv.conf-----bk(仅用于备份),然后将您从系统下载的文件上传到服务器 /etc/,

或者,如果您无权访问 ftp,请运行以下命令

sudo cp /etc/resolv.conf /etc/resolv.conf.bak
sudo rm /etc/resolv.conf
sudo nano /etc/resolv.conf
将您的名称服务器放在新文件中

前任:
名称服务器 8.8.8.8
名称服务器 8.8.4.4

然后按 Ctr + X 保存,然后输入“Y”并按回车键
chmod a+r /etc/resolv.conf

在这种情况下,我的问题是!

[X]

确保所有用户都可以访问你的 reslv.conf

chmod a+r /etc/resolv.conf


结果应该是

-rw-r--r-- 1 根 根<size> <date> 
跑步后ls -la /etc/resolv.conf

[X]

下一轮

sudo nano /etc/network/interfaces

找出dns 域名服务器并确保名称服务器看起来不错(最好将 /etc/resolv.conf 文件中的名称服务器放进去 - 例如:dns 名称服务器 8.8.8.8 8.8.4.4



这就是我目前对这个问题所发现的全部内容,我试图让任何人都能理解,很抱歉打扰你对你所熟知的事情的提及,
如果其他人对这个问题有更多的了解,请分享。

答案2

Nginx 不使用系统的解析器。您必须使用指令定义解析器resolver

配置用于将上游服务器的名称解析为地址的名称服务器,例如:

resolver 8.8.8.8 valid=30s;

来源:http://nginx.org/en/docs/http/ngx_http_core_module.html#resolver

答案3

由于您提供的信息量太大,很难帮助您,但我会首先检查/etc/resolv.conf并检查每一个nameserver是否正常工作:

[alexus@wcmisdlin02 ~]$ cat /etc/resolv.conf 
search XXX.XXX
nameserver XX.XX.XX.XX
nameserver XX.XX.XX.XX
[alexus@wcmisdlin02 ~]$ 

您可以使用dighostnslookup

相关内容