亚马逊网络服务PHP FTP获取

时间:2014-07-03 13:54:34

标签: php amazon-web-services amazon-ec2 ftp

我正在使用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 ID:vpc-53cc2236
  • 网络ACL:acl-c850baad
  • 州:available
  • 租约:Default
  • VPC CIDR:172.31.0.0/16
  • DNS解析:yes
  • 设置了DHCP选项:dopt-f2998e90
  • DNS主机名: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-ab0003edsubnet-96f335f3subnet-1250b265属于同一路由表。

2 个答案:

答案 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,效果很好 - 没有麻烦。

相关问题