前回、とりあえずNextcloudが動くようになりました。
このまま使う事も勿論出来ますが、それだとサーバの性能を十分に発揮できない可能性があります。(格安VPSでもなければ持て余すはずです)
また、Nextcloudの必要なソフトウェアの部分にRedisと書いていたはずなのに未だ全く触れていません。
ここでは、サーバの性能(といってもメモリぐらいですが)に合わせてNextcloud(と言うよりそれを動かすPHP)に割り当てるメモリを増やしたり、キャッシュを使ってNextcloudを高速化するように設定します。
この記事で行うこと
1. PHP本体の設定変更
以前にPHPをインストールしたときはphp-fpmの設定のみ変更を行い、PHP自体の設定は変更していませんでした。
これはPHPの設定は初期設定のままでも動きはするから、なのですが今回はNextcloudを高速化するために設定を変更していきたいと思います。
PHP本体の設定ファイルは /etc/php.ini
と /etc/php.d/
内の各ファイルです。
/etc/php.ini
は全般の設定があり、 /etc/php.d/
内にはモジュール毎の設定があります。
今回設定する内容はPHP全般の内容なので /etc/php.ini
を編集します。
編集する箇所は以下です。「-」は削除する行(変更前)、「+」は追加する行(変更後)となります。
- memory_limit = 128M
+ memory_limit = 512M
- post_max_size = 8M
+ post_max_size = 256M
- upload_max_filesize = 2M
+ upload_max_filesize = 256M
- max_execution_time = 30
+ max_execution_time = 3600
memory_limit
: PHPが利用できるメモリの最大値です。ここではNextcloudの最低推奨値である512MBに設定しています。メモリに余裕があるのであればもっと大きな値にしても大丈夫です。他にメモリを使うようなプログラムが動いていないのであれば積んでいるメモリの6割とかにしても良いと思います。post_max_size
: 一度にPHPで処理させる最大容量です。ファイルなんかをクライアントから送る際に、一回で送る容量がこれを超えるとエラーになります。memory_limit
より大きな値は設定できません。upload_max_filesize
: ファイルをアップロードする際の1ファイル辺りの最大容量です。 実はNextcloudではこの値よりも大きなファイルもアップロードできますが、これは内部でファイルを分割しているためです。分割する回数が多いほど処理が重くなるので、この値が大きいほど大きなファイルのアップロードが早くなります。なおpost_max_size
より大きくは出来ません。max_execution_time
: PHPの処理を待つ最大時間です。この時間を過ぎるとタイムアウトになります。Nextcloudで重いファイルのアップロードを行うときなどは時間がかかる事があるので、余裕を持って1時間としています。(設定値の単位は秒です)
2. Nginxの設定変更
Nginxは前回設定したファイルと同じファイルを編集します。
以下記事の 2. Nginxの設定 で編集したファイルとなります。
編集する箇所は以下の通りです。
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always;
: これはブラウザにSSL/TLS接続を強制するという設定です。HTTPで接続されたときにすぐにHTTPSに転送しても転送されるまでの一瞬、暗号化されてない状態での通信が起きることになります。これを避ける為の設定です。上部にコメントアウトされている行があるので、#
を消すことで設定できます。一度設定をすると、設定を外しても当面の間(半年!)同じブラウザからはHTTPS接続でしか接続出来なくなります。ある程度SSL/TLS接続での運用が安定してから外すと良いと思います。client_max_body_size
: Nginx側で設定する最大アップロード容量です。PHPで設定したpost_max_size
と同じ値に設定します。fastcgi_read_timeout
: Nginx側で設定するPHPの処理待ちの最大時間です。client_max_body_size
のすぐ下に新たに書き込みます。値はPHPで設定したmax_execution_time
と同じ値にします。max_execution_time
と違い、設定値の単位を選べます。(1hや10mといった具合です。)
3. バックグラウンドジョブの設定
Nextcloudは定期的に実行するジョブがあります。
例えばゴミ箱で有効期限が切れたファイルを削除するなどです。
初期設定では、ユーザがアクセスしてきた際についでにこれらの処理を行います。
しかし、それではただでさえユーザからアクセスされて処理をしなくてはならないタイミングで更に色々な処理を行う必要があるため、重くなってしまいます。
なので、ユーザのアクセスに関係なく定期的にジョブを実行する為の設定を行います。
このような定期的なジョブの設定方法は色々とありますが、今回はsystemdを使った設定を行います。
まず、以下2つのファイルを作成します。
/etc/systemd/system/nextcloudcron.service
[Unit]
Description=Nextcloud cron.php job
[Service]
User=nginx
ExecStart=/usr/bin/php -f /srv/nextcloud/cron.php
User=nginx
の部分と/srv/nextcloud
の部分は、それぞれNginxの実行ユーザ名、Nextcloudをインストールした場所に応じて変更してください。
/etc/systemd/system/nextcloudcron.timer
[Unit]
Description=Run Nextcloud cron.php every 5 minutes
[Timer]
OnBootSec=5min
OnUnitActiveSec=5min
Unit=nextcloudcron.service
[Install]
WantedBy=timers.target
nextcloudcron.service
は実行する内容を定めたファイルになります。
systemctl start nextcloudcron.service
とシステムを起動するときのようにコマンドを実行すると、Nextcloudのジョブが動くようになります。
nextcloudcron.timer
は実行するタイミングを定めたファイルになります。5分おきに nextcloudcron.service
を起動するように設定されています。
あとは、 nextcloudcron.time
を有効化することで、自動的に5分おきに nextcloudcron.timer
が起動され、Nextcloudのジョブが動くようになります。
[root@note ~]# systemctl daemon-reload
[root@note ~]# systemctl enable --now nextcloudcron.timer
daemon-reload
: 新しく作ったtimerやserviceを読み込ませる為のコマンドです。dnfなどでインストールする場合はインストールする際に読み込まれるので良いのですが、自分で作った場合にはこうして明示的に読み込んであげる必要があります。
そして、Nextcloudの側ではページを読み込む度にジョブを実行する必要は無いことを伝えるために設定を変えてあげる必要があります。
Nextcloudの右上にあるアイコンをクリックして、「設定」をクリックすると左側に「基本設定」という項目があります。(この項目がない場合は、管理者のアカウントでログインしているか確認してみてください)
こちらをクリックすると上図のような画面になるので、バックグラウンドジョブの「Cron」にチェックを付けてあげてください。
これは、Linuxのシステムでジョブを実行するという設定になります。
4. キャッシュの設定
基本的にHDDなどの記憶媒体よりメモリの方が早いです。これは、SSDでも変わりません。
つまり、メモリを使うようにするほど(積んでるメモリを使い切らない限り)早いわけです。
ということで、必要な情報をなるべくメモリ上で持つように設定をしていきます。
そのために、 APCuというPHPモジュール(追加機能)とRedisを使います。
Redisは既に以前の記事でインストールと設定を終えているので、問題ないと思います。
ではAPCuは?というと、これはPHPと共にインストールされているはずです。
では既に用意が出来ているのでこれらを使うようにNextcloudの設定を変更しましょう。
変更するファイルは /srv/nextcloud/config/config.php
となります。(インストールしている場所が違う場合はそのインストール先に合わせましょう)
最終行にある );
の前の行に以下の記述をクア得ます。
'memcache.local' => '\OC\Memcache\APCu',
'memcache.distributed' => '\OC\Memcache\Redis',
'redis' => [
'host' => '/run/redis/redis.sock',
'port' => 0,
],
'memcache.locking' => '\OC\Memcache\Redis',
mamcache.local
: 汎用的なキャッシュ領域です。1度読み込んだファイルなどを保存します。基本的にRedisよりAPCuの方が高速なのでこちらを使います。mamcache.distributed
: Nextcloudの設定などを置いておくキャッシュ領域です。APCuは一定時間使わなかった情報は容赦なく捨てていくので、確実に一定時間は保持してくれるRedisを使います。memcache.locking
: ファイルロック(編集中のファイルを他で勝手に変更されないようにする)情報を置いておくキャッシュ領域です。この情報が勝手に捨てられると編集していた情報が勝手に上書かれたりと大惨事になるので、絶対にAPCuは使わないようにしましょう。
まとめ
今回はNextcloudのチューニングについて説明しました。
これで概ね問題なくNextcloudを使えるようになるはずです。
折良くバージョンの更新があったので、次回はNextcloudの更新を行いたいと思います。