有馬総一郎のブログ

(彼氏の事情)

2020年12月07日 15:01:16 JST - 8 minute read - Linux

Nextcloudの警告を解消する

ふとアップグレードしたついでにセキュリティ&セットアップ警告を確認すると一杯警告が…

Nextcloud

PHPのメモリ制限は推奨値512MBを下回ります。

え!エラーでアプリ落ちなくなって、今の今まで落ちたことも遅くなったことも無いんだけどなぁ。あれ?php --iniの結果などは無視して、/etc/php/7.3/cli/php.iniではなく/etc/php/7.4/apache2/php.iniの方を修正したら消えた。

メモリキャッシュが設定されていません。

メモリキャッシュが設定されていません。可能であれば、パフォーマンスを向上するため、memcacheを設定してください。より詳しい情報はドキュメントで参照できます。

Memory cachingを参照に設定する。

memcachedインストール

sudo apt install memcached
sudo apt install php7.4-memcached

/etc/php/7.4/cli/conf.d/10-opcache.ini

opcache.enable=1
opcache.enable_cli=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.4/cli/conf.d/10-opcache.ini/etc/php/7.4/apache2/conf.d/10-opcache.inietc/php/7.4/mods-available/opcache.iniにリンクしているので、どちらを編集しても同じ。

memcachedの確認

$ ps ax | grep memcached
6033 ?        Ssl    0:01 /usr/bin/memcached -m 64 -p 11211 -u memcache -l 127.0.0.1 -P /var/run/memcached/memcached.pid

動いてるっぽい。

config.php

'memcache.distributed' => '\OC\Memcache\Memcached',

を追記。が、それでも警告は消えず。

Memory cachingを読み返すと、

If you enable only a distributed cache in your config.php (memcache.distributed) and not a local cache (memcache.local) you will still see the cache warning. config.php(memcache.distributed)で分散キャッシュのみを有効にし、ローカルキャッシュ(memcache.local)を有効にしない場合でも、キャッシュの警告が表示されます。

なるほど。ローカルキャッシュも有効にしろと。

APCu is a data cache, and it is available in most Linux distributions. On Red Hat/CentOS/Fedora systems install php-pecl-apcu. On Debian/Ubuntu/Mint systems install php-apcu.

とあるので、APCuをインストール。

sudo apt install php7.4-apcu

config.php

'memcache.local' => '\OC\Memcache\APCu',

を追記。

データベースの警告

  • データベースにいくつかのインデックスがありません。 大きなテーブルにインデックスを追加すると、自動的に追加されないまでに時間がかかる可能性があるためです。 “occ db:add-missing-indices"を実行することによって、インスタンスが実行し続けている間にそれらの欠けているインデックスを手動で追加することができます。 インデックスが追加されると、それらのテーブルへのクエリは通常はるかに速くなります。
  • The database is missing some primary keys. Due to the fact that adding primary keys on big tables could take some time they were not added automatically. By running “occ db:add-missing-primary-keys” those missing primary keys could be added manually while the instance keeps running.
  • データベースにはオプションのカラムがいくつかありません。大きなテーブルにカラムを追加するには時間がかかるため、オプションのカラムは自動的に追加されませんでした。“occ db:add-missing-columns"を実行することで、不足しているカラムはインスタンスの実行中に手動で追加することができます。カラムが追加されると、応答性や使い勝手が改善される可能性があります。
  • データベース内のいくつかの列で、big intへの変換が行われていません。 大きなテーブルでカラムタイプを変更すると時間がかかることがあるため、自動的には変更されませんでした。 ‘occ db:convert-filecache-bigint’を実行することによって、それらの保留中の変更は手動で適用できます。 この操作は、インスタンスがオフラインの間に行う必要があります。 詳細についてはこれに関するドキュメントページを読んでください。

これらはコマンドで一気に解決。

cd /var/www/nextcloud
sudo -u www-data php occ db:add-missing-indices
sudo -u www-data php occ db:add-missing-primary-keys
sudo -u www-data php occ db:add-missing-columns
sudo -u www-data php occ db:convert-filecache-bigint

で解消。画面だと:となってて、そのままやると

