![nginx 和 php | 无法解析主机名并与 FQDN 建立连接](https://linux22.com/image/637409/nginx%20%E5%92%8C%20php%20%7C%20%E6%97%A0%E6%B3%95%E8%A7%A3%E6%9E%90%E4%B8%BB%E6%9C%BA%E5%90%8D%E5%B9%B6%E4%B8%8E%20FQDN%20%E5%BB%BA%E7%AB%8B%E8%BF%9E%E6%8E%A5.png)
我不知道是什么原因导致了这个问题,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
- 删除注释,如果开头有注释行,则将其完全删除
- 更改名称服务器,即使它们没有问题,也只需更改它们的顺序,这有助于清除 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 ~]$
您可以使用dig
、host
和nslookup
。