JFrog Artifactory отдаёт битые архивы


Допустим у вас установлены Artifactory Version 6.3.3  и nginx version: nginx/1.14.0 на CentOS Linux release 7.5.1804

Доступ к Artifactory организован через nginx reverse proxy, то есть в конфигурации сервера nginx есть примерно такой блок:

    location / {
     proxy_pass         http://127.0.0.1:8081;
     proxy_set_header   X-Forwarded-Host $host;
     proxy_set_header   X-Forwarded-Server $host;
     proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
     port_in_redirect   off;
     proxy_set_header    X-Real-IP $remote_addr;
     }

Репозитарий артифактов настроен, всё отлично работает, пользователи довольны.

Но через какое-то время появляются пара пользователей, которые переодически сообщают о скачивании «битых» архивов или испорченных файлов из Artifactory, при этом у других пользователей теже самые файлы скачиваются без проблем тем же самым браузером

Вы определяете условия повторения скачивания испорченных файлов:

  1. Пользователь подключен к локальной сети на скорости 100 Mbit
  2. Пользователь скачивает файл размеров больше 1 Gbyte
  3. Ваш сервер JFrog Artifactory работает с подключением к сети >= 1 Gbit

Ответ на такое поведение скрывается в описании директивы nginx proxy_max_temp_file_size:

When buffering of responses from the proxied server is enabled, and the whole response does not fit into the buffers set by the proxy_buffer_size and proxy_buffers directives, a part of the response can be saved to a temporary file. This directive sets the maximum size of the temporary file. The size of data written to the temporary file at a time is set by the proxy_temp_file_write_size directive

которая по умолчанию установлена ровно в 1024 Mbyte

Поскольку сервер Artifactory отдаёт данные в 10 раз быстрее чем клиент может их забрать, то nginx использует буфер и временный файл для сохранения потока данных. В описанной ситуации, файлы размером более 1 Gb превышают установленное по умолчанию значение.
Чтобы убрать проблему, можно увеличить установленное значение или отключить ограничение вовсе, установив директиву в значение «0»:

    proxy_max_temp_file_size 0;
    location / {
     proxy_pass         http://127.0.0.1:8081;
     proxy_set_header   X-Forwarded-Host $host;
     proxy_set_header   X-Forwarded-Server $host;
     proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
     port_in_redirect   off;
     proxy_set_header    X-Real-IP $remote_addr;
     }

Источники и дополнительная информация по теме:

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *