NextCloudで「413 Request Entity Too Large」エラー
ファイルバックアップ用としてNextCloudを本格的に使い始めたのだが、いきなりエラーが発生してしまった。ほとんどのファイルがことごとく、サーバからの「413 Request Entity Too Large」というエラーによってアップロードされていない。
以下はWindows側のクライアントの画面だが、Windows側のフォルダに入れたファイルがNextCloudサーバにアップロードされていない。
結論から
NextCloudと共にインストールされるPHPがデフォルトの設定のままになっており、最大512MB程度しかアップロードできなかい状態だった。これを最大16GBにした。アップロードは自分か、あるいは信頼できる人物しか行わないのでこれで問題無い。というより、そもそもNextCloudというのは、「信頼できる人間」しかアップロードしないものなのだから、最初から実質無制限にしておいてほしかった。
version: '3'
services:
nextcloud:
image: nextcloud:24.0.5
container_name: nextcloud
volumes:
- ./data:/var/www/html
environment:
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=****
- MYSQL_PASSWORD=****
- MYSQL_HOST=mariadb
- PHP_UPLOAD_LIMIT=16G # これで16GBまでアップロードできる
restart: always
この設定は、Nextcloud で 4GB 以上の大容量ファイルをアップロードする設定を参考にさせていただいた。この後NextCloudを再起動し、phpの情報を調べていると、たしかに16GBになっている。
# docker exec -it nextcloud bash
# php -i | grep _max_
log_errors_max_len => 1024 => 1024
post_max_size => 16G => 16G
upload_max_filesize => 16G => 16G
zend.exception_string_param_max_len => 15 => 15
memcached.sess_lock_max_wait => not set => not set
unserialize_max_depth => 4096 => 4096
post_max_sizeとupload_max_filesize共に16GBになっていることに注意。
※後からよく見てみると、公式のドキュメントに記述があった、https://github.com/nextcloud/docker。
全く効果の無い設定
上の設定を見つける以前に、ウェブを検索しまくって設定方法を探し、試してみたのだが、どれもうまく行かなかった。
.htaccess, .user.iniへの設定
.htaccessに以下を追加
# PHP 8+
<IfModule mod_php.c>
php_value mbstring.func_overload 0
php_value default_charset 'UTF-8'
php_value output_buffering 0
php_value post_max_size 16G # これ
php_value upload_max_filesize 16G # これ
<IfModule mod_env.c>
SetEnv htaccessWorking true
</IfModule>
</IfModule>
.user.iniに以下を追加
mbstring.func_overload=0
always_populate_raw_post_data=-1
default_charset='UTF-8'
output_buffering=0
upload_max_filesize=16G # これ
post_max_size=16G # これ
いずれも全くうまくいかない。先の「php -i | grep max」で変化無し
PHP_UPLOAD_MAX_FILESIZEとPHP_POST_MAX_SIZE
成功したPHP_UPLOAD_LIMITではなく、PHP_UPLOAD_MAX_FILESIZEとPHP_POST_MAX_SIZEを設定しろと書いてあるページもあるのだが、これも全くうまくいかない。おそらくは、何の検証もしていないのに、こういったことを書いているのだろう。
NextCloudのバージョンアップ
この設定をする以前に、22.2.0.2だったNextCloudを24.0.5.1にバージョンアップしようとしたのだが、まともに動かない。これも結論から言えば、複数のメジャーバージョンを飛び越えてはいけないようだ。つまり、
いったん23にバージョンアップした後に24にしないといけない。
nextcloud | Initializing nextcloud 24.0.5.1 ...
nextcloud | Upgrading nextcloud from 22.2.0.2 ...
nextcloud | Nextcloud or one of the apps require upgrade - only a limited number of commands are available
nextcloud | You may use your browser or the occ upgrade command to do the upgrade
nextcloud | Setting log level to debug
nextcloud | Turned on maintenance mode
nextcloud | Exception: Updates between multiple major versions and downgrades are unsupported.
nextcloud | Update failed
nextcloud | Maintenance mode is kept active
nextcloud | Resetting log level
ひどいことに、こういうエラーメッセージを出しておきながら、中途半端にアップデートしてしまうようで、メンテナンスモードのまま止まってしまった。これは、config/config.phpのmaintenanceをfalseにすれば良いのだが、しかし、元に戻そうとしても、「旧バージョンには戻せない」とか言うメッセージが出る。これは結局、トップのversion.phpを削除することで解決した。
https-portalの変更
DockerでインストールしたNextCloudにはhttpでのアクセスしかできないので、もともとhttps-portalを使っていたのだが、ここも修正する必要があった。以下の通り。
これは、https://github.com/SteveLTN/https-portal#configure-nginx-through-environment-variablesに記述があった。
※このhttps-portalではNextCloudを含む複数のサービスをhttps化しているのだが、もしこの中に不特定ユーザのデータアップロードを受け付けるものがあった場合、いたずらができてしまうことに注意する。
version: '3'
services:
https-portal:
image: steveltn/https-portal:1
container_name: https-portal
ports:
- '80:80'
- '443:443'
restart: always
volumes:
- /opt/docker-data/ssl_certs:/var/lib/https-portal
environment:
CLIENT_MAX_BODY_SIZE: 16G # ここ
DOMAINS: >-
dk.abc.com -> http://****:9000
,tech.abc.com -> http://****:3000
,nextcloud.abc.com -> http://****:80
,sample.abc.com -> http://****:80