Kontakt

Carsten Rieger IT Services
Am Danglfeld 8 | 83132 Pittenhart
Telefon: 08624.9009794
E-Mail: info@c-rieger.de

Nextcloud Unix-Socket Kommunikation (Ubuntu 24/Debian12)


Letzte Aktualisierungen:
» 07. November 2024: Berechtigungen www-data/redis sowie Hinweis auf Socket-Verzeichnis
» 13. Oktober 2024: Redis-Socket für PHP mit „auth=RedisPasswort“


Unix Sockets gelten im Allgemeinen als schneller und sicherer, als die auf nativer TCP-Kommunikation aufbauenden Verbindungen. Mit rudimentären Benchmarks (ab oder wrk) lässt sich das bspw. so ermitteln:

ab -k -n 10000 -c 1000 http://127.0.0.1/api/user/1
wrk -t1 -c1000 -d5s http://127.0.0.1:80/api/user/1

Die sogenannten „Unix Domain Sockets“ führen häufig zu schnelleren Verbindungen bspw. zwischen nginx und PHP (php-fpm) und verbrauchen dabei deutlich weniger Systemressourcen. Der Grund liegt u.a. darin, dass der sogenannte TCP-Overhead bei der Kommunikation entfällt. Zudem gelten Unix-Sockets als „sicherer“ oder anders ausgedrückt als „not routable“, da diese nicht von außen erreichbar sind.

Weiterführende Informationen dazu finden Sie im Internet, bspw. hier.

Die nachfolgenden Anpassungen basieren auf der Nextcloud Installationsanleitung bzw. dem Installationsskript (zero.sh) und den darin verwendeten Konfigurationen.

MariaDB 10.x

» MariaDB:

sudo mysql
CREATE USER 'www-data'@'localhost' IDENTIFIED VIA unix_socket;
GRANT ALL PRIVILEGES ON nextclouddb.* TO 'www-data'@'localhost';
FLUSH PRIVILEGES;

» Nextcloud: Anpassung der config.php

nano /var/www/nextcloud/config/config.php
[...]
'dbtype' => 'mysql',
'dbname' => 'nextclouddb',
'dbhost' => 'localhost:/var/run/mysqld/mysqld.sock',
'dbport' => '',
'dbtableprefix' => 'oc_',
'mysql.utf8mb4' => true,
'dbuser' => 'nextclouddbuser',
'dbpassword' => 'nextclouddbpassword',
[...]

» Restart der Datenbank

systemctl restart mariadb.service

PHP 8.X

» Anpassung der fpm/php.ini

nano /etc/php/8.X/fpm/php.ini
[...]
;session.save_handler = files
session.save_handler = redis
session.save_path = "unix:///var/run/redis/redis-server.sock?persistent=1&weight=1&database=10"
redis.session.locking_enabled = 1
redis.session.lock_retries = -1
redis.session.lock_wait_time = 10000

[...]

Hinweis:
Sofern Sie bei Redis ein Passwort nutzen, so ersetzen Sie die zuvor genannte Konfiguration entsprechend:

session.save_path = "unix:///var/run/redis/redis-server.sock?auth=RedisPasswort&persistent=1&weight=1&database=10"

Redis-Server

» Notwendige Berechtigungen einrichten

usermod -aG redis www-data

» Anpassung der redis.conf

nano /etc/redis/redis.conf
[...]
# port 6379
port 0
[...]
unixsocket /var/run/redis/redis-server.sock
unixsocketperm 770
[...]

Der Unixsocket liegt in neuen Server-Derivaten unter /run anstatt unter /var/run, also:

[...]
'dbhost' => 'localhost:/run/mysqld/mysqld.sock',
[...]

[...]
session.save_path = "unix:///run/redis/redis-server.sock?persistent=1&weight=1&database=10"
[...]
[...]
unixsocket /run/redis/redis-server.sock
[...]

Sie können diese Pfade verwenden, müssen dann aber die Dateien config.php, redis.conf und php.ini entsprechend anpassen.

Dienste neu starten:

systemctl restart redis.service php8.X-fpm.service mariadb.service nginx.service

Über Ihre Unterstützung (diese wird ordnungsgemäß versteuert!) würden sich meine Frau, meine Zwillinge und ich sehr freuen. Vorab vielen Dank!