☝🏻 Подняться в начало
Фото аватара

NextCloud за обратным прокси

Недавно я развернула NextCloud на своём домашнем сервере syncthing. В процессе возникало множество трудностей, тем не менее большинство из них оказались вполне тривиальны. И вот, настроив, как мне тогда казалось, все правильно — я обнаружила огромную задержку при загрузке файлов на сервер, причем как через веб-клиент, так и через WebDav. Последний вообще возвращал ошибку таймаута при попытке загрузить файл более 30 Мбайт.

После недолгих попыток найти причину, оказалось что все файлы сначала целиком загружаются на прокси, и только после окончания загрузки, начинают загружаться на файловый сервер.

proxy_request_buffering on;
Вот таким образом выглядит загрузка файла на стороне прокси

При стандартных параметрах NextCloud со стороны пользователя это выглядело следующим образом: пользователь начинает загрузку файла на сервер через веб-интерфейс, загружается 10 Мбайт данных, после чего возникает пауза в несколько десятков секунд, а затем загружается еще 10 Мбайт и так по кругу.

На самом же деле, чанк в 10 Мбайт загружался на прокси, после чего прокси инициировал загрузку этого чанка на файловый сервер, файловый сервер получал данные и возвращал ответ на прокси сервер, что данные были получены, тот в свою очередь возвращал этот ответ пользователю, после чего начиналась загрузка следующего чанка.

Изменение размера чанка в NextCloud

Размер чанка для NextCloud’а задаётся через occ. Для этого нужно перейти в корневую директорию некстклауда на вашем сервере, и выполнить следующую команду.

Для apache:

sudo -u apache php occ config:app:set files max_chunk_size --value 20971520

Для nginx:

sudo -u www-data php occ config:app:set files max_chunk_size --value 20971520

Где число после «value» — размер чанка в байтах. В качестве значения по умолчанию используется 10485760, что соответствует 10 Мегабайтам. Для того чтобы отключить дробление файлов достаточно установить данное значение в 0.

Наверное еще стоит упомянуть про ограничения от Cloudflare. Для бесплатного тарифа оно составляет 100 Мбайт на запрос, а для платных 200 и 500 соответственно, что не позволит вам отключить дробление при использовании Cloudflare.

Задержки на прокси

Подобное же поведение происходило и при отключенных чанках. Представим, что пользователь загружает файл размером в 500 Мбайт на сервер. Со стороны пользователя это выглядит так: загрузка файла доходит до 100%, после чего все зависает. На самом же деле, всё происходит следующим образом: 500 Мегабайтный файл целиком загружается на прокси, и только после этого начинается загрузка файла на файловый сервер. Процент загрузки файла в интерфейсе отображает статус загрузки файла до прокси. В итоге «обработка» файла занимает больше времени чем загрузка, поскольку статус о том что файл загружен, сервер отдаст лишь после получения файла с прокси сервера.

Я начала искать решение в интернете, но толком ничего и не смогла найти, и просто стала перебирать все возможные варианты конфигурации nginx.

Как оказалось, для того чтобы пакеты сразу пересылались на ваш сервер, необходимо отключить буферизацию пакетов на стороне прокси сервера. Для этого отредактируйте конфигурационный файл виртуальных хостов вашего nginx, в моем случае это был файл:

/etc/nginx/sites-enabled/default

И добавьте для 80 и 443 порта директиву:

proxy_request_buffering off;

В моем случае это выглядело следующим образом:

location / {
    proxy_pass https://192.168.0.1;
    proxy_buffering off;
    proxy_request_buffering off;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Port $server_port;
}

После внесения этих настроек необходимо перезапустить сервис nginx, и можно наблюдать следующую картину:

proxy_request_buffering off;
Результат proxy_request_buffering off;

Проблема с огромными задержками за реверс прокси решена.