FTP: 421 тайм-аут данных на виртуальной машине Azure

У меня есть простой скрипт, который успешно загружает файл размером 75 МБ по FTP:

    try:
    ftp = ftplib.FTP(host)
    ftp.login(username,  password)
    ftp.cwd(source_dir)
except ftplib.all_errors as e:
    print('Ftp error = ', e)
    return False

# Check filename exists
if filename in ftp.nlst():
        local_filename = os.path.join(dest_dir, filename)
        lf = open(local_filename, "wb")
        ftp.retrbinary("RETR " + filename, lf.write)
        lf.close()
        print(filename, ' successfully downloaded')
else:
        print(filename, ' not found in the path ',  source_dir)
ftp.quit()

Этот сценарий отлично работает как на моем домашнем, так и на рабочем ноутбуке при запуске из Spyder IDE или запланированного задания Windows.

Я развернул точно такой же сценарий на виртуальной машине Windows в Azure.

  • Файлы меньше 10 МБ скачиваются нормально.
  • Файлы размером более 30 МБ возвращают исключение: 421 Тайм-аут данных. Переподключиться. Извините.
  • Я получаю около 700 Мбит/с в Azure и только около 8 Мбит/с в своей домашней сети.
  • Похоже на тайм-аут. Я вижу, что файл частично загружен.

Я попытался установить ftp.set_pasv(False), но это возвращает мне 500 недопустимых портов, чего и следовало ожидать. Я понимаю, что пассивный подход в любом случае является предпочтительным.

Что еще я могу сделать, чтобы устранить неполадки и решить эту проблему?


person jakc    schedule 18.07.2019    source источник
comment
Сколько времени должно пройти, прежде чем вы получите исключение? Сколько данных загружается?   -  person Martin Prikryl    schedule 18.07.2019
comment
Отличается, обычно около 15-20Мб загрузок. Получится несколько раз позже.   -  person jakc    schedule 19.07.2019


Ответы (1)


Просто несколько предложений для вас.

  1. Согласно вики-странице для протокола передачи файлов, FTP may run in active or passive mode, как показано на рисунке ниже. В активном режиме клиенту требуется прослушивающий порт для входящих данных с сервера. Однако из-за того, что порт прослушивания клиента для FTP-сервера назначается случайным образом, вы не можете подготовиться заранее, чтобы добавить порт в правила для входящего трафика NSG. Таким образом, вы должны использовать passive mode на стороне клиента на виртуальной машине Azure с FTP.set_pasv(True) или без FTP.set_pasv(False).

    введите здесь описание изображения

    введите здесь описание изображения

  2. Для проблемы 421 Data timeout. Reconnect. Sorry. проверьте настройку времени ожидания на вашем FTP-сервере, например свойство data_connection_timeout файла vsftpd.conf vftp, чтобы установить достаточно большое значение времени ожидания.

  3. Попробуйте установить значение timeout длиннее глобального значения по умолчанию для ftplib.FTP(host='', user='', passwd='', acct='', timeout=None, source_address=None)функция.

    введите здесь описание изображения

  4. Попробуйте использовать функцию FTP.set_debuglevel(level) для отладки вывода подробнее чтобы ваш скрипт выяснил возможную причину.

    введите здесь описание изображения

Надеюсь, поможет.

person Peter Pan    schedule 31.07.2019