/var/www/nextcloud$ sudo -u www-data php occ db:convert-filecache-bigint
 Command "db:convert-filecache-bigint" is not defined.
 Do you want to run "db:convert-filecache-bigint" instead?  (yes/no) [no]:
 > no

と警告されるので注意。

このインスタンスには推奨されるPHPモジュールがいくつかありません。

このインスタンスには推奨されるPHPモジュールがいくつかありません。 パフォーマンスの向上と互換性の向上のために、それらをインストールすることを強くお勧めします。

sudo apt install php7.4-bcmath
sudo apt install php7.4-gmp

インストールすれば解消。

Webサーバーは適切にホスト名 “/.well-known/caldav” が引けるように設定されていません。

Webサーバーは適切にホスト名 “/.well-known/caldav” が引けるように設定されていません。より詳しい情報については、ドキュメントを参照ください。 Webサーバーは適切にホスト名 “/.well-known/carddav” が引けるように設定されていません。より詳しい情報については、ドキュメントを参照ください。

General troubleshooting — Nextcloud 15 Administration Manual 15 documentation

これがメッチャ嵌った…いや改めていかに自分がapacheについての理解がないまま適当にやっているかを思い知らされた。

【VPS活用】 Nextcloud でクラウドストレージをつくってみた ~ サーバー構築編 ~ | カゴヤのサーバー研究室での 3.4 を参考にして上手く行った。

結果だけ書くと

/etc/apache2/sites-available/nextcloud.conf

Redirect 301 /.well-known/host-meta /nextcloud/public.php?service=host-meta
Redirect 301 /.well-known/host-meta\.json /nextcloud/public.php?service=host-meta-json
Redirect 301 /.well-known/carddav /nextcloud/remote.php/dav
Redirect 301 /.well-known/caldav  /nextcloud/remote.php/dav
Redirect 301 /.well-known/webfinger  /nextcloud/public.php?service=webfinger

を追記して成功した。正直言って、これで上手く行くのは分かるが、何故、下の試行が上手く行かなかったのかが分からない。

以下は試行錯誤

まずはnextcloud.confに以下を追記した。

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteRule ^\.well-known/host-meta /nextcloud/public.php?service=host-meta [QSA,L]
  RewriteRule ^\.well-known/host-meta\.json /nextcloud/public.php?service=host-meta-json [QSA,L]
  RewriteRule ^\.well-known/webfinger /nextcloud/public.php?service=webfinger [QSA,L]
  RewriteRule ^\.well-known/carddav /nextcloud/remote.php/dav [R=301,L]
  RewriteRule ^\.well-known/caldav /nextcloud/remote.php/dav [R=301,L]
</IfModule>

しかし、上手くいかない…

リライトがもしや有効になっていないのか?と

/etc/apache2/mods-available/rewrite.load

LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so

ロードしているファイルが/etc/apache2/mods-enabled/配下にリンクとして存在するか確認

ubuntu:~$ ls -l /etc/apache2/mods-enabled/rewrite.load
lrwxrwxrwx 1 root root 30  4月 26  2016 /etc/apache2/mods-enabled/rewrite.load -> ../mods-available/rewrite.load

されている。

万が一、されてない場合は以下コマンドで有効化する。

sudo a2enmod rewrite

有効になっているが、ちっとも上手くいかない…

初めdavが有効化してないから?とか思いsudo a2dismod davしてnextcloud.confをDav onにしても変わらず…

次にドキュメントどおり
/var/www/nextcloud/.htacces

@@ -61,12 +61,11 @@
   RewriteCond %{HTTP_USER_AGENT} DavClnt
   RewriteRule ^$ /remote.php/webdav/ [L,R=302]
   RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
