ftp_connect()本地正常运行,部署到Web服务器后无法连接求助
问题描述
我编写了以下PHP FTP连接代码:
<?php //user and pass $ftp_username = "user"; $ftp_userpass = "pass"; // connect and login to FTP server $ftp_server = "server_addr"; $ftp_conn = ftp_connect($ftp_server) or die("Could not connect to {$ftp_server} from {$_SERVER['HTTP_HOST']}"); $login = ftp_login($ftp_conn, $ftp_username, $ftp_userpass); // then do something... echo $login; // close connection ftp_close($ftp_conn); ?>
本地运行时能正常连接群晖DS220j的FTP服务器并返回1,但部署到Web服务器后,页面提示Could not connect to xxx.xxx.xxx.xxx from mysite.co.uk。已排查:Web服务器IP不在NAS黑名单中,且已将Web服务器的域名和IP加入NAS白名单,问题仍未解决。
可能的解决方案
- 检查FTP端口连通性:群晖默认FTP端口是21,被动模式下还有默认端口范围55536-56559。在Web服务器上用
telnet xxx.xxx.xxx.xxx 21或nc -zv xxx.xxx.xxx.xxx 21测试21端口是否能连通;如果用被动模式,还要确认该端口范围在NAS防火墙、路由器端口转发中都已放行(可在群晖控制面板>文件服务>FTP>高级设置查看/修改被动端口范围)。 - 切换为被动模式连接:
ftp_connect默认用主动模式,部分Web服务器环境会限制主动模式的出站连接。在登录后添加被动模式启用代码:
$login = ftp_login($ftp_conn, $ftp_username, $ftp_userpass); ftp_pasv($ftp_conn, true); // 启用被动模式
- 检查群晖FTP权限细节:
- 进入群晖
控制面板>用户和群组>用户,找到FTP对应的用户,确认应用程序权限>FTP已开启; - 进入
控制面板>文件服务>FTP>权限设置,查看是否开启了仅允许安全连接,如果是,需要改用ftp_ssl_connect()替代ftp_connect()。
- 进入群晖
- 确认Web服务器真实出站IP:部分云服务器或共享主机的出站IP和你以为的服务器IP不一致,在Web服务器上执行
curl ifconfig.me获取真实出站IP,将该IP加入NAS白名单。 - 查看群晖防火墙日志:进入群晖
控制面板>安全性>防火墙>日志,检查是否有Web服务器IP被拦截的记录——即使不在黑名单,防火墙的其他规则也可能导致拦截。 - 排查网络路由问题:在Web服务器上执行
traceroute xxx.xxx.xxx.xxx(Linux)或tracert xxx.xxx.xxx.xxx(Windows),查看网络链路是否有中断节点,确认是否是路由阻断导致无法连接。
内容的提问来源于stack exchange,提问作者Drew Burston
相关产品推荐
相关产品推荐

