Nextcloud で大容量ファイルを扱ってみた

## はじめに
Nextcloudは、自前のサーバを使って手軽にセキュアなファイル共有環境を実現できるオンラインストレージです。
今回は、特に1つのサイズがとても大きいファイルとして、1ファイル 300Gbyte(=300×1024×1024×1024byte) のファイルのアップロード/ダウンロードが可能かどうかを試してみました。

## 前提条件
* 一般的な運用を想定し、 HTTPS で問題なくアクセスできる環境を準備します。
* Nextcloud は、Web、データベース等必要なものすべてを包含したオールインワン環境で準備します。

## 評価した環境
### ■サーバーインフラ
* AWS EC2
    * CentOS 7
    * インスタンスタイプ: t3.large (2コア、メモリ8Gbyte)
* AWS EBS
    * SSD(gp2) 1Tbyte
* AWS 東京リージョンを利用

### ■ミドルウェア等
* Nextcloud 16.0.3
* Nginx 1.16 (Webサーバ) 
* PHP 7.3
* MariaDB 10.3 (データベースサーバ)
* Redis 5.0 (セッションサーバ)
* Let's Encrypt (サーバ証明書)

### ■クライアント (Webブラウザ)
* Firefox Quantum 68

### ■WAN
* UCOM光 (最大 1Gbps)

## 検証の成果
### ■300Gbyte ファイルのアップロード
※アップロード中・・・![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/06f539e9-4c38-6436-0a76-d3b943ef1860.png)
↓↓↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/72bbf17d-8581-f102-81d8-21e609a8cfcb.png)

**成功しました！**

### ■300Gbyte ファイルのダウンロード
※ダウンロード中・・・![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/55168e9c-99f1-7896-1119-1a54d7b13094.png)
↓↓↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/68449905-3046-0b61-ccfb-0215baa018cc.png)

**成功しました！**

## 設定のポイント
Nextcloudにおける大容量ファイルの処理については、ファイルそのもののアップロード/ダウンロードに時間がかかるのはもちろん、ファイルアップロード後の Nextcloud 内部処理に結構時間を要します。

| ※補足：Nextcloud における大容量ファイルアップロードの仕組み |
|---|
|Nextcloud で大容量ファイルをアップロードする際には、ファイルを 10Mbyte(=10×1024×1024byte) 単位に分割してアップロードし、すべてのファイルがアップロードされた後、Nextcloud 内部で分割されたファイルを結合し、通常の保管ディレクトリにファイルを設置する動きをします。<br>このため、Nextcloud のファイル保管先のディスクは、**目安とする最大アップロードファイルサイズと同じだけの空き領域**を常に確保しておく必要があります。|

サーバスペックや低IOPSのディスクを使っている場合にはこの時間がかなりかかりますので、検証しながら諸パラメータを見直していく必要があります。
利用される環境 (サーバー、ネットワーク) にもよりますが、今回は成功させるにあたり以下のパラメータを見直しております。

* **Nextcloud**
    * `filelocking.ttl`
        * [Configuration Parameters](https://docs.nextcloud.com/server/16/admin_manual/configuration_server/config_sample_php_parameters.html)
        * Nextcloud で取り扱うファイルロックの生存時間となります。デフォルトで3600秒(=1時間) ですが、今回の検証では ファイルアップロード後の内部処理だけで1時間20分ほどかかり、処理中にファイルロックが更新されてしまったため、設定の見直しを行いました。

* **Nginx**
    * `fastcgi_read_timeout`
        * [Module ngx_http_fastcgi_module - fastcgi_read_timeout](http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_read_timeout)
        * Nginx から PHP-FPM への要求に対する PHP-FPM の応答待ち時間。どれだけ待つか。

* **PHP**
    * `max_execution_time`
        * [PHP - 実行時設定 - max_execution_time](https://www.php.net/manual/ja/info.configuration.php#ini.max-execution-time)
        * PHP の実行時間の上限。どれだけ待つか。
        * 問題なければ「いつまでも待ってる」 `0` を設定してもいい。

* **PHP-FPM**
    * `request_terminate_timeout`
        * [php-fpm.conf のグローバル設定項目](https://www.php.net/manual/ja/install.fpm.configuration.php)
        * `php.ini` の実行タイムアウト(=`max_execution_time`) がうまく動かないときには、このタイムアウト設定で PHP-FPMのプロセスを強制的に落とす。
        * 問題なければ「いつまでも待ってる」 `0` を設定してもいい。

## あとがき
今回の検証結果を受け、 Nextcloud ではとても柔軟にファイルを取り扱うことができるように設計されていることが確認できました。
昨今は1つのファイルのサイズがとても大きいものを扱う必要がある要件が増えてきておりますが、 Nextcloud の提案の幅を広げることができることが大きな収穫です。

※今回のように「1Tbyte ディスクを持つサーバ立ててちょっと試したいな～」ってときにサクッと環境が準備できるので、 AWS には本当にお世話になっております。

**★この記事は、[スタイルズ社のNextcloudサイト](https://nextcloud.stylez.co.jp/) の [Nextcloudブログ](https://nextcloud.stylez.co.jp/nextcloudblog)にも公開しております！**