- Docker 内の Nextcloud のアップロード上限の設定
- Docker 内の Nginx (リバースプロキシ)のタイムアウト・クライアント側の body 上限の設定
- 7-zip による zip ファイルの文字化け対策
Nextcloud に限らず、ネットワークドライブに容量が小さくても大量のファイルを転送するととんでもない時間がかかることがあります。ディスク速度や CPU 速度も関係するのですが、そもそも同様の現象はネットワークドライブに限らず、通常の HDD や SSD でも同様です。
対策は圧縮すること、もっと言えば、圧縮しなくてもアーカイブにして一つのファイルにまとめてしまうだけで、回線の実効速度をほぼそのまま生かした転送が可能です。
ファイル単位での転送で生じるオーバーヘッドをなくすことができるからです。
通常のクラウドではアーカイブのまま保存するしかない(仮想ファイルシステムなどで展開しても、結局1ファイルずつ転送することになる)ですが、 Nextcloud では Extract アプリによってクラウド上で展開できます。従って、「使うかもしれないから圧縮したまま保存しときたくはない、でもローカルにダウンロードしたくもない」といった用途にぴったりです。
ただ、楽介のように Docker で Nextcloud を構築している場合、少し大きめのファイルを転送しようとすると、Web 画面では不明なエラー、 WebDAV では転送に成功したように見えるのに実際には保存されていない……という現象が発生します。
これには、 PHP や リバースプロキシの設定が影響しているので対処します。
さらに、 Windows で zip ファイルを作成し、 Nextcloud 上で展開するとファイル名が文字化けしてしまう現象の対処法もご紹介します。
Nextcloud Image の PHP 環境設定を変更する
Nextcloud は PHP で動作しているため(WebDAV部分も)、 PHP のファイルアップロード上限設定の影響を受けます。通常、この上限設定は PHP.ini で設定します。しかし、 Docker でインストールしている場合、 PHP.ini を編集するのは少し面倒です。
幸い、 Nextcloud 公式の Docker Image を利用している場合、Docker に与える環境変数から PHP.ini の値を設定できます。
version: '2'
volumes:
nextcloud:
db:
services:
db:
image: mariadb:10.5
restart: always
command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
volumes:
- /home/pi/nextcloud/db:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=
- MYSQL_PASSWORD=
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
app:
image: nextcloud
restart: always
ports:
- 8080:80
links:
- db
volumes:
- /home/pi/nextcloud/nextcloud:/var/www/html
environment:
- MYSQL_PASSWORD=
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
- MYSQL_HOST=db
- PHP_MEMORY_LIMIT = 2048M
- PHP_UPLOAD_LIMIT = 10240M
Nextcloud の docker-compose.yml を上記のように書き換えます。末尾2行を追記しました。
必要があるかはわかりませんが、 PHP の使用可能メモリを 2GBに( Raspberry Pi 4B のメモリ4GBモデル)し、アップロードの上限ファイルサイズを10GBに設定しています。
docker-compose.yml の編集が 終わったら、
docker-compose down
docker-compose up -d
で、Nextcloud のコンテナを再起動します。
nginx のリバースプロキシの設定を変える
SSL のためのリバースプロキシを導入しました。ローカルから大きなファイルをアップロードする上ではそれほど問題はないのですが、 VPN 経由や Wi-Fi が不調のときのことも考えて、リバースプロキシの設定を変えます。
server {
listen 443 ssl;
server_name ${NGINX_SERVER_NAME};
ssl_certificate /etc/ssl/certs/nginx/signed.crt;
ssl_certificate_key /etc/ssl/certs/nginx/domain.key;
location / {
proxy_pass http://192.168.1.181:8080;
client_max_body_size 10G;
proxy_connect_timeout 1800;
proxy_send_timeout 1800;
proxy_read_timeout 1800;
send_timeout 1800;
}
}
以前は、 ssl 証明書と、 proxy_pass の設定だけでしたが、client_max_body_size で PHP_UPLOAD_LIMIT と大体同じ数値を設定、 timeout までの秒数をそれぞれ30分にしています。
これでタイムアウトするときは大人しく分割するか、有線 LAN でアップロードします。
Windows で作成した zip ファイルを Nextcloud 上で解凍すると文字化けする現象
これは、 Windows の標準の「zip ファイルに圧縮」メニューからでは、ファイル名の文字コードが cp932(Shift-JISのさらなる拡張)になってしまうことが原因です。
Extract アプリで使われている ZipArchive のコードに mb_string を挟むことでも解消するのですが、アップデートの度に対処するのは面倒ですし、 Mac とのファイルのやりとりなどでも発生するため、 Windows で圧縮するときに対処する方がスマートでしょう。
対応には、 7-zip を使います。
7-zip は zip 以外にも様々な圧縮形式が扱え、 LGPL ライセンスのフリーソフトなので非常に使い勝手がいいです。その名の通り、高性能な圧縮形式である 7z 形式も扱えるのが特徴です。
今回は、 7-zip の細かなインストール方法・使い方は省きます。
インストーラーからインストールするとシェル拡張(右クリックメニュー)が使えるので、圧縮したいファイルを選択して右クリックします。
「7-Zip」 から「圧縮…」を選びます。「”ファイル名.zip”に圧縮」では細かなオプション指定ができないので、必ずこれを選びます。
- アーカイブ形式:zip
- パラメーター:cu=on
を選びます。その他の設定をいじってもいいですが、圧縮レベルなどを高くしすぎると時間がかかったり、解凍に失敗することがあったりするため、標準のままでいいでしょう。
大量のファイルを圧縮する場合にはそれなりに時間がかかります。
7z ファイルや rar を使いたい場合は、 Docker に PHP RAR や p7zip などが必要となるので、手間を考えると zip でいいでしょう。
終わりに
Nextcloud を実用する上で課題になりそうなファイルのアップロード制限と、 zip ファイルの文字化けの解消を行いました。
巨大なファイルの処理には、ハードウェアの性能が必要になってきますが、一般的なクラウドストレージよりも大きなファイルを格納できるのが、オンプレでのファイル運用のメリットですね。
また、一般的な事務作業などではそれほどでもありませんが、 Web サイトの作成などを行っていると細かなファイルが数百単位になることは割とよくあります(node-moduleとかもいれたらプロジェクト全体では数千~数万)。そういったデータのバックアップ用途としては、圧縮して Nextcloud にアップロード、 Extract で展開といった使い方が便利でしょう。
楽介でした。