NextCloudで「413 Request Entity Too Large」エラー

2022年9月28日

ファイルバックアップ用として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