Azure App Service中PHP函数ftp_connect()无法使用的求助
解决Azure App Service中PHP FTP连接无响应/被拒绝的问题
问题根源
Azure App Service的沙盒环境默认限制主动模式的FTP(21端口)出站连接,这就是你本地能正常连接,但Azure端无论是PHP代码还是Kudu控制台都失败的核心原因:主动模式需要FTP服务器主动发起入站连接,会被沙盒拦截;而被动模式的连接是允许的。
具体解决方案
1. 切换为被动模式连接FTP
修改PHP代码,在ftp_connect后启用被动模式,这是最直接的解决办法:
$ftpServer = 'ftp.xxx.com'; $ftpUser = 'your-ftp-username'; $ftpPass = 'your-ftp-password'; // 建立连接 $ftpConn = ftp_connect($ftpServer); if (!$ftpConn) { die("无法连接到FTP服务器"); } // 启用被动模式(关键步骤) ftp_pasv($ftpConn, true); // 登录FTP服务器 $loginStatus = ftp_login($ftpConn, $ftpUser, $ftpPass); if (!$loginStatus) { die("FTP登录失败"); } // 后续执行FTP操作,比如上传/下载 // ftp_put(...) 或 ftp_get(...) // 关闭连接 ftp_close($ftpConn);
2. 验证PHP FTP扩展是否启用
Azure的PHP环境可能未默认开启FTP扩展,检查方法:
- 进入Kudu控制台(访问
https://<你的应用名称>.scm.azurewebsites.net) - 新建或打开
phpinfo.php文件,写入内容:<?php phpinfo(); ?> - 访问该文件,搜索「ftp」关键词,确认
ftp扩展已加载 - 若未启用,可在App Service的「配置」→「常规设置」中,确保对应PHP版本的FTP扩展已勾选;或在项目根目录添加
.user.ini文件,写入extension=ftp
3. 检查App Service网络配置
- 公网FTP服务器:确认App Service没有配置出站IP限制:
- 登录Azure门户,进入你的App Service
- 左侧菜单选择「网络」→「出站流量限制」
- 确保没有规则阻止目标FTP服务器IP或21端口的出站流量
- 内网FTP服务器:需要将App Service配置为VNet集成,才能访问内部网络资源,具体操作可在Azure门户的「网络」→「VNet集成」中设置
4. 白名单Azure出站IP到FTP服务器
目标FTP服务器的防火墙可能拦截了Azure的出站IP,解决步骤:
- 在Azure门户的App Service「概述」页面,复制「出站IP地址」列表
- 将这些IP添加到FTP服务器的防火墙白名单中
关于Kudu控制台的ftp命令
Kudu环境同样受App Service沙盒限制,ftp命令返回「Access is denied」是正常现象,无需纠结,只要PHP代码用被动模式能正常连接,就说明问题已解决。
内容的提问来源于stack exchange,提问作者Muhammad Mubashir
相关产品推荐
相关产品推荐

