好吧,问题很简单。我有一个基于 Apache 的网站,并尝试从同一台服务器执行此网站的 cron 作业。假设我的网站http://example.com并且 cronjob 是
/usr/bin/curl http://example.com/cron.php
它不起作用,错误是“curl:(7)无法连接到主机”。
为什么会发生这种情况?
PS:该网站运行正常,可从任何其他外部机器/客户端访问。
以下是 iptables -S 的输出
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 2222 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
Ping 失败:(ping example.com)——当然,这里我使用了我的服务器域:
134 packets transmitted, 0 received, 100% packet loss, time 136759ms
详细 curl -v :
* About to connect() to myserver.com port 443 (#0)
* Trying x.x.x.x... Connection timed out
* couldn't connect to host
* Closing connection #0
curl: (7) couldn't connect to host
xxxx是我的主机的外部IP。
traceroute myserver.com 的结果
traceroute to myserver.com (x.x.x.x), 30 hops max, 60 byte packets
1 * * *
2 * * *
3 * * *
4 * * *
5 * * *
6 * * *
7 * * *
8 * * *
9 * * *
10 * * *
11 * * *
12 * * *
13 * * *
14 * * *
15 * * *
16 * * *
17 * * *
18 * * *
19 * * *
20 * * *
21 * * *
22 * * *
23 * * *
24 * * *
25 * * *
26 * * *
27 * * *
28 * * *
29 * * *
30 * * *
答案1
这并不是您当前问题的答案,但它会使整个问题变得毫无意义,因为您无论如何都试图从运行您网站的同一主机触发脚本:
当您需要运行 PHP 脚本时,cron
通常最好从 PHP 命令行界面运行它们,而不是向脚本发出 Web 请求。根据 PHP 二进制文件的位置,将您的批处理作业更改为:
/usr/bin/php -q -f /path/to/cron.php
这允许您:
- 将批处理作业放置在 Web 根目录之外。
- 使用不同于您的 Web 服务器的 UID 的有效 UID 来运行批处理作业。
- 避免 Web 服务器施加的超时(和其他限制)。
- 当您网站的 DNS 名称未指向服务器上的本地 IP 地址时,可避免出现任何问题。
- 避免建立 TCP 和/或 TLS 连接的开销。
和更多。
答案2
仔细查看实际运行的 iptables 配置
ipatables -L -vn
并确保没有任何东西阻塞运行 curl/ping 命令的系统的源 IP - 采取适当的措施。
如果那里什么都没有,那么系统之间的上游可能被阻塞了。由于 ping 被阻止,我想你可以尝试地铁
mtr -4 example.com
它可能会显示某个网站阻止了你。
您确定 example.com 的 IP 地址也是正确的吗?
答案3
我意识到这是一个“发夹 DNS”问题。我猜最好的解决方案是配置 NAT,不要将我自己的外部 IP 的请求快捷方式设置为本地 IP...但我的提供商仍然没有这样做,我暂时通过以下方式修复了它
nano /etc/hosts
添加了一行
y.y.y.y myserver.com
其中 yyyy 是我的本地地址。