php5のサーバでNextcloud 14系だったのですが,php 7.0 に出来るようになったのでNextcloud もアップグレードして15にしました.
するといくつかの「セキュリティ&セットアップ警告」が出てきたので対応したメモです.
MariaDBのデータベースの4バイト文字のサポート
MySQLをデータベースとして使用していますが、4バイト文字をサポートしていません。たとえば、ファイル名やコメントの問題なしに(絵文字のような)4バイト文字を処理できるようにするには、MySQLで4バイトサポートを有効にすることをお勧めします。 詳細についてはこれに関するドキュメントページを読んでください。
ここでいうドキュメントページは以下のリンクでした.
現在のデータベースのバージョンを確認します.
$ mysql --version mysql Ver 15.1 Distrib 10.1.38-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2
innodb_file_format
を確認して,Barracuda
でない場合は`Barracuda` に変更します.
$ mysql -udebian-sys-maint -p MariaDB [(none)]> show variables like 'innodb_file_format'; +--------------------+----------+ | Variable_name | Value | +--------------------+----------+ | innodb_file_format | Antelope | +--------------------+----------+ MariaDB [(none)]> show variables like 'innodb_file_format'; +--------------------+-----------+ | Variable_name | Value | +--------------------+-----------+ | innodb_file_format | Barracuda | +--------------------+-----------+ MariaDB [(none)]> quit; Bye $ sudo service mariadb restart
ここからはMySQL/MariaDBのソフトウェア,バージョン毎に少し設定が異なります.
MariaDBの設定ファイルの`[mysqld]` セクションに`innodb_file_per_table=1` を設定
innodb_file_per_table=1
MariaDBを再起動して設定反映.
$ sudo service mariadb restart
データベースの文字コードなどを変更
MariaDB [(none)]> ALTER DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
Nextcloud側の設定も4バイト文字を有効にする
$ sudo -u www-data php ./occ config:system:set mysql.utf8mb4 --type boolean --value="true" System config value mysql.utf8mb4 set to boolean true
repairを掛けるとエラーに
$ sudo -u www-data php ./occ maintenance:repair Nextcloud is in maintenance mode - no apps have been loaded - Repair MySQL collation - Change row format for oc_addressbooks ... - Change collation for oc_addressbooks ... In AbstractMySQLDriver.php line 115: An exception occurred while executing 'ALTER TABLE `oc_addressbooks` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;': SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes In PDOStatement.php line 107: SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes In PDOStatement.php line 105: SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes maintenance:repair [--include-expensive]
max key length is 767 bytes
ということで以下の設定も追記して
[mysqld] innodb_large_prefix=true innodb_file_format=barracuda innodb_file_per_table=1
MariaDBを再起動して設定反映.
$ sudo service mariadb restart
再度repairを掛けると正常に終了.
$ sudo -u www-data php ./occ maintenance:repair
メンテナンスモードを抜けてNextcloudを開き,エラーメッセージが消えているのを確認
$ sudo -u www-data php ./occ maintenance:mode --off Maintenance mode disabled
PHP OPcacheの設定
PHP OPcacheが適切に設定されていません。よりパフォーマンスを向上させるには、php.iniで次の設定を推奨します:
opcache.enable=1
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.memory_consumption=128
opcache.save_comments=1
opcache.revalidate_freq=1
/etc/php/7.0/apache2/php.ini
を編集してapache httpd2の設定を再読込して反映.
$ sudo vi /etc/php/7.0/apache2/php.ini $ sudo service apache2 reload
データベースにインデックスを作成
データベースにいくつかのインデックスがありません。 大きなテーブルにインデックスを追加すると、自動的に追加されないまでに時間がかかる可能性があるためです。 “occ db:add-missing-indices”を実行することによって、インスタンスが実行し続けている間にそれらの欠けているインデックスを手動で追加することができます。 インデックスが追加されると、それらのテーブルへのクエリは通常はるかに速くなります。
テーブル “oc_share”のインデックス “share_with_index”が見つかりません。
テーブル “oc_share”のインデックス “parent_index”が見つかりません。
テーブル “oc_share”のインデックス “owner_index”が見つかりません。
テーブル “oc_share”のインデックス “initiator_index”が見つかりません。
テーブル “oc_filecache”のインデックス “fs_mtime”が見つかりません。
occ db:add-missing-indices
を実行して解決.
$ sudo -u www-data php ./occ db:add-missing-indices
imagickモジュールの導入
このインスタンスには推奨されるPHPモジュールがいくつかありません。 パフォーマンスの向上と互換性の向上のために、それらをインストールすることを強くお勧めします。
imagick
php-imagick
パッケージを導入してapache httpd2を再読込
$ sudo apt install php-imagick $ sudo service apache2 reload
データベースのbig intへの変換
データベース内のいくつかの列で、big intへの変換が行われていません。 大きなテーブルでカラムタイプを変更すると時間がかかることがあるため、自動的には変更されませんでした。 ‘occ db:convert-filecache-bigint’を実行することによって、それらの保留中の変更は手動で適用できます。 この操作は、インスタンスがオフラインの間に行う必要があります。 詳細についてはこれに関するドキュメントページを読んでください。
activity.activity_id
activity.object_id
activity_mq.mail_id
filecache.fileid
filecache.storage
filecache.parent
filecache.mimetype
filecache.mimepart
filecache.mtime
filecache.storage_mtime
mimetypes.id
storages.numeric_id
occ db:convert-filecache-bigint
で反映
$ sudo -u www-data php ./occ db:convert-filecache-bigint Following columns will be updated: * activity.activity_id * activity.object_id * activity_mq.mail_id * filecache.fileid * filecache.storage * filecache.parent * filecache.mimetype * filecache.mimepart * filecache.mtime * filecache.storage_mtime * mimetypes.id * storages.numeric_id This can take up to hours, depending on the number of files in your instance! Continue with the conversion (y/n)? [n] y
Nextcloud 16にも上げてみたいのですが,phpのバージョンを上げないといけないしE2EEプラグインが未対応だったりするのでとりあえず今回は見送りです.
環境
$ sudo -u www-data php ./occ --version Nextcloud 15.0.10 $ dpkg-query -W mariadb-common mariadb-server-10.1 php7.0 php7.0-mysql php-imagick mariadb-common 10.1.38-0+deb9u1 mariadb-server-10.1 10.1.38-0+deb9u1 php-imagick 3.4.3~rc2-2 php7.0 7.0.33-0+deb9u3 php7.0-mysql 7.0.33-0+deb9u3 $ lsb_release -dr Description: Debian GNU/Linux 9.9 (stretch) Release: 9.9 $ uname -m x86_64