我正在使用Elastic Beanstalk并将我的应用程序部署到Worker Tier。
我的部分应用程序是使用PHP连接到远程ftp并下载远程文件。
它在localhost上没有问题。当我在亚马逊网络服务上执行PHP脚本时,我得到了这个奇怪的错误:
IP1 = XXX.XX.XX.XX
IP2 = XX.XX.XXX.XXX
PHP Error[2]: ftp_get(): I won't open a connection to IP1 (only to IP2)
应用程序在默认VPC上的单个实例(非平衡)上运行。
真正奇怪的是,IP1
与我尝试从中下载文件的主机(即example.com
)不匹配。那可能是互联网网关IP吗?
同样的应用程序还下载图片并连接到API,它肯定连接到互联网。
我假设VPC路由配置不允许实例与目标0.0.0.0/0
(即任何位置)的其他协议通信,但只允许HTTP。
vpc-53cc2236
acl-c850baad
available
Default
172.31.0.0/16
yes
dopt-f2998e90
yes
rtb-2b64914e
EC2实例属于 subnet-1250b265:
rtb-2b64914e
Destination:
172.31.0.0/16 target:
local Destination:
0.0.0.0/0 target:
igw-a48199c6 路线表 rtb-2b64914e :
Destination | Target | Status | Propagated
172.31.0.0/16 | local | Active | No
0.0.0.0/0 | igw-a48199c6 | Active |No
还有另外两个子网subnet-ab0003ed
和subnet-96f335f3
与subnet-1250b265
属于同一路由表。
答案 0 :(得分:1)
我遇到了同样的问题,并使用被动模式解决了这个问题。
ftp> pass
Passive mode on.
在ruby中,代码最终成为:
Net::FTP.open(host) do |ftp|
ftp.login(user, pwd)
ftp.passive = true
ftp.put(output_filename, "#{target_dir]}/#{target_filename}")
end
答案 1 :(得分:1)
有些人建议防火墙可能会阻止对FTP的访问。对我来说情况并非如此,正确的港口是开放的。
我尝试了ftp_connect,ftp_get但没有用(尝试打开/关闭PASV)。
我试图卷曲ftp下载文件,但得到了No Route to Host
错误。
然后,我尝试使用php卷曲ftp下载文件,但我只有一个空文件。
由于我有SSH访问服务器的权限,我试图使用SCP获取文件,但是出现了一个奇怪的错误Warning: ssh2_scp_recv(): Unable to receive remote file
。
我还发现了PHP patch for this,但不想在AWS上修补PHP版本。
我最终使用了phpseclib,效果很好 - 没有麻烦。