Ubuntu 26.04 で Nextcloud を構成する場合、Nginx、PHP-FPM、MariaDB、Redis、TLS、data directory、cron 実行を一つの流れとしてそろえる必要があります。どれか一つだけを設定しても、Nextcloud として安定して動く状態にはなりません。
この記事では、Nextcloud 33 系を配置し、occ maintenance:install で初期インストールできる土台を作ります。アプリ設定、trusted domains、mail、Redis lock、maintenance window などの config.php 調整は、別記事の Nextcloud 設定編で扱います。
- Nextcloud base の構成要素を確認する
- 専用 PHP-FPM pool と Nginx server block を作成する
- MariaDB database、data directory、Nextcloud 本体を用意する
occ maintenance:installと systemd timer の確認を行う
構成要素を確認する
Nextcloud base では、Web server と PHP 実行環境だけでなく、database、cache、data directory、cron の境界をそろえます。特に data directory は document root の外に置き、PHP-FPM は Nextcloud 用 pool と socket を分けます。
| 要素 | 役割 |
| Nginx | HTTPS、静的ファイル、PHP への FastCGI 転送 |
| PHP-FPM | Nextcloud の PHP 実行環境 |
| MariaDB | Nextcloud の metadata database |
| Redis | file locking や cache の土台 |
| data directory | ユーザーファイルの実体 |
| systemd timer | cron.php の定期実行 |
PHP-FPM pool を作成する
Nextcloud 用の PHP-FPM pool を作り、Unix socket で Nginx から接続します。socket を分けると、他の PHP アプリケーションと実行環境の境界を保ちやすくなります。
sudo tee /etc/php/8.5/fpm/pool.d/nextcloud.conf >/dev/null <<'EOF'
[nextcloud]
user = www-data
group = www-data
listen = /run/php/nextcloud-php8.5.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
pm = dynamic
pm.max_children = 24
pm.start_servers = 4
pm.min_spare_servers = 4
pm.max_spare_servers = 12
pm.max_requests = 500
clear_env = no
EOF
sudo php-fpm8.5 -t
sudo systemctl restart php8.5-fpm.serviceNginx server block を作成する
/etc/nginx/sites-available/default に Nextcloud 用 server block を配置します。実際の FQDN、証明書、秘密鍵の path は環境に合わせて置き換えます。
sudo tee /etc/nginx/sites-available/default >/dev/null <<'EOF'
upstream php-handler {
server unix:/run/php/nextcloud-php8.5.sock;
}
map $arg_v $asset_immutable {
"" "";
default ", immutable";
}
server {
listen 80;
listen [::]:80;
server_name nextcloud.example.com;
server_tokens off;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
http2 on;
server_name nextcloud.example.com;
root /var/www/html;
ssl_certificate /etc/ssl/localcerts/server.crt;
ssl_certificate_key /etc/ssl/localcerts/server.key;
server_tokens off;
client_max_body_size 10G;
client_body_timeout 300s;
fastcgi_buffers 64 4K;
add_header Referrer-Policy "no-referrer" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Robots-Tag "noindex, nofollow" always;
add_header Strict-Transport-Security "max-age=15552000; includeSubDomains; preload" always;
fastcgi_hide_header X-Powered-By;
index index.php index.html /index.php$request_uri;
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location ^~ /.well-known {
location = /.well-known/carddav { return 301 /remote.php/dav/; }
location = /.well-known/caldav { return 301 /remote.php/dav/; }
return 301 /index.php$request_uri;
}
location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)(?:$|/) {
return 404;
}
location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) {
return 404;
}
location ~ \.php(?:$|/) {
rewrite ^/(?!index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|ocs-provider/.+) /index.php$request_uri;
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
set $path_info $fastcgi_path_info;
try_files $fastcgi_script_name =404;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $path_info;
fastcgi_param HTTPS on;
fastcgi_param modHeadersAvailable true;
fastcgi_param front_controller_active true;
fastcgi_pass php-handler;
fastcgi_intercept_errors on;
fastcgi_request_buffering on;
fastcgi_max_temp_file_size 0;
}
location ~ \.(?:css|js|mjs|svg|gif|ico|jpg|png|webp|wasm|map)$ {
try_files $uri /index.php$request_uri;
add_header Cache-Control "public, max-age=15778463$asset_immutable";
access_log off;
}
location /remote {
return 301 /remote.php$request_uri;
}
location / {
try_files $uri $uri/ /index.php$request_uri;
}
}
EOF
sudo nginx -t
sudo systemctl restart nginx.serviceMariaDB database と data directory を用意する
Nextcloud 用 database と user を作ります。password は実環境の値に置き換えます。data directory は document root の外に置き、www-data が読み書きできる状態にします。
sudo mariadb <<'EOF'
CREATE DATABASE IF NOT EXISTS nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
CREATE USER IF NOT EXISTS 'nextcloud'@'localhost' IDENTIFIED BY 'CHANGE_ME_DB_PASSWORD';
GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextcloud'@'localhost';
FLUSH PRIVILEGES;
EOF
sudo install -d -o www-data -g www-data -m 0750 /mnt/nextcloud
sudo usermod -aG redis www-dataNextcloud 本体を配置する
Nextcloud 33 系の archive を取得し、document root に配置します。すでに /var/www/html/version.php がある環境では、既存インストールを上書きしないように状態を確認してから作業します。
sudo install -d -o root -g root -m 0755 /var/tmp/nextcloud-base
curl -L -o /var/tmp/nextcloud-base/latest-33.zip https://download.nextcloud.com/server/releases/latest-33.zip
cd /var/tmp/nextcloud-base
unzip latest-33.zip
sudo rsync -a /var/tmp/nextcloud-base/nextcloud/ /var/www/html/
sudo chown -R www-data:www-data /var/www/html
sudo chown www-data:www-data /mnt/nextcloud
sudo chmod 0750 /mnt/nextcloud初期インストールを実行する
occ maintenance:install で database、admin user、data directory を指定して初期インストールします。admin password と database password は実環境の値に置き換えます。
cd /var/www/html
sudo -u www-data php occ maintenance:install --database=mysql --database-host=localhost --database-name=nextcloud --database-user=nextcloud --database-pass=CHANGE_ME_DB_PASSWORD --admin-user=admin --admin-pass=CHANGE_ME_ADMIN_PASSWORD --data-dir=/mnt/nextcloud
sudo -u www-data php occ statuscron.php を systemd timer で実行する
Nextcloud の background jobs は cron 方式で実行します。systemd timer を使うと、5 分間隔の実行状態を systemd 側で確認できます。
sudo tee /etc/systemd/system/nextcloudcron.service >/dev/null <<'EOF'
[Unit]
Description=Nextcloud cron.php job
[Service]
User=www-data
ExecCondition=/usr/bin/php -f /var/www/html/occ status -e
ExecStart=/usr/bin/php -f /var/www/html/cron.php
KillMode=process
EOF
sudo tee /etc/systemd/system/nextcloudcron.timer >/dev/null <<'EOF'
[Unit]
Description=Run Nextcloud cron.php every 5min
[Timer]
OnBootSec=5min
OnUnitActiveSec=5min
Unit=nextcloudcron.service
[Install]
WantedBy=timers.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now nextcloudcron.timer
systemctl status nextcloudcron.timer --no-pager動作確認の見方
初期構築後は、Web 応答、PHP-FPM socket、database 接続、data directory、cron timer を分けて確認します。Nextcloud の画面が表示されても、cron や data directory の権限が未確認だと運用中に問題になります。
curl -I https://nextcloud.example.com/status.php
sudo -u www-data php /var/www/html/occ status
sudo -u www-data php /var/www/html/occ background:cron
systemctl list-timers nextcloudcron.timer --no-pager
ls -ld /mnt/nextcloud /var/www/htmlnginx -tとphp-fpm8.5 -tが通るか- Nginx から PHP-FPM socket に接続できるか
- MariaDB database と user が作成されているか
/mnt/nextcloudが document root の外にあり、www-dataが扱えるかnextcloudcron.timerが有効か
まとめ
Nextcloud base は、Nginx、PHP-FPM、MariaDB、Redis、data directory、cron をそろえて初めて土台になります。単に Nextcloud の zip を展開するだけではなく、PHP 実行環境、Web server、database、ファイル保存先、background jobs の責任範囲を分けて確認することが大切です。
この土台ができたら、次は config.php、trusted domains、overwrite settings、Redis lock、mail、maintenance window、アプリ設定などを Nextcloud 設定編で確認します。