-  RewriteRule ^\.well-known/host-meta /public.php?service=host-meta [QSA,L]
-  RewriteRule ^\.well-known/host-meta\.json /public.php?service=host-meta-json [QSA,L]
-  RewriteRule ^\.well-known/webfinger /public.php?service=webfinger [QSA,L]
-  RewriteRule ^\.well-known/nodeinfo /public.php?service=nodeinfo [QSA,L]
-  RewriteRule ^\.well-known/carddav /remote.php/dav/ [R=301,L]
-  RewriteRule ^\.well-known/caldav /remote.php/dav/ [R=301,L]
+  RewriteRule ^\.well-known/host-meta /nextcloud/public.php?service=host-meta [QSA,L]
+  RewriteRule ^\.well-known/host-meta\.json /nextcloud/public.php?service=host-meta-json [QSA,L]
+  RewriteRule ^\.well-known/webfinger /nextcloud/public.php?service=webfinger [QSA,L]
+  RewriteRule ^\.well-known/carddav /nextcloud/remote.php/dav [R=301,L]
+  RewriteRule ^\.well-known/caldav /nextcloud/remote.php/dav [R=301,L]
   RewriteRule ^remote/(.*) remote.php [QSA,L]
   RewriteRule ^(?:build|tests|config|lib|3rdparty|templates)/.* - [R=404,L]
   RewriteCond %{REQUEST_URI} !^/\.well-known/(acme-challenge|pki-validation)/.*

とするが、それでも駄目。

でも、ブラウザで https://ホスト名/nextcloud/.well-known/carddav 飛ぶと、ちゃんとThis is the WebDAV interface. It can only be accessed by WebDAV clients such as the Nextcloud desktop sync client.と表示される。

え、そういうことじゃないの?

[solved] .well-known/caldav check in 13.0.7 explained - 🚧 Installation - Nextcloud communityでも解決策としては

Thanks for the hint, I finally solved it - in my case the syntax of the redirect in the httpd config had to be:

Redirect 301 /.well-known/carddav https://cloud.example.com/remote.php/dav
Redirect 301 /.well-known/caldav https://cloud.example.com/remote.php/dav

としていて、その助けとして Installation on Linux — Nextcloud 13 Administration Manual 13 documentationが参考になったというのだけど、これを読んでどうして、この解決策に辿りついたのか分からず…

Ubuntu 18.04 に Nextcloud をインストール | 雑廉堂の雑記帳なんかを見ると

次の節を、/etc/apache2/sites-available/default-ssl.conf に追加。

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteRule ^/\.well-known/host-meta /nextcloud/public.php?service=host-meta [QSA,L]
  RewriteRule ^/\.well-known/host-meta\.json /nextcloud/public.php?service=host-meta-json [QSA,L]
  RewriteRule ^/\.well-known/webfinger /nextcloud/public.php?service=webfinger [QSA,L]
  RewriteRule ^/\.well-known/carddav /nextcloud/remote.php/dav/ [R=301,L]
  RewriteRule ^/\.well-known/caldav /nextcloud/remote.php/dav/ [R=301,L]
</IfModule>

としているが、自分のケースではうまく行かず…

Apache Rewrite 301のキャッシュ落とし穴 | GWT Centerなどでを見ると一度間違ったリダイクレト設定をしてしまうとキャッシュされてしまうとあったので、プライベートウィンドウを開いて確認するようにしたけど、結果は変わらず。

結果、一番上の解決策で上手くいったのだけど、それだと、ブラウザから飛んだときは .htacces が先に適用されて/nextcloud/remote.php/davに飛ぶんだよなぁ。

チェックはOKになったけど、本当に良いのか?と思いThunderbirdのカレンダーインポート設定でやると、リダイクレトは効いてる。大丈夫なのなのかな?1iOS搭載された端末ないから、まあ、どうでもいい話なんだけどね。

Nextcloud

とりあえず、警告は解消。そしてセキュリティも問題なし。

Nextcloud
Nextcloud

いやあ、いままで conf/mods/sites-available conf/mods/sites-enabled の意味、分かってなかった。有効化するために-available配下にリンク作成するのね。過去の記事をみると直にコマンドlnでリンク貼ったりしてたけど、本当は良くないのかも。今さら修正しないけど。サイトの設定なのに、conf-availableに作ってたりとデタラメすぎたな。

上記サイトのおかげで多少、理解が進んだ。


  1. ただこれだとThunderbirdでは上手く同期できない。もともと https://ホスト名/nextcloud/.well-known/caldav/calendars/ユーザー名/カレンダー名/ ならちゃんと同期・表示される。 ↩︎