我有一个运行 Ubuntu 14.04 LTS 最小系统(64 位)的虚拟专用服务器。我已成功安装并设置 Vsftpd,它为我的移动应用程序提供图像(该应用程序使用 Apache Commons FTP 客户端)。大多数时候,它运行正常,应用程序能够下载它请求的每个文件,但有时文件会毫无原因地下载失败。当发生这种情况时,/var/log/vsftpd.log 文件会记录以下条目:
Fri Aug 14 14:31:39 2015 [pid 28594] [ftp] FAIL DOWNLOAD: Client "{Client IP}",
"{image file}", 0.00Kbyte/sec
值得注意的是,客户端 99% 的时间都能成功登录,这似乎是一个可以接受的比率。不过,我估计成功下载率接近 70%,这对于我的需求来说是不可接受的。该应用程序支持多个平台,我在 Mac、iOS 和 Android 上都见过这种情况,所以我怀疑是客户端设备导致了问题。
我已经在互联网上搜索了数周,试图让 Vsftpd 正常工作,但一旦它无法获取文件,它就会在几分钟内一直无法为该特定客户端提供服务,尽管我在应用程序中设置了在文件传输出现错误时断开/重新连接 FTP 客户端的机制。似乎服务器不想在特定时间为该特定设备提供服务。最终,服务器将“克服它”,并允许客户端再次下载图像,就像它应该做的那样。此外,它似乎只会影响单个客户端。例如,我的应用程序的客户端现在无法工作,但你的可以。
这似乎与防火墙有关,所以我去禁用防火墙,结果发现我的服务器没有启用任何防火墙规则,所以我不知道是什么原因导致偶尔的下载失败,因为它们通常完全按照预期工作。具体来说,这是我从 iptables -L 命令获得的输出:
# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:8333
ACCEPT tcp -- anywhere anywhere tcp dpt:ftp-data
ACCEPT tcp -- anywhere anywhere tcp dpt:ftp
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
我的 Vsftpd 设置仅允许匿名客户端通过我设置的密码进行连接。他们只能读取其根目录 /ftp。我打算最终同时为数百或数千个客户端提供服务,因此我将大多数数据/连接限制设置得非常高或设置为无限制。这是我的完整 /etc/vsftpd.conf 文件:
listen=YES
anonymous_enable=YES
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
data_connection_timeout=300
ftpd_banner=You shouldn't be accessing this outside of the app. Logout now or you will be blacklisted.
secure_chroot_dir=/var/run/vsftpd/empty
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
seccomp_sandbox=NO
anon_root=/ftp
anon_max_rate=0
no_anon_password=no
secure_email_list_enable=yes
max_clients=0
pasv_enable=YES
pasv_min_port=1025
pasv_max_port=65000
max_per_ip=100
one_process_model=YES
我在网上看到 PAM 会导致问题,所以我禁用了它,但在禁用之前我仍然遇到同样的问题。不过,它似乎确实有点帮助。值得注意的是,我不知道 PAM 是什么,也不知道它如何帮助/损害这个过程。
问题可能是因为我使用的是虚拟专用服务器而不是实际的物理服务器?我只是不明白在没有防火墙和非常宽松的 Vsftpd 配置的情况下,服务器怎么会如此喜怒无常。任何有关此问题的帮助都将不胜感激。我对 Linux 和网络有相当的了解,但这绝对超出了我的舒适区。如果我忘记了什么,请告诉我。如果这能帮助我解决这个奇怪的问题,我很乐意添加任何内容或尝试您要求的任何内容。提前谢谢!
总结
Vsftpd 大约有 70% 的时间正常工作,但有时它会停止允许某些客户端下载,而不会给出原因。然后它会在几分钟后重新开始工作。整个过程中它为其他客户端提供服务,没有任何问题。请帮忙!
答案1
虽然这在技术上并不能解决我使用 Vsftpd 时遇到的问题,但 Michael Hampton 给了我一些建议,以解决文件传输缓慢、不可靠的根本问题。他建议我使用 HTTP 来提供文件,所以我使用了服务器上已经安装的 Apache2 HTTP 服务器。现在图像可以可靠地获取,我没有看到任何连接或下载问题。此外,我的应用程序现在使用 HTTP 下载图像的速度比使用 FTP 快得多。
长话短说,如果有人在使用 Vsftpd 时看到了这个,我建议你尝试使用 HTTP 服务器,如果你不完全依赖 FTP。HTTP 服务器的设置要容易得多,而且你不需要处理那么多小问题。Michael Hampton 说得完全正确。谢谢你的帮助!